OpenCV37: ORB | 定向FAST和旋转BRIEF

目标

在这一章当中,将学习

  • 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()

在这里插入图片描述

附加资源

猜你喜欢

转载自blog.csdn.net/uncle_ll/article/details/121660045
ORB