有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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) 个答案