1、CvSVM中的数据type问题
在opencv中使用CvSVM时,需注意:
CV_WRAP virtual bool train( const cv::Mat& trainData, const cv::Mat& responses,
const cv::Mat& varIdx=cv::Mat(), const cv::Mat& sampleIdx=cv::Mat(),
CvSVMParams params=CvSVMParams() );
CV_WRAP virtual float predict( const cv::Mat& sample, bool returnDFVal=false ) const;
train()中trainData 和predict()中的sample 的Mat.type类型需保持一致,并要求为float类型,设置type=CV_32FC1;(opencv给出的例子也是如此设置的)
2、 Vector<Mat>转为Mat
一般通过特征提取方法得到的特征都为Vector<Mat>类型,如何转换为 Mat类型呢?
以EigenFace获得的特征为例,具体方法请见下:
vector<Mat> vAllImages;
vector<Mat> vEigenProjections = eigenModel->getMatVector("projections");
Mat svmTrainDat = Mat(vAllImages.size(), vEigenProjections[0].cols, CV_32FC1);
for (int i=0;i<vAllImages.size(); i++)
{
Mat m = svmTrainDat.row(i);
Mat temp;
Mat(vEigenProjections[i]).assignTo(temp, CV_32FC1);
temp.copyTo(m);
}
其中要注意:vector<Mat> vEigenProjections 中的flags需先转换为目标svmTrainDat 的type,如此才能将数据正常写入svmTrainDat 中;否则svmTrainDat 中的data将为无效值。