我了解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:提到如何初始化(代码)各种类型的探测器,提取器和匹配器?
回答第三个问题,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
适配器非常有用。
更多阅读: