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將爲無效值。