opencv svm训练java,如何基于一组图像使用opencv训练SVM?

I have a folder of positives and another of negatives images in JPG format, and I want to train an SVM based on that images, I've done the following but I receive an error:

Mat classes = new Mat();

Mat trainingData = new Mat();

Mat trainingImages = new Mat();

Mat trainingLabels = new Mat();

CvSVM clasificador;

for (File file : new File(path + "positives/").listFiles()) {

Mat img = Highgui.imread(file.getAbsolutePath());

img.reshape(1, 1);

trainingImages.push_back(img);

trainingLabels.push_back(Mat.ones(new Size(1, 1), CvType.CV_32FC1));

}

for (File file : new File(path + "negatives/").listFiles()) {

Mat img = Highgui.imread(file.getAbsolutePath());

img.reshape(1, 1);

trainingImages.push_back(img);

trainingLabels.push_back(Mat.zeros(new Size(1, 1), CvType.CV_32FC1));

}

trainingImages.copyTo(trainingData);

trainingData.convertTo(trainingData, CvType.CV_32FC1);

trainingLabels.copyTo(classes);

CvSVMParams params = new CvSVMParams();

params.set_kernel_type(CvSVM.LINEAR);

clasificador = new CvSVM(trainingData, classes, new Mat(), new Mat(), params);

When I try to run that I obtain:

OpenCV Error: Bad argument (train data must be floating-point matrix) in cvCheckTrainData, file ..\..\..\src\opencv\modules\ml\src\inner_functions.cpp, line 857

Exception in thread "main" CvException [org.opencv.core.CvException: ..\..\..\src\opencv\modules\ml\src\inner_functions.cpp:857: error: (-5) train data must be floating-point matrix in function cvCheckTrainData

]

at org.opencv.ml.CvSVM.CvSVM_1(Native Method)

at org.opencv.ml.CvSVM.(CvSVM.java:80)

I can't manage to train the SVM, any idea? Thanks

解决方案

Assuming that you know what you are doing by reshaping an image and using it to train SVM, the most probable cause of this is that your

Mat img = Highgui.imread(file.getAbsolutePath());

fails to actually read an image, generating a matrix img with null data property, which will eventually trigger the following in the OpenCV code:

// check parameter types and sizes

if( !CV_IS_MAT(train_data) || CV_MAT_TYPE(train_data->type) != CV_32FC1 )

CV_ERROR( CV_StsBadArg, "train data must be floating-point matrix" );

Basically train_data fails the first condition (being a valid matrix) rather than failing the second condition (being of type CV_32FC1).

In addition, even though reshape works on the *this object, it acts like a filter and its effect is not permanent. If it's used in a single statement without immediately being used or assigned to another variable it will be useless. Change the following lines in your code:

img.reshape(1, 1);

trainingImages.push_back(img);

to:

trainingImages.push_back(img.reshape(1, 1));

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值