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

目标

在本章中,

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

理论

作为OpenCV爱好者,关于ORB最重要的事情是它来自“OpenCV实验室”。该算法由Ethan Rublee、Vincent Rabaud、Kurt Konolige和Gary R. Bradski在他们2011年的论文ORB: An efficient 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)\)处的\(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)
从文件加载图像。

请参阅下面的结果

image

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

附加资源

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