探测器、提取器和匹配器的分类

64

我是opencv的新手,正在尝试在两个图像之间实现图像匹配。为此,我试图了解特征描述符、描述符提取器和描述符匹配器之间的区别。我遇到了很多术语,并尝试在opencv文档网站上阅读有关它们的内容,但我似乎无法理解这些概念。我已经理解了基本的区别。特征检测和描述符提取之间的差异

但是,在学习这个主题时,我遇到了以下术语:

FAST、GFTT、SIFT、SURF、MSER、STAR、ORB、BRISK、FREAK、BRIEF

我了解FAST、SIFT、SURF的工作原理,但无法弄清楚以上哪些只是检测器,哪些是提取器。

然后还有匹配器。

FlannBased、BruteForce、knnMatch,可能还有其他一些。

经过一些阅读,我发现某些匹配器只能与某些提取器一起使用,如这里所述OpenCV ORB特征检测器如何工作?所述的那样。所给的分类非常清晰,但仅适用于少数提取器,我不理解float和uchar之间的区别。

因此,可以请有经验的人:

  1. 根据float和uchar(或其他类型的分类)对探测器、提取器和匹配器进行分类吗?
  2. 解释float和uchar分类或使用的任何其他分类之间的区别?
  3. 提供不同类型探测器、提取器和匹配器的初始化方法(代码)?

虽然这是一个比较复杂的问题,但我将不胜感激。


这不是关于要求很多还是不要求的问题,问题在于你试图通过API来学习这个特定的主题。相反,你应该指向描述方法的论文,因为库可以自由地使用这些论文,而结果函数调用可能无法复制方法所能做的所有事情。你没有任何理由限制自己只使用OpenCV。在消除这种限制之后,选择一个具体的疑问。 - mmgp
实际上我想遵循你提到的方法,但由于某些情况,我被迫在时间紧迫的情况下进行图像拼接工作。这就是我试图寻求帮助理解一些目前超出我的掌握范围的概念的原因。我仍在积极阅读多篇论文和算法,但这样的帮助肯定会加速这个过程。 - hriddle
1个回答

89
我了解FAST、SIFT和SURF的工作原理,但似乎无法确定上述算法中哪些是仅检测器,哪些是提取器。
基本上,从特征检测器/提取器列表中(文章链接:FASTGFTTSIFTSURFMSERSTARORBBRISKFREAKBRIEF),其中一些仅是特征检测器(FAST,GFTT),而其他则既是特征检测器又是描述符提取器(SIFT,SURF,ORB,FREAK)。
如果我没记错的话,BRIEF只是一个描述符提取器,所以它需要被一些其他算法检测出来的特征,例如FAST或ORB。

要确定哪个是哪个,您必须浏览与算法相关的文章或浏览opencv文档,以查看哪个是实现给FeatureDetector类或哪个是实现给DescriptorExtractor类的。

Q1:基于float和uchar或其他分类方式,对探测器、提取器和匹配器进行分类?

Q2:解释float和uchar分类或使用的任何其他分类之间的区别?

关于问题1和2,将它们分类为float和uchar,您已经发布的链接 是我知道的最好参考资料,也许有人能够补充完善。

Q3:提到如何初始化(代码)各种类型的探测器,提取器和匹配器?

回答第三个问题,OpenCV使使用各种类型的代码变得相同-主要是您必须选择一个特征检测器。 大多数差异在于选择匹配器的类型,您已经提到了OpenCV拥有的3种类型。 您最好阅读文档,代码示例和相关的Stack Overflow问题。 此外,一些博客文章是信息的绝佳来源,例如这些由Ievgen Khvedchenia编写的特征检测基准系列(该博客不再可用,因此我不得不从其Google缓存中创建原始文本副本)。

匹配器 用于查找描述符是否与列表中的另一个描述符相似。您可以将查询描述符与列表中的所有其他描述符进行比较 (BruteForce), 或者您可以使用更好的启发式方法(FlannBased, knnMatch)。问题在于启发式方法并不适用于所有类型的描述符。例如,FlannBased 实现仅适用于 float 描述符而不适用于 uchar(但自2.4.0以来,可将使用 LSH 索引的 FlannBased 应用于 uchar 描述符)。

引用 此App-Solut博客文章 关于 DescriptorMatcher 类型:

DescriptorMatcher有“FlannBased”、“BruteForceMatcher”、“BruteForce-L1”和“BruteForce-HammingLUT”四种类型。 “FlannBased”匹配器使用flann(用于近似最近邻居的快速库)库来执行更快但是近似匹配。 “BruteForce-*”版本通过穷举搜索字典来找到图像特征与字典中单词的最佳匹配。一些较受欢迎的组合是:特征检测器/描述符提取器/匹配器类型:(FAST,SURF)/ SURF / FlannBased、(FAST,SIFT)/ SIFT / FlannBased、(FAST,ORB)/ ORB / Bruteforce、(FAST,ORB)/ BRIEF / Bruteforce、(FAST,SURF)/ FREAK / Bruteforce。
您可能已经注意到特征检测器中有几个适配器(动态、金字塔、网格)。The App-Solut博客文章非常好地总结了它们的用途:
(...)还有一些适配器可以用来改变关键点检测器的行为。例如,Dynamic适配器会调整特定类型的检测阈值,直到在图像中找到足够的关键点;Pyramid适配器构建高斯金字塔以检测多个尺度上的点。对于不具有尺度不变性的特征描述符,Pyramid适配器非常有用。 更多阅读:

7
+1 - 不错。如果您能够添加一些易于理解的好的参考和学习材料,那将是很棒的。 - Abid Rahman K
1
谢谢。我认为这差不多是我想要的。自从发布问题以来,我已经阅读了一些内容,这个答案确实帮助我填补了一些理解上的空白。谢谢。 - hriddle
2
FREAK不是特征检测器,这在你的第一段中已经说明了。 - happy_marmoset
1
感谢引用我的博客文章 :) - GilLevi
1
非常感谢你。我能向你生个孩子吗?你是我的英雄! - Papzord
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接