我了解 FAST、SIFT、SURF 的工作原理,但似乎无法弄清楚以上哪些只是检测器,哪些是提取器。
基本上,从特征检测器/提取器列表中(链接到文章:FAST、GFTT、SIFT、SURF、MSER、STAR、ORB、BRISK、FREAK、BRIEF),其中一些只是特征检测器(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
适配器对于不是尺度不变的特征描述符很有用。
进一步阅读: