Opencv4 -Python官方教程学习笔记34---ORB
理论
是斑块的大小。
现在,对于描述符,ORB使用Brief描述符。但是我们已经看到,BRIEF的旋转性能很差。因此,ORB所做的就是根据关键点的方向“引导” BRIEF。对于位置(xi,yi) 上n个二进制测试的任何特征集,定义一个2×n矩阵S,其中包含这些像素的坐标。然后使用面片的方向θ,找到其旋转矩阵并旋转S以获得转向(旋转)版本Sθ
。
ORB将角度离散化为2π30 (12度)的增量,并构造了预先计算的Brief模式的查找表。只要关键点方向θ在各个视图中一致,就将使用正确的点集Sθ来计算其描述符。 BRIEF具有一个重要的特性,即每个位特征具有较大的方差,且均值接近0.5。但是,一旦沿关键点方向定向,它就会失去此属性,变得更加分散。高方差使功能更具区分性,因为它对输入的响应不同。另一个理想的特性是使测试不相关,因为从那时起每个测试都会对结果有所贡献。为了解决所有这些问题,ORB在所有可能的二进制测试中进行贪婪搜索,以找到方差高且均值接近0.5且不相关的测试。结果称为rBRIEF。 对于描述符匹配,使用了对传统LSH进行改进的多探针LSH。该论文说,ORB比SURF快得多,而SIFT和ORB描述符比SURF更好。在全景拼接等低功耗设备中,ORB是一个不错的选择。
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()
结果:
