OpenCV 4.11.0
开源计算机视觉库
加载中…
搜索中…
无匹配项
ORB(Oriented FAST 和 Rotated BRIEF)

目标

在本章中,

  • 我们将学习 ORB 的基础知识。

理论

作为 OpenCV 爱好者,ORB 最重要的一点是它来自“OpenCV Labs”。该算法由 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 的矩,它们应该在一个半径为 \(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 描述符的每个元素的点数。默认为 2,即一次选择两个点。在这种情况下,对于匹配,使用 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_BGR)
从文件加载图像。

参见下面的结果

图像

ORB 特征匹配将在另一章中进行。

补充资源

  1. Ethan Rublee, Vincent Rabaud, Kurt Konolige, Gary R. Bradski: ORB: An efficient alternative to SIFT or SURF. ICCV 2011: 2564-2571。