Java Android环境下基于OpenCvLib320的SVM训练与预测

Java Android环境下基于OpenCvLib320的SVM训练与预测,java,opencv,android-studio,svm,knn,Java,Opencv,Android Studio,Svm,Knn,我使用的是带有OpenCV sdk 3.2版本的Android studio。 我正在尝试使用SVM可用的现成API进行训练 我的部分代码从手机内存中检索图像,并帮助使用SVM进行训练 File mnist_images_file = new File(path); FileInputStream images_reader = new FileInputStream(mnist_images_file); Mat training_images = null;

我使用的是带有OpenCV sdk 3.2版本的Android studio。 我正在尝试使用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);
File mnist\u images\u File=新文件(路径);
FileInputStream images\u reader=新的FileInputStream(mnist\u images\u文件);
Mat training_images=null;
试一试{
...
训练图像=新Mat(总图像、像素计数、CvType.CV 8U);
对于(int i=0;i
我正在尝试使用设备中已存在的可用数据集(以图像形式)进行训练。但调用此训练()会产生以下错误:

03-01 17:10:24.359 12035-12035/com.example.vankit.knexample E/cv::error():OpenCV error:void cv::ml::SVMImpl::checkParams(),file/home/maksim/workspace/android pack/OpenCV/modules/ml/src/svm.cpp,第1302行,其中一个参数的值超出范围(内核参数必须为正) 03-01 17:10:24.361 12035-12035/com.example.vankit.knexample E/org.opencv.ml:ml::train_10()捕获的cv::Exception:/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.knexample E E/AndroidRuntime:FATAL EXCEPTION:main


你能给我一个解决方法吗?

我不知道这个问题是否仍然存在,但据我所知,最新版本的OpenCV(我的意思是3.0+)中的SVM模块在使用线性内核以外的其他内核时工作得并不完美。可以尝试使用线性内核,或者将OpenCV的版本更改为2.4.13.2(最新版本的2+)看看你有没有遇到什么问题


另外,我会发表评论,但由于我的声誉,我不能这样做…

我正在用JAVA实现这一点