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”