opencv DMatches中的distance属性是什么意思?

1l5u6lss  于 2022-12-13  发布在  其他
关注(0)|答案(3)|浏览(348)

我有一个简短的问题:当我在OpenCV中进行特征匹配时,MatOfMatchesDMatchesdistance属性意味着什么?
“我知道,距离大的匹配,肯定不如距离小的匹配,所以我必须过滤掉,但是这个属性是什么意思?是一种偏差吗?”

rwqw0loc

rwqw0loc1#

在本文中,* 特征 * 是图像上的兴趣点。为了比较特征,您使用 * 特征检测器 * 来“描述”它们。然后,每个特征都与一个 * 描述符 * 相关联。当您匹配特征时,实际上就是匹配它们的描述符。
描述符是多维向量。它可以是实值(例如SIFT)或二进制(例如BRIEF)。
匹配是一对描述符,每个图像中有一个描述符,它们是所有描述符中最相似的。当然,要找到图像B中与图像A中的描述符最相似的描述符,你需要测量这种相似性。
有多种方法可以计算两个向量之间的“相似性得分”。对于实值描述符,经常使用 * 欧几里得距离 *,而 Hamming distance 对于二进制描述符是常见的。
作为结论,我们现在可以理解distance属性:它是匹配的两个描述符之间的相似性得分。

cngwdvgl

cngwdvgl2#

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

从我刚开始的经历中得到的教训:

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

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

1)首先,检测要比较的两个图像的关键点(兴趣点)。
2)然后计算所有关键点周围的定义区域(每个关键点周围的16 X 16邻域)的sift描述符。每个描述符存储每个关键点周围区域的方向梯度直方图。
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。距离可以是许多距离度量之一-〉Norm_L1,Norm_L2(欧几里得距离),汉明距离,汉明2距离,...可以在BFMatcher中作为参数提及。默认距离是欧几里得距离。

6)空间欧几里德距离和DMatch欧几里德距离之间的差异:

SIFT描述符1 -〉[a1,a2,...a128]
SIFT描述符2 -〉[b1,b2,...b128]

(D匹配)-〉欧氏距离= 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......当涉及到匹配各自的特征描述符时,它们都是相似的。

ut6juiuv

ut6juiuv3#

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

相关问题