OpenCV 3 and SVM training

OpenCV 3 and SVM training

本文关键字:training SVM and OpenCV      更新时间:2023-10-16

我已经搜索了这种类型的错误,但没有找到类似的东西......

我的问题与opencv3和SVM有关。基本上,我有这个:

int labels[2] = {1, -1};
Mat labelsMat(2, 1, CV_32S, labels);
float trainingData[2][2] = { { 501, 10 }, { 255, 10 } };
Mat training_samples(2, 2, CV_64FC1, trainingData);
...
training_samples.convertTo(training_samples, CV_32S);
labelsMat.convertTo(labelsMat, CV_32F);
Ptr<ml::SVM> svm = ml::SVM::create();
svm->setType(ml::SVM::C_SVC);
svm->setKernel(ml::SVM::LINEAR);
svm->setC(1); 
svm->train(training_samples, ml::SampleTypes::ROW_SAMPLE, labelsMat);

编译时,出现此错误:

OpenCV 错误:错误的参数(在分类问题的情况下,响应必须是分类的;要么在创建 TrainData 时指定 varType,要么传递整数响应(在训练中,文件/home/develop/_Morpheos/opencv/opencv/modules/ml/src/svm.cpp,第 1618 行在抛出 'cv::Exception' 的实例后终止 what((:/home/develop/_Morpheos/opencv/opencv/modules/ml/src/svm.cpp:1618: 错误:(-5(在分类问题的情况下,响应必须是分类的;在创建 TrainData 时指定 varType,或者在函数训练中传递整数响应

我几乎尝试了所有方法,但没有发现错误。

你能帮我吗?

CV_64F表示double,但你需要float,即 CV_32F .用:

// Change me!
Mat training_samples(2, 2, CV_32FC1, trainingData);

此外,无需转换为整数类型,因此您可以删除该行:

// Remove me!
training_samples.convertTo(training_samples, CV_32S);

标签在分类中应该是整数类型,因此还要删除:

// Remove me!
labelsMat.convertTo(labelsMat, CV_32F);

您可以在此处查看完整示例。