OpenCv3.0+SVM的使用心得(一)

来源:互联网 发布:网络视频监控方案 编辑:程序博客网 时间:2024/06/04 19:26

1.open cv3.0版本中没有了CvSVM类的定义,而是将其写入到一个document中,但是使用也并不复杂,代码示例如下:

ml::SVM::Params params;params.svmType = ml::SVM::C_SVC;params.kernelType = ml::SVM::POLY;params.gamma = 3;Ptr<ml::SVM> svm = ml::SVM::create(params);Mat trainData; // 每行为一个样本Mat labels;    svm->train( trainData , ml::ROW_SAMPLE , labels );// ...Mat query; // 输入, 1个通道Mat res;   // 输出svm->predict(query, res);

另外,svm的定义和训练可以写到一起:

Ptr<SVM> svm=StatModel::train<SVM>(trainData,ml::ROW_SAMPLE,labels,params)

2.使用statModel::train(针对所有的机器学习 )的时候,要注意里面的参数(训练样本、训练标签)格式为InputArray,这个格式可以从Mat格式自动生成,但是不能从CvMat格式生成。

3.因此,必要的时候要进行两者的转换。当CvMat->Mat时:

Mat Matfeatures=cv::cvarrToMat(CvMatFeatures)

PS: 从IplImage格式转成Mat格式时也是调用此函数,从Mat转到IplImage格式时:

Mat mat=&IplImage(img);//其中img是IplImage格式数据

不知道这个方法对从Mat到CvMat的转换是否同样适用(估计是可以的)

4.由于3.0不存在为机器学习定义的类,因此不能用调用函数的方法对分类器进行操作,而代之使用:

svm->save("....");//文件形式为xml,可以保存在txt或者xml文件中svm->getVarCount();//获取SVM支持向量的维数svm->getSupportVectors;//返回Mat类型,获取SVM的支持向量

5.可以对保存在xml或txt文件中的分类器进行加载。

Ptr<SVM> svm=statModel::load<SVM>("....");

6.在编写程序过程中,使用hog.compute()计算会报内存错误,折磨了一整天,最后将“项目属性”-“链接器”-“输入”中的”附加依赖项”中的ts300.lib和world300.lib删除掉了,只保留ts300d.lib和world300d.lib。具体原因,不详。

7.遇到”error LNK2019: unresolved external symbol __imp___CrtDbgReportW referenced in function “public: double & __thiscall std::vector…..”这种错误时,需要将” C/C++”->”代码生成”的运行库由 “多线程调试(/MTd)” 改为“多线程调试DLL (/MDd)”

8.构建字符串时有时需要将“1,2,3……23,24,25…….”显示成为“001,002,003…..023,024”,可使用’%3d’,如:

spintf(neName,"person_%3d.bmp",i);

9.使用OpenCv里面的机器学习算法时,要保证给的labelData的数据格式为”有符号的整型数”,”CV_32FC1”就是错误的一种形式,应该使用”CV_32SC1”

1 0
原创粉丝点击