检测器、提取器和匹配器的分类
我是 opencv 的新手,正在尝试实现两个图像之间的图像匹配.为此,我试图了解特征描述符、描述符提取器和描述符匹配器之间的区别.我遇到了很多术语并试图在 opencv 文档网站上阅读它们,但我似乎无法理解这些概念.我理解这里的基本区别.特征检测和描述符提取的区别
I am new to opencv and trying to implement image matching between two images. For this purpose, I'm trying to understand the difference between feature descriptors, descriptor extractors and descriptor matchers. I came across a lot of terms and tried to read about them on the opencv documentation website but I just can't seem to wrap my head around the concepts. I understood the basic difference here. Difference between Feature Detection and Descriptor Extraction
但是我在研究这个主题时遇到了以下术语:
But I came across the following terms while studying on the topic :
FAST、GFTT、SIFT、SURF、MSER、STAR、ORB、BRISK、FREAK、BRIEF
FAST, GFTT, SIFT, SURF, MSER, STAR, ORB, BRISK, FREAK, BRIEF
我了解 FAST、SIFT、SURF 的工作原理,但似乎无法弄清楚上述哪些只是检测器,哪些是提取器.
I understand how FAST, SIFT, SURF work but can't seem to figure out which ones of the above are only detectors and which are extractors.
然后是匹配器.
FlannBased、BruteForce、knnMatch 和其他一些可能的.
FlannBased, BruteForce, knnMatch and probably some others.
经过一些阅读,我认为某些匹配器只能与某些提取器一起使用,如此处所述.OpenCV ORB 特征检测器是如何工作的?给出的分类非常清楚,但仅适用于少数提取器,我不明白 float 和 uchar 之间的区别.
After some reading, I figured that certain matchers can only be used with certain extractors as explained here. How Does OpenCV ORB Feature Detector Work? The classification given is quite clear but it's only for a few extractors and I don't understand the difference between float and uchar.
所以基本上,有人可以吗
So basically, can someone please
- 根据前面提到的 float 和 uchar 对检测器、提取器和匹配器的类型进行分类,还是其他类型的分类?
- 解释 float 和 uchar 分类或使用的任何分类之间的区别?
- 提及如何初始化(编码)各种类型的检测器、提取器和匹配器?
我知道它要求很多,但我将不胜感激.谢谢.
I know its asking for a lot but I'll be highly grateful. Thank you.
推荐答案
我了解 FAST、SIFT、SURF 的工作原理,但似乎无法弄清楚以上哪些只是检测器,哪些是提取器.
I understand how FAST, SIFT, SURF work but can't seem to figure out which ones of the above are only detectors and which are extractors.
基本上,从特征检测器/提取器列表(文章链接:FAST, GFTT, SIFT、SURF、MSER、STAR, ORB, BRISK, FREAK, BRIEF),一些它们只是特征检测器(FAST、GFTT),其他既是特征检测器又是描述符提取器(SIFT、SURF、ORB、FREAK).
Basically, from that list of feature detectors/extractors (link to articles: FAST, GFTT, SIFT, SURF, MSER, STAR, ORB, BRISK, FREAK, BRIEF), some of them are only feature detectors (FAST, GFTT) others are both feature detectors and descriptor extractors (SIFT, SURF, ORB, FREAK).
如果我没记错的话,BRIEF 只是一个描述符提取器,所以它需要一些其他算法(如 FAST 或 ORB)检测到的特征.
If I remember correctly, BRIEF is only a descriptor extractor, so it needs features detected by some other algorithm like FAST or ORB.
要确定哪个是哪个,您必须浏览与算法相关的文章或浏览 opencv 文档以查看哪个是为 FeatureDetector
类实现的,哪个是为 DescriptorExtractor 实现的
类.
To be sure which is which, you have to either browse the article related to the algorithm or browse opencv documentation to see which was implemented for the FeatureDetector
class or which was for the DescriptorExtractor
class.
Q1:根据检测器、提取器和匹配器的类型分类如前所述,是 float 和 uchar,还是其他类型的分类?
Q1: classify the types of detectors, extractors and matchers based on float and uchar, as mentioned, or some other type of classification?
Q2:解释float和uchar分类的区别或者使用哪种分类?
Q2: explain the difference between the float and uchar classification or whichever classification is being used?
关于问题 1 和 2,要将它们归类为 float 和 uchar,你已经发布的链接是我所知道的最好的参考,也许有人能够完成它.
Regarding questions 1 and 2, to classify them as float and uchar, the link you already posted is the best reference I know, maybe someone will be able to complete it.
Q3:提到如何初始化(编码)各种类型的检测器,提取器和匹配器?
Q3: mention how to initialize (code) various types of detectors, extractors and matchers?
回答问题 3,OpenCV 使使用各种类型的代码完全相同 - 主要是您必须选择一个特征检测器.大多数区别在于选择匹配器的类型,您已经提到了 OpenCV 的 3 个.最好的办法是阅读文档,代码示例 和相关的堆栈溢出问题.此外,一些博客文章也是很好的信息来源,例如这些 Ievgen Khvedchenia 的一系列特征检测器基准 (该博客不再可用,因此我不得不从其 google 缓存中创建原始文本副本).
Answering question 3, OpenCV made the code to use the various types quite the same - mainly you have to choose one feature detector. Most of the difference is in choosing the type of matcher and you already mentioned the 3 ones that OpenCV has. Your best bet here is to read the documentation, code samples, and related Stack Overflow questions. Also, some blog posts are an excellent source of information, like these series of feature detector benchmarks by Ievgen Khvedchenia (The blog is no longer available so I had to create a raw text copy from its google cache).
Matchers 用于查找一个描述符是否与列表中的另一个描述符相似.您可以将查询描述符与列表中的所有其他描述符进行比较 (BruteForce),或者使用更好的启发式方法(FlannBased、knnMatch).问题是启发式方法不适用于所有类型的描述符.例如,FlannBased 实现过去只适用于 float
描述符,而不适用于 uchar
的(但从 2.4.0 开始,带有 LSH 索引的 FlannBased 可以应用于 uchar 描述符).
Matchers are used to find if a descriptor is similar to another descriptor from a list. You can either compare your query descriptor with all other descriptors from the list (BruteForce) or you use a better heuristic (FlannBased, knnMatch). The problem is that the heuristics do not work for all types of descriptors. For example, FlannBased implementation used to work only with float
descriptors but not with uchar
's (But since 2.4.0, FlannBased with LSH index can be applied to uchar descriptors).
引用 这篇 App-Solut 博客文章关于 DescriptorMatcher
类型:
DescriptorMatcher 有多种FlannBased",BruteForceMatcher"、BruteForce-L1"和BruteForce-HammingLUT".这FlannBased"匹配器使用 flann(用于近似的快速库)最近的邻居)引擎盖下的库执行速度更快,但近似匹配.BruteForce-*"版本详尽地搜索查找图像特征最接近匹配的字典字典中的单词.
The DescriptorMatcher comes in the varieties "FlannBased", "BruteForceMatcher", "BruteForce-L1" and "BruteForce-HammingLUT". The "FlannBased" matcher uses the flann (fast library for approximate nearest neighbors) library under the hood to perform faster but approximate matching. The "BruteForce-*" versions exhaustively searche the dictionary to find the closest match for an image feature to a word in the dictionary.
一些比较流行的组合是:
特征检测器/描述符提取器/匹配器类型
(FAST, SURF)/SURF/FlannBased
(FAST, SURF) / SURF / FlannBased
(FAST, SIFT)/SIFT/FlannBased
(FAST, SIFT) / SIFT / FlannBased
(FAST, ORB)/ORB/蛮力
(FAST, ORB) / ORB / Bruteforce
(快速,ORB)/BRIEF/蛮力
(FAST, ORB) / BRIEF / Bruteforce
(快速,冲浪)/怪胎/蛮力
(FAST, SURF) / FREAK / Bruteforce
您可能还注意到特征检测器有一些适配器(动态、金字塔、网格).App-Solut 博客文章 很好地总结了它们的用途:
You might have also noticed there are a few adapters (Dynamic, Pyramid, Grid) to the feature detectors. The App-Solut blog post summarizes really nicely their use:
(...) 还有几个适配器可以用来改变关键点检测器的行为.例如 Dynamic
调整检测器类型特定检测阈值的适配器直到在图像或 Pyramid
适配器中找到足够多的关键点它构建了一个高斯金字塔来检测多个点秤.Pyramid
适配器对于特征描述符很有用不是尺度不变的.
(...) and there are also a couple of adapters one can use to change the behavior of the key point detectors. For example the
Dynamic
adapter which adjusts a detector type specific detection threshold until enough key-points are found in an image or thePyramid
adapter which constructs a Gaussian pyramid to detect points on multiple scales. ThePyramid
adapter is useful for feature descriptors which are not scale invariant.
进一步阅读:
Yu Lu 的这篇博文关于 SIFT、FAST、SURF、BRIEF、ORB、BRISK 和 FREAK 的非常好的摘要描述.
This blog post by Yu Lu does a very nice summary description on SIFT, FAST, SURF, BRIEF, ORB, BRISK and FREAK.
这些 Gil 的系列帖子Levi 还对其中几种算法(BRIEF、ORB、BRISK 和 FREAK)进行了详细总结.
These series of posts by Gil Levi also do detailed summaries for several of these algorithms (BRIEF, ORB, BRISK and FREAK).
相关文章