我已经搜索过这种类型的错误,但我找不到类似的东西......
我的问题与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,或传递整数响应)在train,home / home / develop / _Morpheos / opencv / opencv / modules / ml / src / svm.cpp,第1618行终止在抛出&#39; cv :: Exception&#39;的实例后被调用what():/ home /develop/_Morpheos/opencv/opencv/modules/ml/src/svm.cpp:1618:错误:( - 5)在分类问题的情况下,响应必须是分类的;在创建TrainData时指定varType,或在函数列中传递整数响应
我几乎尝试了一切,但我没有发现错误。
你能帮帮我吗?
答案 0 :(得分:1)
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);
您可以查看here以获取完整示例。