opencv svm使用時遇到的問題

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章