2012-02-29 28 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