目标
在本章中,算法
理论
做为OpenCV的狂热者,关于ORB的最重要的事情是它来自“ OpenCV Labs”。该算法由Ethan Rublee,Vincent Rabaud,Kurt Konolige和Gary R. Bradski在其论文《ORB:SIFT或SURF的有效替代方案》中提出。2011年,正如标题所述,它是计算中SIFT和SURF的良好替代方案成本,匹配性能以及主要是专利。是的,SIFT和SURF已得到专利,你应该为其使用付费。可是ORB不是!!!ide
ORB基本上是FAST关键点检测器和Brief描述符的融合,并进行了许多修改以加强性能。首先,它使用FAST查找关键点,而后应用Harris角测度在其中找到前N个点。它还使用金字塔生成多尺度特征。可是一个问题是,FAST没法计算方向。那么旋转不变性呢?做者提出如下修改。函数
它计算角点位于中心的贴片的强度加权质心。今后角点到质心的矢量方向肯定了方向。为了改善旋转不变性,使用x和y计算矩,它们应该在半径r的圆形区域中,其中r是斑块的大小。性能
如今,对于描述符,ORB使用Brief描述符。可是咱们已经看到,BRIEF的旋转性能不好。所以,ORB所作的就是根据关键点的方向“引导” BRIEF。对于位置图片上n个二进制测试的任何特征集,定义一个2×n矩阵S,其中包含这些像素的坐标。而后使用面片的方向θ,找到其旋转矩阵并旋转S以得到转向(旋转)版本图片,测试
ORB将角度离散化为图片(12度)的增量,并构造了预先计算的Brief模式的查找表。只要关键点方向θ在各个视图中一致,就将使用正确的点集来计算其描述符。code
BRIEF具备一个重要的特性,即每一个位特征具备较大的方差,且均值接近0.5。可是,一旦沿关键点方向定向,它就会失去此属性,变得更加分散。高方差使功能更具区分性,由于它对输入的响应不一样。另外一个理想的特性是使测试不相关,由于从那时起每一个测试都会对结果有所贡献。为了解决全部这些问题,ORB在全部可能的二进制测试中进行贪婪搜索,以找到方差高且均值接近0.5且不相关的测试。结果称为rBRIEF。对象
对于描述符匹配,使用了对传统LSH进行改进的多探针LSH。该论文说,ORB比SURF快得多,而SIFT和ORB描述符比SURF更好。在全景拼接等低功耗设备中,ORB是一个不错的选择。blog
OpenCV中的ORB
与往常同样,咱们必须使用函数cv.ORB()或使用feature2d通用接口来建立ORB对象。它具备许多可选参数。最有用的是nFeatures,它表示要保留的最大特征数(默认为500),scoreType表示是对特征进行排名的Harris分数仍是FAST分数(默认为Harris分数)等。另外一个参数WTA_K决定点数产生定向的BRIEF描述符的每一个元素。默认状况下为两个,即一次选择两个点。在这种状况下,为了匹配,将使用NORM_HAMMING距离。若是WTA_K为3或4,则须要3或4个点来生成Brief描述符,则匹配距离由NORM_HAMMING2定义。
下面是显示ORB用法的简单代码。接口
import numpy as np import cv2 as cv from matplotlib import pyplot as plt img = cv.imread('simple.jpg',0) # 初始化ORB检测器 orb = cv.ORB_create() # 用ORB寻找关键点 kp = orb.detect(img,None) # 用ORB计算描述符 kp, des = orb.compute(img, kp) # 仅绘制关键点的位置,而不绘制大小和方向 img2 = cv.drawKeypoints(img, kp, None, color=(0,255,0), flags=0) plt.imshow(img2), plt.show()
查看如下结果:图片
ORB特征匹配,咱们将在另外一章中进行。
附加资源1.Ethan Rublee, Vincent Rabaud, Kurt Konolige, Gary R. Bradski: ORB: An efficient alternative to SIFT or SURF. ICCV 2011: 2564-2571.