当前位置:C++技术网 > 资讯 > opencv编程:3 使用svm的一个简单示例

opencv编程:3 使用svm的一个简单示例

更新时间:2016-01-17 23:52:51浏览次数:1+次

  在opencv中有svm的使用示例,看了一下,没有什么具体的讲解,所以自己写一个小例子,介绍下在opencv中使用svm进行训练与预测时,数据的处理。

  代码:

float bage[2][6]={{-0.38206,1.29741,0.767442,0.976744,0.963455,0.860465},
                      {-0.832143,1.25561,0.803571,0.957143,0.982143,0.925}};  //训练数据
float labels[2]={1.0,-1.0};   //类别标号
int respon[2];     //存取预测结果
      //数据转换为Mat类型
Mat trainDataMat(2,6,CV_32FC1,bage);     //训练数据
Mat labelsMat(2,1,CV_32FC1,labels);         //类别标号
Mat preDataMat(2,6,CV_32FC1,bage);      //预测数据,这里预测数据用的是训练数据
//SVM参数
CvSVMParams params;
params.svm_type  = CvSVM::C_SVC;
params.kernel_type = CvSVM::LINEAR;
params.term_crit  = cvTermCriteria(CV_TERMCRIT_ITER,100,0.000001);

//训练
CvSVM SVM;
SVM.train(trainDataMat,labelsMat,Mat(),Mat(),params);

//测试
for(i=0;i<2;i++)
     respon[i]=SVM.predict(preDataMat.row(i));

   示例中的训练数据只用了两条记录,每条记录有六个数据。

   opencv的svm使用的数据类型都是Mat型的,所以我们的训练数据和预测数据都要转换为Mat型的,包括类别标号也要进行转换。数据的转换方式以及svm的参数意义这里不做解释。

  容易出问题的是在预测时。在使用predict方法时,很容易受训练时为train传递参数的影响,将预测数据数组作为参数传递给predict,这样就会出现不容易找到原因的问题。predict方法的参数是一条记录,也就是存放预测数据的二维数组的一行数据。可以使用程序中使用的Mat类自带的取一行数据的方法,也可以在预测时将每一行的预测数据单独转换为一个Mat型。可以这样理解,在做分类的时候,每产生一条记录,传递给predict预测一下,而不是多条记录。