2019-9-6 opencv特征检测和描述8-ORB (Oriented FAST and Rotated BRIEF)-FAST特征点和BRIEF描述符的结合
官网参见https://docs.opencv.org/3.4.1/d1/d89/tutorial_py_orb.html
该研究采用基于FAST和BRIEF算法分别实现特征点的检测与描述过程。为了克服传统方法的局限性,在理论分析的基础上进行了实验研究。
通过实验发现,在相同的计算精度要求下,该方法相较于SIFT算法在速度方面提升了至少一个数量级,在性能方面也展现出显著优势。
属于CVT社区的一员(ORBFee),其核心技术源于OpenCV框架(OPENCV)。该算法于2011年首次提出(RBV),主要发表于《 orb: an efficient alternative to sift or surf 》论文中(RBV)。 orb 在计算效率方面显著优于sift/surf(rbv)。(rbv)值得注意的是,在实现上具有明显优势(rbv)。
ORB本质上是将FAST关键点检测与BRIEF关键点描述器相结合,并在此基础上进行了多项改进以提升性能。该方法首先利用FAST算法进行关键点检测,在此基础上通过Harris角点检测筛选出前N个候选关键点。为了更好地提取特征信息,在方法中采用了金字塔结构进行多尺度特征提取(所得特征具有尺度不变性特性)。然而一个主要问题是FAST算法本身无法计算方向信息。如何解决这一问题呢?在方法论部分作者进行了相应的改进与优化。
它确定(FAST检测出)角点所在小块区域(patch)的灰度加权质心位置,并通过从该质心指向角点的空间向量来表征其方向信息。为了增强旋转不变性特性,研究者们建议采用以目标角点为中心、半径设定为r值的圆形区域内各像素的空间矩特征,并据此进一步计算相应的统计量
目前主要采用的是基于关键点的特征描述方法,在本节中我们主要介绍其中一种有效的解决方案——ORB(Oriented FAST and Rotated BRIEF)。然而由于其旋转不稳定性问题,在实际应用中ORBFast算法通过利用关键点方向信息对BRIEF进行了改进。其中它通过在每个特征点(xi,yi)处进行n次二进制测试,并构造一个大小为2×n的矩阵(如图所示),最终得到S包含这些像素坐标的信息。

然后应用方向θ的小块(patch),从而获得其对应的旋转变换矩阵Rθ;接着进行旋转变换S后,我们就能获得相应的旋转变体版本Sθ
Sθ = RθS
ORB将角度分隔为2π/ 30(12度)等间距,并同时构建预存BRIEF模式对应的索引表。当关键点的方向θ在视图中一致时,则会采用正确的点集合Sθ来生成描述符。
BRIEF具有显著的特性,在每个特征中都表现出较大的方差,并且其均值接近0.5。一旦其沿着关键点方向确定后,则会失去这一特性并变得更为分散。较高的方差使得这些特征能够对输入做出高度敏感的反应。另一个优点是测试之间相互独立,在确定了方向之后每个测试都能为最终结果提供有效的信息支持。
为了应对一系列复杂问题,orb算法通过遍历所有可能的二进制测试并执行贪婪搜索算法,在满足方差和均值接近0.5的前提下筛选出一组不相关性较高的测试指标。这些指标被命名为rBRIEF。
对于描述符匹配技术,在ORB算法中采用了经典的优化版本多探针LSH方法进行改进。实验数据显示,在ORB与SURF、SIFT算法相比时,在图像处理速度上具有显著优势;同时在描述特征的精确度方面ORBed算法也优于前两者。特别适用于移动设备环境下进行全景图像拼接应用时, 由于其低功耗特性以及高效的计算能力, ORBed算法表现出优异的性能表现
ORB在opencv中
通常在OpenCV中会调用cv.ORB()函数或通过Feature2D通用接口构造一个ORB对象。该类提供若干可选参数其中nFeature是最常用的一个,默认值设为500用于对特征进行排序的方法包括Harris和FAST(默认采用Harris方法)等另一个重要的参数是WTA_K在OROB(Oriented FAST and Rotated BRIEF)算法中用于确定每个oriented_BRIEF描述符所包含的像素点数量,默认设置为2在这种情况下进行特征匹配时,则应采用NORM_HAMMING范数计算距离当WTA_K设为3或4时则建议将匹配距离设定为NORM_HAMMING2
原文中代码如下
import cv2
import numpy as np
from matplotlib import pyplot as plt
img = cv2.imread('1.jpg',0)
# Initiate ORB detector
orb = cv2.ORB_create()
# find the keypoints with ORB
kp = orb.detect(img,None)
# compute the descriptors 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()
img1 = cv2.drawKeypoints(img, kp, None, color=(255,0,0))
cv2.imwrite('brief.png',img1)
代码解读
最终结果

ORB 特征匹配会在后面介绍。
