现在的位置: 首页 > 综合 > 正文

学习笔记–bag of words(2)–svm

2013年08月10日 ⁄ 综合 ⁄ 共 1494字 ⁄ 字号 评论关闭

2011.3.25 bag of words中结果的图形化以及用训练结果做测试。

先来看看opencv2.2中svm的使用,还是以(1)中的例子来看。

 

 //init数据
 float fdata[25]={0.608,-1.590,0.235,3.949,-2.249,2.704,-2.473,0.672,0.262,1.072,-1.773,0.537,3.240,2.400,-2.499,2.608,-3.458,0.257,2.569,1.415,1.410,-2.653,1.396,3.286,-0.712};
 cv::Mat data=cv::Mat(25,1,CV_32FC1,fdata);
 float fbestLabels[25]={1,0,1,1,0,1,0,1,1,1,0,1,1,1,0,1,0,1,1,1,1,0,1,1,0};
 cv::Mat bestLabels=cv::Mat(25,1,CV_32FC1,fbestLabels);
 int k=2;
 CvMat mdata=data; //Cvmat 是一个结构,cv::mat是一个类,为啥可以这么赋值不是很明白,

                                  //不过opencv的源码中都是这么写的。应该是指针的好处吧
 CvMat mbestLabels=bestLabels;
 cv::SVMParams svmParams=cv::SVMParams(CvSVM::C_SVC, CvSVM::RBF,CvSVM::DEGREE,CvSVM::GAMMA,CvSVM::COEF,2,CvSVM::NU, 0.0001, NULL,cvTermCriteria(CV_TERMCRIT_EPS, 100, 0.0001));// svm参数中Cvalue不知道是什么意思猜测是类的个数,所以填了个2
 cv::SVM svm;
 svm.train(&mdata,&mbestLabels,0,0,svmParams); //如果用train_auto方法就可以用cv::mat代替cvmat了。04.12
 //构建测试数据
 float tdata[1]={-0.708};
 cv::Mat ttdata=cv::Mat(1,1,CV_32FC1,tdata);
 CvMat mttdata=ttdata;
 float result=svm.predict(&mttdata);//如果要对一组数据进行测试,也只能一个向量一个向量的调用predict方法?

                                                        //同样的,predict有3种形式,但只支持cvmat的输入,其实最好的应该是cv::mat嘛
 
 printf("f%",result);
 return 0;

 

 

 

 

补充:按照智能提示输入svm.train()的参数时老提示通不过,发现train有2种格式,其中一个是需要swig支持的。貌似在vs c++里得花点时间才能用。先跳过。

 

需要swig支持,但是看到opencv的change log说SWIG-based Python wrappers are not included anymore.

 

 

 

不支持cv::Mat

 

可以轻松的把CvMat 转化成cv::mat,通过cv::mat(Cvmat *data),反过来也很便捷直接赋值就可以了。(参考svm.cpp,第一个方法其实就是封装了第2个方法,直接赋值的。)

cv::mat用起来显然比CvMat方便。 

 

 

抱歉!评论已关闭.