c++ - OpenCV DescriptorMatcher radiusMatch 和 knnMatch 结果格式

标签 c++ opencv computer-vision

有没有人碰巧知道为什么 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));
        }
    }
}

但我对如何实际绘制大约 map 感到有点困惑。对象的位置,一旦我将它们全部放在 ptsScene 中.当我刚刚绘制它们时,这些点对我来说似乎是分散的,所以我想我错过了嵌套 vector 所代表的内容。

最佳答案

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

根据你的vector<vector<DMatch>> ,这意味着外层 vector是每个query->train match的 vector ,内部vector是你的 vector k最近的比赛。

关于如何使用这些 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/

相关文章:

computer-vision - 查找形状中的线条

c++ - 不转义空字符的字符串文字

c++ - 执行策略与何时使用它们之间的区别

macos - 在Mac OS X Snow Leopard上编译OpenCV时出错: ‘Movie’未命名类型

image-processing - 背景减法将阴影标记为前景

opencv - 使用 opencv 从眼睛玩具网络摄像头流式传输视频时出现 HIGHGUI 错误

c++ - Opencv 人脸变形

c++ - 在哪里定义编译时常量?

python - OpenCV cv2.imshow()函数使用python 3继续在Jupyter Notebook中运行

python - OpenCV 的 calcOpticalFlowFarneback 的未知输出