26

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

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

4

3 回答 3

30

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

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

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

有多种方法可以计算两个向量之间的“相似度分数”。对于实值描述符,通常使用欧几里得距离,而汉明距离对于二进制描述符很常见。

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

于 2013-06-08T07:21:31.023 回答
10

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 distance, Hamming2 distance,... 可以作为 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 ……在匹配各自的特征描述符时,它们都是相似的。

于 2017-12-20T07:35:08.747 回答
6

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

公式

于 2013-06-08T06:59:49.380 回答