OpenCV 4.11.0
开源计算机视觉库
|
在本章中,
作为 OpenCV 爱好者,ORB 最重要的一点是它来自“OpenCV Labs”。该算法由 Ethan Rublee、Vincent Rabaud、Kurt Konolige 和 Gary R. Bradski 在他们 2011 年的论文《ORB:一种高效的 SIFT 或 SURF 替代算法》中提出。正如标题所说,它在计算成本、匹配性能以及最重要的专利方面,都是 SIFT 和 SURF 的一个很好的替代方案。是的,SIFT 和 SURF 已获得专利,您需要付费才能使用它们。但 ORB 没有!!!
ORB 基本上是 FAST 关键点检测器和 BRIEF 描述符的融合,并进行了许多改进以增强性能。它首先使用 FAST 查找关键点,然后应用 Harris 角点测量来找到其中排名前 N 的点。它还使用金字塔来生成多尺度特征。但问题是,FAST 不会计算方向。那么旋转不变性怎么办?作者提出了以下改进。
它计算以位于中心的角点为中心的图像块的强度加权质心。从该角点到质心的向量的方向给出方向。为了提高旋转不变性,需要计算 x 和 y 的矩,它们应该在一个半径为 \(r\) 的圆形区域内,其中 \(r\) 是图像块的大小。
现在对于描述符,ORB 使用 BRIEF 描述符。但我们已经看到 BRIEF 在旋转方面性能较差。因此 ORB 所做的是根据关键点的方向来“转向”BRIEF。对于位于 \((x_i, y_i)\) 的 \(n\) 个二元测试的任何特征集,定义一个 \(2 \times n\) 矩阵 \(S\),其中包含这些像素的坐标。然后使用图像块的方向 \(\theta\) 找到其旋转矩阵,并旋转 \(S\) 以获得转向(旋转)版本 \(S_\theta\)。
ORB 将角度离散化为 \(2 \pi /30\)(12 度)的增量,并构建一个预计算 BRIEF 模式的查找表。只要关键点方向 \(\theta\) 在各个视图中保持一致,就会使用正确的点集 \(S_\theta\) 来计算其描述符。
BRIEF 具有一个重要特性,即每个比特特征都具有较大的方差和接近 0.5 的均值。但是一旦它沿着关键点方向定向,它就会失去这个特性并变得更加分散。高方差使特征更具区分性,因为它对输入的响应不同。另一个理想的特性是测试不相关,因为这样每个测试都会对结果做出贡献。为了解决所有这些问题,ORB 在所有可能的二元测试中运行贪婪搜索,以找到那些既具有高方差和接近 0.5 的均值,又彼此不相关的测试。结果被称为 rBRIEF。
对于描述符匹配,使用多探针局部敏感哈希 (LSH),它改进了传统的 LSH。论文指出 ORB 比 SURF 和 SIFT 快得多,并且 ORB 描述符比 SURF 更好。ORB 是低功耗设备(用于全景拼接等)的理想选择。
像往常一样,我们必须使用函数 cv.ORB() 或使用 feature2d 通用接口创建一个 ORB 对象。它有很多可选参数。最有用的是 nFeatures,它表示要保留的最大特征数量(默认为 500),scoreType 表示使用 Harris 分数还是 FAST 分数对特征进行排序(默认为 Harris 分数)等。另一个参数 WTA_K 决定产生定向 BRIEF 描述符的每个元素的点数。默认为 2,即一次选择两个点。在这种情况下,对于匹配,使用 NORM_HAMMING 距离。如果 WTA_K 为 3 或 4,则需要 3 或 4 个点来生成 BRIEF 描述符,则匹配距离由 NORM_HAMMING2 定义。
下面是一个简单的代码,展示了 ORB 的使用方法。
参见下面的结果
ORB 特征匹配将在另一章中进行。