Java Android环境下基于OpenCvLib320的SVM训练与预测
我使用的是带有OpenCV sdk 3.2版本的Android studio。 我正在尝试使用SVM可用的现成API进行训练 我的部分代码从手机内存中检索图像,并帮助使用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;
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实现这一点