SVM训练和预测在Android中使用OpenCvLib320

时间:2017-03-01 11:59:53

标签: java opencv android-studio svm knn

我正在使用Android Studio和OpenCV sdk 3.2版本。 我正在尝试使用可用于SVM的现成API进行培训

我的部分代码从手机的内存中检索图像,并有助于使用SVM进行训练

    File mnist_images_file = new File(path);
    FileInputStream images_reader = new FileInputStream(mnist_images_file);

    Mat training_images = null;
    try {
        ...
        training_images = new Mat(total_images, px_count, CvType.CV_8U);
        for (int i = 0; i < total_images; i++) {
            byte[] image = new byte[px_count];
            images_reader.read(image, 0, px_count);
            training_images.put(i, 0, image);
        }
        training_images.convertTo(training_images,
                CvType.CV_32FC1);
        //Read Labels
        Mat training_labels = null;
        byte[] labels_data = new byte[total_images];

        File mnist_labels_file = new File(labels_path);
        FileInputStream labels_reader = new
                FileInputStream(mnist_labels_file);

        try{
            training_labels = new Mat(total_images, 1,
                    CvType.CV_8U);
            Mat temp_labels = new Mat(1, total_images,
                    CvType.CV_8U);
            header = new byte[8];
            //Read the header
            labels_reader.read(header, 0, 8);

            //Read all the labels at once
            labels_reader.read(labels_data,0,total_images);
            temp_labels.put(0,0, labels_data);

            //Take a transpose of the image
            Core.transpose(temp_labels, training_labels);
            training_labels.convertTo(training_labels,
                    CvType.CV_32FC1);
            labels_reader.close();
        }

        catch (IOException e)
        {
            Log.i("MNIST Read Error:", "" + e.getMessage());
        }

        images_reader.close();

        SVM svm = SVM.create();
        svm.setType(SVM.C_SVC);
        svm.setKernel(SVM.POLY);
        svm.setGamma(3);
        svm.train(training_images, Ml.ROW_SAMPLE,training_labels);

我正在尝试使用已经以图像形式存在于设备中的可用数据集进行训练。但是调用这列火车()会给我以下错误:

03-01 17:10:24.359 12035-12035 / com.example.vankit.knnexample E / cv :: error():OpenCV错误:参数之一的值超出范围(内核参数必须为正数) )in void cv :: ml :: SVMImpl :: checkParams(),file /home/maksim/workspace/android-pack/opencv/modules/ml/src/svm.cpp,line 1302 03-01 17:10:24.361 12035-12035 / com.example.vankit.knnexample E / org.opencv.ml:ml :: train_10()抓住了cv ::异常:/ home / maksim / workspace / android-pack / opencv / modules / ml / src / svm.cpp:1302:错误:(-211)函数void cv :: ml :: SVMImpl :: checkParams()中的内核参数必须为正数 03-01 17:10:24.362 12035-12035 / com.example.vankit.knnexample E / AndroidRuntime:FATAL EXCEPTION:main

你能为此提出建议吗?

1 个答案:

答案 0 :(得分:0)

我不知道这个问题是否仍然是最新的,但据我所知,最新版本的OpenCV(我的意思是3.0+)中的SVM模块在使用除LINEAR之外的其他内核时效果不佳。尝试使用线性内核,或将opencv的版本更改为2.4.13.2(最新的2+)并查看是否遇到任何问题。

P.S。我会评论,但由于我的声誉,我不能这样做......