OpenCV  4.10.0
开源计算机视觉
加载中...
搜索中...
无匹配项
ORB(定向 FAST 和旋转 BRIEF)

目标

在本章中,

  • 我们将了解有关 ORB 的基础知识

理论

作为 OpenCV 爱好者,ORB 最重要的方面是它来自“OpenCV 实验室”。这一算法是由 Ethan Rublee、Vincent Rabaud、Kurt Konolige 和 Gary R. Bradski 在 2011 年发表的论文ORB:SIFT 或 SURF 的高效替代方案中提出的。顾名思义,它是 SIFT 和 SURF 的良好替代方案,在计算成本、匹配性能以及主要专利方面表现优异。是的,SIFT 和 SURF 已获得专利,您需要支付费用才能使用。但 ORB 没有!!!

ORB 基本上是通过融合 FAST 关键点检测器和 BRIEF 描述符,并进行多项修改来增强了性能。它首先使用 FAST 来查找关键点,然后应用 Harris 角点度量来查找其中的前 N 个点。它还使用金字塔来生成多尺度特征。但问题在于,FAST 不会计算方向。旋转不变性又如何呢?作者提出了以下修改。

它利用位于中心处角点的补丁来计算加权质心。从该角点到质心的向量的方向即为方向。为了改善旋转不变性,使用 x 和 y 来计算矩,其中 x 和 y 应在半径为 \(r\) 的圆形区域内,其中 \(r\) 为补丁的大小。

现在,对于描述符,ORB 使用 BRIEF 描述符。但我们已经看到,BRIEF 在旋转方面表现不佳。因此,ORB 所做的是根据关键点的方向“引导”BRIEF。对于在位置\((x_i, y_i)\)处的 \(n\) 个二进制测试的任何特征集,定义一个 \(2 \times n\) 矩阵 \(S\),它包含这些像素的坐标。然后使用补丁的方向 \(\theta\),找到其旋转矩阵并将 \(S\) 旋转以获取引导(旋转)版本 \(S_\theta\)。

ORB 将角度离散化为 \(2 \pi /30\)(12 度)的增量,并构建一个预先计算的 BRIEF 模式查找表。只要关键点方向 \(\theta\) 在各个视图中保持一致,就将使用正确的点集 \(S_\theta\) 来计算其描述符。

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', cv.IMREAD_GRAYSCALE)
# 初始 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()
void drawKeypoints(InputArray image, const std::vector< KeyPoint > &keypoints, InputOutputArray outImage, const Scalar &color=Scalar::all(-1), DrawMatchesFlags flags=DrawMatchesFlags::DEFAULT)
绘制关键点。
CV_EXPORTS_W Mat imread(const String &filename, int flags=IMREAD_COLOR)
从文件中加载图像。

请参阅下面的结果

图像

将在另一章节中介绍 ORB 特征匹配。

其他资源

  1. Ethan Rublee、Vincent Rabaud、Kurt Konolige、Gary R. Bradski:ORB:SIFT 或 SURF 的高效替代方案。ICCV 2011:2564-2571。

练习