有谁碰巧知道为什么OpenCV 2 DescriptorMatcher::radiusMatch()knnMatch()采用vector<vector<DMatch>>& matches?我对为什么它不只是 vector 感到有些困惑,因为它只是场景中与训练图像相对应的单点阵列,对吗?

我有这样的事情:

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中,就可以确定对象的位置。当我刚绘制它们时,这些点在我看来似乎分散了,所以我想我错过了嵌套 vector 所代表的意思。

最佳答案

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

就您的vector<vector<DMatch>>而言,这意味着外部vector是每个query-> train匹配的 vector ,而内部vector是您的k最接近的匹配的 vector 。

有一个很好的例子,说明如何使用这些k匹配项以及this其他问题中的交叉检查方法。

如果要进行简单的1-1匹配,则可以使用k = 1调用knnMatch,这将返回大小为1的内部 vector ,或者仅调用match,其输出形式为vector<DMatch>而没有第二个 vector 。

关于c++ - OpenCV DescriptorMatcher radiusMatch和knnMatch结果格式,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9507545/

10-11 22:54
查看更多