[英]opencv java SVM api nullPointException
This is the question, I don't know how to handle it. 这是问题,我不知道如何处理。 The problem line is in svm.trainAuto(param1,....)
. 问题行在svm.trainAuto(param1,....)
。 I read 400 imgs and stored in trainningSet
(200 has car plate and 200 not), and their labels stored in classes, I wanna train a SVM model but trainAuto
method catch an exception. 我读了400个IMGS并存储在trainningSet
(200汽车板和200没有),并存储在班它们的标签,我想训练一个SVM模型,但trainAuto
方法捕获异常。 The trainningData and clusses is not null, i already checked, trainningData和clusses不为null,我已经检查过了,
package com.xjtu.svm;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import org.opencv.core.Core;
import org.opencv.core.CvType;
import org.opencv.core.Mat;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.ml.Ml;
import org.opencv.ml.SVM;
public class ReadInPlate {
private final static int amount=200;
private static int width;
private static int height;
/**
* @param hasPlate
* @param label
*/
public static void readInPlateImg(Mat mat, List<Byte>label) {
String path="E:/HasPlate";
File file=new File(path);
File[] fileArray=file.listFiles();
if(fileArray.length==0) {
System.out.println("empty file");
}
for(int i=0; i<amount; i++) {
path=fileArray[i].getAbsolutePath();
Mat tmp=Imgcodecs.imread(path);
width=tmp.cols();
height=tmp.rows();
Mat feature=Feature.extractFeature(tmp);
mat.push_back(feature);
label.add((byte)1);
}
}
/**
* @param noPlate
* @param label
*/
public static void readInNoPlateImg(Mat mat, List<Byte>label) {
String path="E:/NoPlate";
File file=new File(path);
File[] fileArray=file.listFiles();
if(fileArray.length==0) {
System.out.println("empty file");
}
for(int i=0; i<amount; i++) {
path=fileArray[i].getAbsolutePath();
Mat tmp=Imgcodecs.imread(path);
Mat feature=Feature.extractFeature(tmp);
mat.push_back(feature);
label.add((byte)0);
}
}
public static void main(String []args) {
System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
List<Byte> label=new ArrayList<Byte>();
Mat trainningSet=new Mat();
Mat trainningData=new Mat();
Mat classes=new Mat(2*amount, 1, CvType.CV_8UC1);
Mat clusses=new Mat();
readInPlateImg(trainningSet, label);
readInNoPlateImg(trainningSet, label);
trainningSet.convertTo(trainningData, CvType.CV_32F);
for(int i=0; i<label.size(); i++) {
byte[] t=new byte[1];
t[0]=label.get(i);
classes.put(i, 0, t);
}
classes.convertTo(clusses, CvType.CV_32F);
SVM svm =SVM.create();
svm.setType(SVM.C_SVC);
svm.setKernel(SVM.LINEAR);
svm.setDegree(0.1);
svm.setGamma(1);
svm.setCoef0(0);
svm.setC(1);
System.out.println("trainningDataType: "+CvType.typeToString(trainningData.type()));
System.out.println("classesType: "+CvType.typeToString(clusses.type()));
System.out.println(trainningData.rows()==clusses.rows());
*svm.trainAuto(trainningData, //exception catched in this line
Ml.ROW_SAMPLE,
clusses,
10,
SVM.getDefaultGridPtr(SVM.C),
SVM.getDefaultGridPtr(SVM.GAMMA),
SVM.getDefaultGridPtr(SVM.P),
SVM.getDefaultGridPtr(SVM.NU),
SVM.getDefaultGridPtr(SVM.COEF),
SVM.getDefaultGridPtr(SVM.DEGREE),
true);*
System.out.println("classes.size(): "+classes.rows()+", "+classes.cols());
System.out.println(label.size()+", "+trainningSet.rows()+", "+trainningSet.cols());
}
} }
Exception in thread "main" java.lang.Exception: unknown exception
at org.opencv.ml.SVM.trainAuto_0(Native Method)
at org.opencv.ml.SVM.trainAuto(SVM.java:145)
at com.xjtu.svm.ReadInPlate.main(ReadInPlate.java:106)
The main problem is the data format, opencv SVM requested CvType.CV_32FC1(float) for trainning data and CvType.CV_32SC1(int) for data's label, so the data format should satisfied opencv's request, and change trainningSet.converTo(trainningData, CvType.CV_32FC1) , classes.convertTo(clusses, CvType.CV_32SC1); 主要问题是数据格式,opencv SVM请求CvType.CV_32FC1(float)用于训练数据,而CvType.CV_32SC1(int)用于数据标签,因此数据格式应满足opencv的要求,并更改trainningSet.converTo(trainningData,CvType。 CV_32FC1) , classes.convertTo(clusses,CvType.CV_32SC1); , then it should work. ,那么它应该可以工作。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.