OpenCV DescriptorMatcher radiusMatch和knnMatch结果格式

Jos*_*ble 9 c++ opencv computer-vision

有谁碰巧知道为什么OpenCV 2 DescriptorMatcher::radiusMatch()并knnMatch()采取vector<vector<DMatch>>& matches?我有点困惑为什么它不仅仅是一个矢量,因为它只是场景中与训练图像相对应的单个点阵,对吧?

我有这样的事情:

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));
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

但我对如何实际映射大约有点困惑.一旦我将它们全部放入,对象的位置ptsScene.当我绘制它们时,这些点似乎散落在我身上,所以我想我错过了嵌套向量所代表的含义.

Chr*_*ris 24

该knnMatch函数将返回k最近邻居匹配,即如果你knnMatch(queryDescriptors, trainDescriptors, matchesQueryToTrain, 3)在这种情况下调用k=3,那么对于每个训练点,它将从查询集中找到3个最佳匹配.

就你而言vector<vector<DMatch>>,这意味着外部vector是每个查询 - >火车匹配vector的向量,而内部是k最近匹配的向量.

还有就是如何使用这些相当一个很好的例子k连同交叉检查方法在比赛中这个其他问题.

如果你想要一个简单的1-1匹配,那么你可以调用k = 1的knnMatch,它将返回一个大小为1的内部向量,或者只调用match哪个输出匹配的形式vector<DMatch>没有第二个向量.