2014-01-27 141 views
1

我有兩個向量,我想將它們轉換爲Mat文件以便使用opencv的SVM訓練。我得到的向量是一個列車數據矢量和一個標籤矢量。怎麼可能將它們轉換成需要的類型從svmtrain去??/將mat矢量轉換爲mat文件以便使用opencv svm

for(int i=0; i<face.size();i++){ 
     img = imread("faceNface/face/"+face.at(i),1); 
     cvtColor(img, img, CV_BGR2GRAY); 
     img = img.reshape(1, 12100).t(); 
     trainData.push_back(img); 
     lbs.push_back(1); 
    } 

    for(int i=0; i<non_face.size();i++){ 
     img = imread("faceNface/nonface/"+non_face.at(i), 1); 
     cvtColor(img, img, CV_BGR2GRAY); 
     img = img.reshape(1, 12100).t(); 
     trainData.push_back(img); 
     lbs.push_back(-1); 
    } 

回答

4

如果您的標籤矢量型std::vector<double>那麼你可以使用下面的函數。如果不是,你需要做一些改變。我相信你可以弄明白。

cv::Mat Classifier::vectorToMat(std::vector<double> data) 
{ 
    int size = data.size(); 
    cv::Mat mat(size, 1, CV_32F); 
    for(int i = 0; i < size; ++i) 
    { 
     mat.at<float>(i, 0) = data[i]; 
    } 
    return mat; 
} 

對於數據本身,我有兩個建議給你;

1)將您1x12100大小的圖像std::vector<double>,那麼你將有std::vector<std::vector<double>>trainData,那麼你可以使用下面的函數。

cv::Mat Classifier::vectorToMat(std::vector<std::vector<double> > data) 
{ 
    int height = data.size(); 
    std::vector<double> vectorData = data[0]; 
    int width = vectorData.size(); 

    cv::Mat mat(height, width, CV_32F); 
    for(int i = 0; i < height; ++i) 
    { 
     for(int j = 0; j < width; ++j) 
     { 
      mat.at<float>(i,j) = data[i][j]; 
     } 
    } 
    return mat; 
} 

2)修改,我貼有std::vector<cv::Mat>做同樣的操作的代碼。其實這樣做更好,因爲如果你這樣做的話,你不需要首先將cv::Mat轉換爲std::vector<double>,並且可以做更少的操作。

希望它有幫助。