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

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



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

然后是匹配器。



经过一番阅读,我发现某些匹配器只能与某些提取器一起使用,如此处所述。 How Does OpenCV ORB Feature Detector Work?
给出的分类非常清晰,但仅适用于少数提取器,我不了解float和uchar之间的区别。

所以基本上,有人可以

  • 如上所述,基于float和uchar对检测器,提取器和匹配器的类型进行分类,或者进行其他类型的分类?
  • 解释float和uchar分类之间的区别还是使用哪种分类?
  • 提到如何初始化(编码)各种类型的检测器,提取器和匹配器?

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

    最佳答案



    基本上,从该特征检测器/提取器的列表(链接到文章:FASTGFTTSIFTSURFMSERSTARORBBRISKFREAKBRIEF)中,其中一些仅是特征检测器(),其他的都是特征检测器和描述符提取器( 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类型:



    一些较流行的组合是:

    特征检测器/解串器提取器/匹配器类型

  • (FAST,SURF)/SURF/FlannBased
  • (FAST,SIFT)/SIFT/FlannBased
  • (快速,ORB)/ORB/暴力破解
  • (快速,ORB)/简介/Bruteforce
  • (快速,冲浪)/怪胎/Bruteforce

  • 您可能还已经注意到,功能检测器有一些适配器(动态,金字塔,网格)The App-Solut blog post很好地总结了它们的用法:



    进一步阅读:
  • This blog post by Yu Lu对SIFT,FAST,SURF,BRIEF,ORB,BRISK和FREAK做了非常好的摘要描述。
  • 这些series of posts by Gil Levi还为这些算法(BRIEF,ORB,BRISK和FREAK)中的几种算法提供了详细的摘要。
  • 关于c++ - 探测器,提取器和匹配器的分类,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14808429/

    10-11 04:29