OpenCV ORB 特征检测器如何工作?

Posted

技术标签:

【中文标题】OpenCV ORB 特征检测器如何工作?【英文标题】:How Does OpenCV ORB Feature Detector Work? 【发布时间】:2011-11-06 03:42:08 【问题描述】:

我想使用 ORB 特征检测器和提取器实现基于特征的对齐算法。 到目前为止,我使用 OpenCV 中的 ORB 类提取了特征 ORB orb;orb(gray_image,Mat(),features.keypoints,features.descriptors); 并使用 openCV matcher.knnMatch(features1.descriptors, features2.descriptors, pair_matches,2); 中的 knnMatch 函数匹配它们 之后,我尝试使用 findHomography 函数查找单应性,但此函数需要图像特征之间至少 4 次匹配,而在我测试的大多数图像上,我得到的匹配不到 4。

有人用过这个功能吗?有没有关于它的文档,或者关于 OpenCV 中的 ORB 类(ORB 构造函数参数的含义)?

附:这是我的第一个问题。我不能发布超过 2 个链接。对于 opencv 文档,请使用 this。

【问题讨论】:

【参考方案1】:

更新:现在它在 OpenCV 文档中,这里: http://opencv.itseez.com/modules/features2d/doc/feature_detection_and_description.html#orb

算法的详细说明见这里:http://www.willowgarage.com/sites/default/files/orb_final.pdf


OpenCV 文档中没有提到,但实际上 OpenCV 有:

两种类型的描述符:

浮点描述符: 筛选 冲浪 uchar 描述符: ORB 简介

以及对应的匹配器:

对于浮点描述符: FlannBased BruteForce<L2<float> > BruteForce<SL2<float> > //2.3.1 起 BruteForce<L1<float> > 对于 uchar 描述符: BruteForce<Hamming> BruteForce<HammingLUT> FlannBased 带有 LSH 索引 //自 2.4.0 起

因此,您需要修改代码以使用例如 BruteForce<Hamming> 匹配器作为 ORB 描述符。可以使用 L2 或 L1 距离来匹配 uchar 描述符,但结果会不正确,并且 findHomography 会返回不令人满意的结果。

【讨论】:

感谢您的快速回复。它现在与 BruteForceMatcher 一起工作得更好,但我仍然得到一些不满意的结果。我认为 ORB 可能对旋转/缩放敏感,因为它使用简要描述符。我说的对吗? 无论如何,你知道我在哪里可以找到更多关于 opencv 中的 ORB 实现的信息吗?我看到 ORB 类可以接收一些参数(CommonParams),但我不知道如何设置它们。 其实ORB描述符是基于BRIEF的,但并不完全相同(ORB是Oriented Brief的缩写)。所以 ORB 对缩放比旋转更敏感。这是 OpenCV 功能的new comparison。而ORB是今年夏天才加入OpenCV的全新算法,所以我认为目前唯一解释ORB的论文是ORB作者的原创论文。 另外我应该指出,我认为 ORB 还没有被移植到 python 绑定中。 这可能是晚了,但是如果你想了解更多关于ORB的信息,原论文贴在这里:willowgarage.com/sites/default/files/orb_final.pdf它是Willow Garage专门为OpenCV写的,所以我想是相当有用(虽然我没有读过——他们去年在 ICCV 上确实有一张很好的海报!)

以上是关于OpenCV ORB 特征检测器如何工作?的主要内容,如果未能解决你的问题,请参考以下文章

OpenCV 例程 300篇246. 特征检测之ORB算法

OpenCV 例程 300篇246. 特征检测之ORB算法

使用 OpenCV Cuda ORB 特征检测器

OpenCV——ORB特征检测与匹配

使用 OpenCV 的 OpenCL 特征检测器

OpenCV中ORB特征提取与匹配