ste*_*tro 20 opencv feature-extraction feature-detection
我有一个简短的问题:当我在做的OpenCV功能匹配,什么是distance属性意味着DMatches在MatOfMatches?
我知道我必须过滤较大距离的比赛,因为它们不如距离较远的那样好.但这个属性的含义是什么?这是一种偏差吗?
Jon*_*rin 25
在此上下文中,特征是图像上的关注点.为了比较功能,您可以使用功能检测器 "描述"它们.然后将每个特征与描述符相关联.匹配要素时,实际上匹配其描述符.
描述符是多维向量.它可以是实值(例如SIFT)或二元(例如,简称).
匹配是一对描述符,每个图像中有一个描述符,它们在所有描述符中最相似.当然,要在图像B中找到与图像A中的描述符最相似的描述符,您需要衡量这种相似性.
有多种方法可以计算两个向量之间的"相似度得分".对于实值描述符,当汉明距离对于二进制描述符是常见的时,经常使用欧几里德距离.
作为结论,我们现在可以理解distance属性:它是匹配的两个描述符之间的相似性得分.
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.
Run Code Online (Sandbox Code Playgroud)
5) DMatch.Distance 可以是许多距离度量之一 -> Norm_L1、Norm_L2(欧几里得距离)、Hamming 距离、Hamming2 距离,...可以作为 BFMatcher 中的参数提及。默认距离是欧几里得。
6)Spatial Euclidean distance和DMatch Euclidean distance的区别:
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 ……在匹配各自的特征描述符时,所有这些特征描述符都是相似的。
通常,当您匹配两个要素时,实际上是在某些距离度量下比较两个向量.现在让我们假设您的特征是具有128维的SIFT,并且您比较两个SIFT特征a并b使用欧几里德距离,则DMatch.distance等于
| 归档时间: |
|
| 查看次数: |
11509 次 |
| 最近记录: |