我是opencv的新手,正在尝试实现两个图像之间的图像匹配。为此,我试图了解特征描述符,描述符提取器和描述符匹配器之间的区别。我遇到了很多术语,并试图在opencv文档网站上阅读它们,但是我似乎无法完全理解这些概念。我了解这里的基本区别。 Difference between Feature Detection and Descriptor Extraction
但是在研究该主题时,我遇到了以下术语:
我了解FAST,SIFT,SURF的工作原理,但似乎无法弄清楚以上哪些仅是检测器,哪些是提取器。
然后是匹配器。
经过一番阅读,我发现某些匹配器只能与某些提取器一起使用,如此处所述。 How Does OpenCV ORB Feature Detector Work?
给出的分类非常清晰,但仅适用于少数提取器,我不了解float和uchar之间的区别。
所以基本上,有人可以
我知道它要求很多,但我将不胜感激。
谢谢。
最佳答案
基本上,从该特征检测器/提取器的列表(链接到文章:FAST,GFTT,SIFT,SURF,MSER,STAR,ORB,BRISK,FREAK,BRIEF)中,其中一些仅是特征检测器(),其他的都是特征检测器和描述符提取器( SIFT,SURF,ORB,FREAK )。
如果我没记错的话,简介只是一个描述符提取器,因此它需要其他一些算法(例如FAST或ORB)检测到的功能。
为了确定哪个是哪个,您必须浏览与算法有关的文章或浏览opencv文档,以查看哪个是为FeatureDetector
类实现的或哪个是DescriptorExtractor
类实现的。
关于问题1和2 ,将它们分类为float和uchar,link you already posted是我所知的最佳引用,也许有人可以完成它。
回答问题3 ,OpenCV使使用各种类型的代码完全相同-主要是您必须选择一个特征检测器。大部分差异在于选择匹配器的类型,您已经提到了OpenCV具有的三个匹配器。最好的选择是阅读文档code samples和相关的Stack Overflow问题。此外,有些博客文章是极好的信息来源,例如series of feature detector benchmarks by Ievgen Khvedchenia(该博客不再可用,因此我不得不从其Google缓存中创建原始文本副本)。
匹配器用于查找一个描述符是否类似于列表中的另一个描述符。您可以将查询描述符与列表中的所有其他描述符( BruteForce )进行比较,也可以使用更好的启发式方法( FlannBased,knnMatch )。问题在于试探法不适用于所有类型的描述符。例如,FlannBased实现过去只能与float
描述符一起使用,而不能与uchar
一起使用(但是从2.4.0版本开始,带有LSH索引的FlannBased可以应用于uchar描述符)。
用this App-Solut blog post引用DescriptorMatcher
类型:
一些较流行的组合是:
特征检测器/解串器提取器/匹配器类型
您可能还已经注意到,功能检测器有一些适配器(动态,金字塔,网格)。 The App-Solut blog post很好地总结了它们的用法:
进一步阅读:
关于c++ - 探测器,提取器和匹配器的分类,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14808429/