【问题标题】:What does the distance attribute in DMatches mean?Dmatches 中的距离属性是什么意思?
【发布时间】:2013-06-04 12:14:48
【问题描述】:

我有一个简短的问题:当我在 OpenCV 中进行特征匹配时,MatOfMatchesDMatchesdistance 属性是什么意思?

我知道我必须过滤距离较大的匹配项,因为它们不如距离较短的匹配项。但是这个属性是什么意思呢?是不是一种偏差?

【问题讨论】:

    标签: opencv feature-detection feature-extraction


    【解决方案1】:

    DMatch 中的距离属性是两个描述符(特征向量)之间相似性的度量。如果距离越小,则图像越相似,反之亦然。

    从我刚开始时的经验中吸取的教训:

    不要将 DMatch.distance 与两点之间的正常空间距离混淆。两者是不同的。 DMatch中的距离表示两个描述符之间的距离(在SIFT的情况下为128个值的向量)

    如果是 SIFT(局部特征描述符):

    1) 首先,您检测要比较的两张图像的关键点(有趣点)。

    2) 然后计算所有关键点周围定义区域(每个关键点周围 16 X 16 邻域)的筛选描述符。每个描述符存储每个关键点周围区域的方向梯度直方图。

    3) 最后,匹配两个图像的描述符以找到图像之间的匹配关键点。这是通过使用 BFMatcher -> match()、knnMatch() 或 FlannBasedMatcher -> knnMatch() 来完成的。

    4) 如果您使用 BFMatcher.match(),您将获得一个 DMatch 对象列表。 DMatch 对象的数量等于匹配的数量。对于每个匹配的关键点对,每个 DMatch 对象都包含以下四个属性。

    DMatch.distance - Distance between descriptors. The lower, the better it is.
    DMatch.trainIdx - Index of the descriptor in train descriptors(1st image)
    DMatch.queryIdx - Index of the descriptor in query descriptors(2nd image)
    DMatch.imgIdx - Index of the train image.
    

    5) DMatch.Distance 可以是许多距离度量之一 -> Norm_L1、Norm_L2(欧几里得距离)、Hamming 距离、Hamming2 距离,...可以作为 BFMatcher 中的参数提及。默认距离是欧几里得。

    6) 空间欧式距离与DMatch欧式距离的区别:

    SIFT 描述符 1 -> [a1,a2,....a128]

    SIFT 描述符 2 -> [b1,b2,....b128]

    (DMatch) -> 欧式距离 = sqrt[(a1-b1)^2 + (a2-b2)^2 +...+(a128-b128)^2]

    点 1 -> (x1, y1)

    点 2 -> (x2, y2)

    (空间)-> 欧式距离 = sqrt[(x2-x1)^2 + (y2-y1)^2]

    因此,这个与 DMatch 的距离就是描述符之间的距离,它代表了两个描述符之间的相似程度,不同于两点之间的正常空间欧几里德距离。

    如果描述符之间的距离较小,那么它们的相似度就很高。如果描述符之间的距离越大,那么它们的相似度就越低。

    希望这有助于理解 DMatch 对象中距离属性的含义。如果您对此很清楚,那么您可以使用任何特征描述符,例如 HOG、SIFT、SURF、ORB、BRISK、FREAK ......在匹配各自的特征描述符时,它们都是相似的。

    【讨论】:

      【解决方案2】:

      在这种情况下,特征是图像上的一个兴趣点。为了比较特征,您使用特征检测器“描述”它们。然后将每个特征关联到一个描述符。当你匹配特征时,你实际上匹配了它们的描述符。

      描述符是一个多维向量。它可以是实值(例如SIFT)或二进制(例如BRIEF)。

      匹配是一对描述符,每个图像中的一个,是所有描述符中最相似的。当然,要找到图像 B 中与图像 A 中的描述符最相似的描述符,您需要衡量这种相似性。

      有多种方法可以计算两个向量之间的“相似度得分”。对于实值描述符,Euclidean distance 经常被使用,而 Hamming distance 对于二进制描述符来说是常见的。

      作为结论,我们现在可以理解distance 属性:它是匹配的两个描述符之间的相似度得分。

      【讨论】:

      • 剩下一个小问题,为什么匹配算法给我的匹配距离很远,而它们显然不完全相同?
      • 他们给出了 best 匹配 w.r.t 您拥有的描述符。有些是正确的,有些不是。存在不同的技术来过滤异常值,但最好的技术取决于具体情况,这不是匹配器本身的工作......
      • 您能否详细说明“描述符是多维向量”的部分——它确实是一个矩阵,但其中的单个元素究竟代表什么?
      • 我读到描述符基本上“捕获”关键点周围的强度,这意味着描述符矩阵基本上为每个关键点存储了检测到该关键点的所有强度。如果我们在图像中找到了 10 次关键点 A,那么描述符矩阵中该关键点的行将包含 10 个强度值。这是正确的还是我完全误解了整个事情?
      • 距离实际上是衡量差异的指标。
      【解决方案3】:

      通常当您匹配两个特征时,您实际上是在比较特定距离度量下的两个向量。现在假设您的特征是 128 维的 SIFT,并且您使用欧几里德距离比较两个 SIFT 特征 ab,那么 DMatch.distance 等于

      【讨论】:

        猜你喜欢
        • 2018-04-11
        • 2019-09-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-06-12
        • 1970-01-01
        • 2011-05-16
        相关资源
        最近更新 更多