62

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

但是我在研究该主题时遇到了以下术语:

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

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

然后是匹配器。

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

经过一番阅读,我认为某些匹配器只能与某些提取器一起使用,如此处所述。OpenCV ORB 特征检测器如何工作? 给出的分类很清楚,但仅适用于少数提取器,我不明白 float 和 uchar 之间的区别。

所以基本上,有人可以请

  1. 如前所述,根据浮点数和 uchar 对检测器、提取器和匹配器的类型进行分类,还是其他类型的分类?
  2. 解释 float 和 uchar 分类或正在使用的分类之间的区别?
  3. 提到如何初始化(编码)各种类型的检测器、提取器和匹配器?

我知道它要求很多,但我将不胜感激。谢谢你。

4

1 回答 1

87

我了解 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:提一下如何初始化(编码)各类检测器、提取器和匹配器?

回答问题 3,OpenCV 使代码使用的各种类型完全相同——主要是你必须选择一个特征检测器。大部分区别在于选择匹配器的类型,您已经提到了 OpenCV 拥有的 3 个匹配器。最好的办法是阅读文档、代码示例和相关的 Stack Overflow 问题。此外,一些博客文章是很好的信息来源,例如Ievgen Khvedchenia 的这些特征检测器基准系列(该博客不再可用,因此我不得不从其 google 缓存创建原始文本副本)。

匹配器用于查找描述符是否与列表中的另一个描述符相似。您可以将您的查询描述符与列表中的所有其他描述符(BruteForce)进行比较,也可以使用更好的启发式(FlannBased,knnMatch)。问题是启发式方法不适用于所有类型的描述符。例如,FlannBased 实现过去只能与float描述符一起使用,但不能与uchar's 一起使用(但从 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

  • (快速,ORB)/简要/蛮力

  • (FAST, SURF) / FREAK / Bruteforce

您可能还注意到特征检测器有一些适配器(动态、金字塔、网格) 。App-Solut 博客文章很好地总结了它们的使用:

(...) 还有几个适配器可以用来改变关键点检测器的行为。例如,Dynamic 适配器调整检测器类型特定的检测阈值,直到在图像中找到足够的关键点,或者Pyramid构建高斯金字塔以检测多个尺度上的点的适配器。该Pyramid适配器对于不是尺度不变的特征描述符很有用。

进一步阅读:

  • Yu Lu 的这篇博文对 SIFT、FAST、SURF、BRIEF、ORB、BRISK 和 FREAK 做了很好的总结描述。

  • Gil Levi 的这些系列文章还对其中几种算法(BRIEF、ORB、BRISK 和 FREAK)做了详细的总结。

于 2013-02-16T15:55:26.297 回答