OpenCV DescriptorMatcher radiusMatch 和 knnMatch 结果格式

Posted

技术标签:

【中文标题】OpenCV DescriptorMatcher radiusMatch 和 knnMatch 结果格式【英文标题】:OpenCV DescriptorMatcher radiusMatch and knnMatch result format 【发布时间】:2012-02-29 22:19:04 【问题描述】:

有谁知道为什么 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));
        
    

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

【问题讨论】:

【参考方案1】:

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

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

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

如果您想要一个简单的 1-1 匹配,那么您可以使用 k=1 调用 knnMatch,这将返回一个大小为 1 的内部向量,或者只调用 match,它以 vector&lt;DMatch&gt; 的形式输出匹配,没有第二个向量。

【讨论】:

以上是关于OpenCV DescriptorMatcher radiusMatch 和 knnMatch 结果格式的主要内容,如果未能解决你的问题,请参考以下文章

特征检测和描述符提取有啥区别?

opencv 配置

OpenCV实战——OpenCV与图像处理

cmake错误:opencv2/opencv.hpp:opencv2/opencv.hpp:没有这样的文件或目录

opencv相机标定

opencv4opencv视频教程 C++(opencv教程)1opencv介绍和环境搭建