【问题标题】:how to access best image corresponding to best keypoint match using opencv flannbasedmatcher and dmatch如何使用opencv flannbasedmatcher和dmatch访问与最佳关键点匹配对应的最佳图像
【发布时间】:2012-05-01 07:22:00
【问题描述】:

我有一个关于之前提出的问题的后续问题:

How to use flann based matcher, or generally flann in opencv?

特别是关于这部分答案:

/* for kk=1 to matches.size()

       the best match for queryKeypoints[matches[kk].queryIdx].pt 
       is dbKeypoints[matches[kk].imgIdx][matches[kk].trainIdx].pt
 */

我的问题如下:是否可以使用 opencv 的 flannbasedmatcher match() 函数和 dmatch 结构访问从中找到最佳匹配关键点(最短距离)的图像,如果可以,如何去做这个?

具体来说,在将查询图像与一组图像进行比较时如何做到这一点?在这种情况下,是所有关键点混合在一起构建的 flann k-d 树(那么树中的关键点不附加相应的图像标签)?或者有没有办法访问给定关键点所属的图像?

关于 flannbasedmatcher match() 和 train() 函数如何工作的任何其他指针也很好,因为我已经搜索了源代码,但仍然有些迷惑——谢谢。

非常感谢任何指导 - 谢谢!

【问题讨论】:

    标签: opencv computer-vision


    【解决方案1】:

    Dmatch 属性 imgIdx 报告匹配关键点所属的“火车”图像的索引。使用 DescriptorMatcher.:add 将描述符向量附加到“训练”图像描述符的向量中。由您决定图像 id X 对应于特定的图像文件。

    【讨论】:

    • 非常感谢您的回复。我创建了一个 trainDescriptors 向量,为我的每个训练图像添加一个 cv::Mat 描述符到这个向量中。令我惊讶的是,如果我的训练描述符向量中有 3 个条目(3 个训练图像的 3 个描述符集),有时我仍然会得到一个 imgIdx 值 5(或某个大于我的训练图像数量的数字)。这是预期的吗?对于 3 图像 trainDescriptor 大小,我希望 imgIdx 不大于 2(0、1 或 2)。我感谢任何建议。
    • 更具体地说,我使用以下函数: 'void DescriptorMatcher::match( const Mat& queryDescriptors, vector& matches, const vector& mask )' 进行匹配在一个查询图像和一个图像集之间。然后我检索“matches.at(0).imgIdx”(matches.at(0) 应该是最佳(最短距离)匹配关键点,因此 imgIdx 应该告诉我最好的 cv::Mat trainDescriptor 索引,其中最好关键点来了,等于我原始图像向量中的最佳图像索引,对吧?但是我得到的 imgIdx 比我原来的 trainDescriptors 数量大。
    猜你喜欢
    • 2014-12-20
    • 1970-01-01
    • 2016-06-30
    • 1970-01-01
    • 2013-05-04
    • 1970-01-01
    • 2012-05-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多