java中的安卓 Opencv SVM未正确训练
请帮帮我。我正在尝试创建Android应用程序来检测答案表中的冒泡答案。我使用的是Opencv 3.4,面临的问题是:Opencv SVM训练不正确,因为训练时间很短(有些秒)。这是我的密码:
private static Mat trainingMat;
private static Mat trainingLabels;
private static SVM clasificador;
private static int img_area = 50 * 70;
private static int negativo_size = 520;
private static int positivo_size = 349;
private static int file_count = 0;
public static void main(String[] args) {
System.load("E:/Android/opencv/build/java/x64/opencv_java340.dll");
trainingMat = new Mat(negativo_size + positivo_size, img_area, CvType.CV_32FC1);
trainingLabels = new Mat(negativo_size + positivo_size, 1, CvType.CV_32S);
trainingLabels = new Mat();
clasificador = SVM.create();
trainPositive();
trainNegative();
train();
test();
}
private static void test() {
SVM svm = SVM.load(new File(XML).getAbsolutePath());
Mat in = getMat(FILE_TEST);
in.reshape(1);
Mat out = new Mat(1, img_area, CvType.CV_32FC1);
int ii = 0;
for (int i = 0; i < in.rows(); i++) {
for (int j = 0; j < in.cols(); j++) {
out.put(1, ii, in.get(i, j));
ii++;
}
}
System.out.println("prediction is:" + svm.predict(out));
}
private static void train() {
clasificador.setType(SVM.C_SVC);
clasificador.setKernel(SVM.POLY);
clasificador.setGamma(3);
clasificador.setDegree(3);
clasificador.train(trainingMat, Ml.ROW_SAMPLE, trainingLabels);
clasificador.save(XML);
}
private static void trainPositive() {
for (File file : new File(PATH_POSITIVE).listFiles()) {
Mat img = getMat(file.getAbsolutePath());
img.reshape(1);
int ii = 0;
for (int i = 0; i < img.rows(); i++) {
for (int j = 0; j < img.cols(); j++) {
trainingMat.put(file_count, ii, img.get(i, j));
ii++;
}
}
file_count++;
}
}
private static void trainNegative() {
for (File file : new File(PATH_NEGATIVE).listFiles()) {
Mat img = getMat(file.getAbsolutePath());
img.reshape(1);
int ii = 0;
for (int i = 0; i < img.rows(); i++) {
for (int j = 0; j < img.cols(); j++) {
trainingMat.put(file_count, ii, img.get(i, j));
ii++;
}
}
file_count++;
}
trainingLabels.rowRange(0,positivo_size-1).setTo(new Scalar(1.0));
trainingLabels.rowRange(positivo_size,positivo_size+negativo_size -1).setTo(new Scalar(-1.0));
}
private static Mat getMat(String path) {
Mat img = new Mat();
Mat con = Imgcodecs.imread(path, Imgcodecs.CV_LOAD_IMAGE_GRAYSCALE);
con.convertTo(img, CvType.CV_32FC1, 1.0 / 255.0);
return img;
}
当我编译这段代码时,SVM预测总是返回1.0。发生了什么? 更多详情: Opencv版本3.4 输入图像大小50*70 负片图像计数=520 正图像计数=349
共 (0) 个答案