2012-02-29 209 views
9

有沒有人碰巧知道爲什麼OpenCV 2 DescriptorMatcher::radiusMatch()knnMatch()需要vector<vector<DMatch>>& matches?我對它爲什麼不只是一個向量有點困惑,因爲它只是場景中與訓練圖像對應的單個點陣列,對吧?OpenCV DescriptorMatcher radiusMatch和knnMatch結果格式

我有這樣的事情:

void getMatchingPoints(
    const vector<vector<cv::DMatch> >& matches, 
    const vector<cv::KeyPoint>& keyPtsTemplates, 
    const vector<cv::KeyPoint>& keyPtsScene, 
    vector<Vec2f>& ptsTemplate, 
    vector<Vec2f>& ptsScene 
    ) 
{ 
    ptsTemplate.clear(); 
    ptsScene.clear(); 

    for (size_t k = 0; k < matches.size(); k++) 
    { 
     for (size_t i = 0; i < matches[k].size(); i++) 
     { 
      const cv::DMatch& match = matches[k][i]; 
      ptsScene.push_back(fromOcv(keyPtsScene[match.queryIdx].pt)); 
      ptsTemplate.push_back(fromOcv(keyPtsTemplates[match.trainIdx].pt)); 
     } 
    } 
} 

,但我有點困惑如何實際映射約。對象的位置一旦我將它們全部放入ptsScene。當我繪製它們時,這些點似乎分散給我,所以我想我錯過了嵌套向量代表的東西。

回答

23

knnMatch函數將返回k近鄰相匹配,也就是說,如果你調用knnMatch(queryDescriptors, trainDescriptors, matchesQueryToTrain, 3)其中在這種情況下k=3,然後爲每個培訓點時,會發現從查詢集的3個最佳匹配。

在你vector<vector<DMatch>>而言,這意味着外vector是每個查詢 - >列車匹配的矢量,並且內vector是你最近的k匹配的矢量。

有一個很好的例子,如何使用這些k匹配以及this其他問題的交叉檢查方法。

如果要簡單的1-1匹配,那麼可以調用knnMatch其中k = 1,這將返回尺寸1的內矢量,或只是調用match與沒有第二矢量輸出形式vector<DMatch>匹配。

+1

非常徹底,非常感謝! – 2012-03-01 23:19:01