ORB Feature Extraction with OpenCV
Oriented FAST and rotated BRIEF (ORB) 特征是 SLAM 中比较常用的一种图像特征。它的准确率并没有 SIFT 高,但是其计算速度更快,可以满足实时特征提取的需求。ORB 特征还具有旋转、尺度不变性的特点,因此很适合应用在 SLAM 场景中。
ORB 特征由 Key Point 和 Descriptor 两部分组成,其 key point 为改进的 FAST 角点,被称为 Oriented FAST 角点 – 它计算了角点的主方向,可以为后续的 BRIEF descriptor 增加旋转不变性。Descriptor 为改进的 BRIEF 描述子,克服了原始 BRIEF descriptor 在图像旋转时容易丢失的缺点。
FAST Corner Detector
Features from Accelerated Segment Test (FAST) 是一种角点检测算法,它检测相邻的像素亮度差异,如果差异较大,则认为该点可能是一个角点。该算法比较简单,因此速度很快。其检测过程如下:
- 在图像中选择像素点 p,记其亮度为 Ip。
- 选定阈值 t。
- 选取其周围半径为 3 的 16 个临近像素点。
- 若有连续 N 个像素点的亮度与 Ip 的差异大于 t,则认为 p 为特征点。
FAST 没有尺度不变性,可以通过构建图像金字塔的方式来弥补。Oriented FAST 还计算了特征点附近图像的灰度质心,连接图像块的几何中心和质心,将其定义为角点的方向。
BRIEF Descriptor
得到角点之后,我们需要“描述”角点的信息,这样才能对不同的角点进行区分,以便于后续做特征点的匹配。Binary Robust Independent Elementary Features (BRIEF) 是一种二进制的描述子,其描述向量由一组 0 / 1 表示,其计算效率很高。
BRIEF 首先对图片做平滑处理以抑制噪声。接着,以关键点为中心,选取一个 patch。在 patch 中选择一对点,如果点 p 的亮度高于点 q,则标记为 1;否则为 0。以这样的方式选取出 128 个像素对,构成了描述向量。像素对的选取是随机的,可以服从 Uniform,Gaussian 等分布。
由于 BRIEF 本身没有旋转不变性,Rotated BRIEF 利用之间计算的关键点方向信息,计算旋转后的 BRIEF 特征来弥补这一缺点。
ORB Feature with OpenCV
利用 OpenCV 检测 ORB 特征点并做匹配的代码(C++)如下。特征点匹配选用了最简单的暴力匹配方法,即分别计算两张图中所有的关键点描述向量的距离,选出其中距离最小的一对,认为是一个匹配。由于这里是二进制的描述向量,因此可以采用 Hamming 距离,即不同位的个数。
1 | // orb.cpp |
Makefile 如下:
1 | CC = g++ |
Results
随手拍了两张照片,相机视角有一个微小的移动。ORB 特征点本身如下:
所有的特征点匹配如下:
手动筛选出一些匹配得较好的特征点如下:
可以看到匹配结果还比较满意。有了特征点的匹配,下一步就可以计算相机的 pose 了。
Reference
[1] 视觉 SLAM 十四讲