目标
在这一章当中,将学习
- ORB 的基础知识
理论
作为一个 OpenCV 爱好者,ORB 最重要的一点是它来自“OpenCV Labs”。该算法由 Ethan Rublee、Vincent Rabaud、Kurt Konolige 和 Gary R. Bradski 于 2011 年提出的论文ORB: An Effective Alternative to SIFT or 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
)
(x_i,y_i)
(xi,yi)上n个二进制测试的任何特征集,定义一个
2
×
n
2×n
2×n矩阵S,其中包含了这些像素的坐标。然后使用图像块的方向
θ
θ
θ,找到其旋转矩阵并旋转S以获得转向(旋转)版本
S
θ
S_θ
Sθ。
ORB将角度离散化为
2
π
30
\frac{2π}{30}
302π(12度)的增量,并构造了预先计算的BRIEF模式的查找表。只要关键点方向θ在各个视图中一致,就将使用正确的点集
S
θ
S_θ
Sθ来计算其描述符。
BRIEF具有一个重要的特性,即每个位特征具有较大的方差,且均值接近0.5。但是,一旦沿关键点方向定向,它就会失去此属性,变得更加分散。高方差使特征更具区分性,因为它对输入的响应不同。另一个理想的特性是使测试不相关,因为从那时起每个测试都会对结果有所贡献。为了解决所有这些问题,ORB在所有可能的二进制测试中进行贪婪搜索,以找到方差高且均值接近0.5且不相关的测试, 被称为rBRIEF。
对于描述符匹配,使用了改进传统 LSH 的多探针 LSH。该论文称 ORB 比 SURF 和 SIFT 快得多,并且 ORB 描述符比 SURF 效果更好。ORB是全景拼接等低功耗设备的不错选择。
OpenCV 中的 ORB
使用函数cv2.ORB()
或使用 feature2d
公共接口创建一个 ORB 对象。它有许多可选参数。
nFeatures
表示要保留的最大特征数(默认为 500)scoreType
表示是 Harris 得分还是 FAST 得分来对特征进行排名(默认情况下,Harris 得分)等。WTA_K
决定点数产生定向BRIEF描述符的每个元素。默认情况下它是两个,即一次选择两个点。在这种情况下,为了匹配,使用 NORM_HAMMING 距离。如果 WTA_K 是 3 或 4,需要 3 或 4 个点来生成简要描述符,则匹配距离由 NORM_HAMMING2 定义。
retval = cv2.ORB_create([, nfeatures[, scaleFactor[, nlevels[, edgeThreshold[, firstLevel[, WTA_K[, scoreType[, patchSize[, fastThreshold]]]]]]]]] )
下面是一个简单的代码,显示了 ORB 的使用
import cv2
import numpy as np
from matplotlib import pyplot as plt
img = cv2.imread('fly.png', 0)
# init orb detector
orb = cv2.ORB_create()
# find the keypoints with orb
kp = orb.detect(img, None)
# compute the descrptors with orb
kp, des = orb.compute(img, kp)
# draw only keypoints location,not size and orientation
img2 = cv2.drawKeypoints(img, kp, None, color=(0,255,0), flags=0)
plt.imshow(img2)
plt.show()
附加资源
- https://docs.opencv.org/4.1.2/d1/d89/tutorial_py_orb.html
- https://docs.opencv.org/4.1.2/db/d95/classcv_1_1ORB.html
- Ethan Rublee, Vincent Rabaud, Kurt Konolige, Gary R. Bradski: ORB: An efficient alternative to SIFT or SURF. ICCV 2011: 2564-2571.
- https://zhuanlan.zhihu.com/p/261966288
- https://www.cnblogs.com/alexme/p/11345701.html