opencv svm 疑问求助
请教各位大侠:
我用opencv(3.0版)的SVM进行分类时,svm->(traindata, ROW_SAMPLE, labels)函数进行分类时,traindata的数据格式必须是CV_32FC1,且labels的数据格式为CV_32SC1,换成其他数据格式,则运行错误,这是为什么?此外,数据格式按照上面的要求定义后,为什么使用response=svm->predict(testMat)进行分类时,response的值往往不是预期的类型,而是绝对值很大的整数或负数,如1.07794e+009,跪求解答。全部代码如下所示:
#include <string.h>
#include<string>
#include<iostream>
#include<opencv2/ml.hpp>
#include <opencv2/core/core.hpp>
using namespace std;
using namespace cv;
using namespace cv::ml;
int main(){
// step 1:
//训练数据的分类标记,即4类
float labels[16] = { 1.0, 1.0, 1.0, 1.0, 2.0, 2.0, 2.0, 2.0, 3.0, 3.0, 3.0, 3.0, 4.0, 4.0, 4.0, 4.0 };
Mat labelsMat = Mat(16, 1, CV_32SC1, labels);
//训练数据矩阵
float trainingData[16][2] = { { 0, 0 }, { 4, 1 }, { 4, 5 }, { -1, 6 }, { 3, 11 }, { -2, 10 }, { 4, 30 }, { 0, 25 }, { 10, 13 }, { 15, 12 }, { 25, 40 }, { 11, 35 }, { 8, 1 }, { 9, 6 }, { 15, 5 }, { 20, -1 } };
Mat trainingDataMat = Mat(16, 2, CV_32FC1, trainingData);
//------------设置支持向量机的参数---------------------
// opencv3.0
Ptr<ml::SVM> svm = ml::SVM::create();
svm->setType(SVM::C_SVC);
svm->setKernel(SVM::RBF);
svm->setC(100);
svm->setGamma(1);
svm->setTermCriteria(TermCriteria(TermCriteria::MAX_ITER, (int)1e7, 1e-6));//终止准则函数:当迭代次数达到最大值时终止
// -----训练-------
printf("n-----------------starting to train data by SVM----------------n"
;
svm->train(trainingDataMat, ROW_SAMPLE, labelsMat);
// step 4:
//使用训练所得模型对新样本进行分类测试
for (int i = -5; i<15; i++)
{
for (int j = -5; j<15; j++)
{
float a[] = { i, j };
Mat sampleMat = Mat(1, 2, CV_32FC1, a);
cout << "sampleMat = " << sampleMat << endl;
float response = svm->predict(sampleMat);
cout << response << " ";
}
cout << endl;
}
return 0;
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
这个例子是opencv自带的吗?可能opencv实现的SVM目前支持2类分类情况。