视觉SLAM笔记(30) 特征点法
1. 特征点法
视觉 SLAM 主要分为视觉前端和优化后端
前端也称为视觉里程计(VO)
它根据相邻图像的信息,估计出粗略的相机运动,给后端提供较好的初始值
VO 的实现方法,按是否需要提取特征,分为:
- 特征点法的前端
- 不提特征的直接法前端
基于特征点法的前端,长久以来(直到现在)被认为是视觉里程计的主流方法
它运行稳定,对光照、动态物体不敏感,是目前比较成熟的解决方案
从特征点法入手,了解如何提取、匹配图像特征点
然后估计两帧之间的相机运动和场景结构,从而实现一个基本的两帧间视觉里程计
2. 特征点
VO 的主要问题是如何根据图像来估计相机运动
然而,图像本身是一个由亮度和色彩组成的矩阵
如果直接从矩阵层面考虑运动估计,将会非常困难
所以,习惯于采用这样一种做法:
首先,从图像中选取比较有代表性的点,这些点在相机视角发生少量变化后会保持不变,所以会在各个图像中找到相同的点
然后,在这些点的基础上,讨论相机位姿估计问题,以及这些点的定位问题
在经典 SLAM 模型中,把它们称为 路标
而在视觉 SLAM 中,路标则是指图像特征(Features)
根据维基百科的定义
图像特征是一组与计算任务相关的信息,计算任务取决于具体的应用
简而言之, 特征是图像信息的另一种数字表达形式
一组好的特征对于在指定任务上的最终表现至关重要
所以多年来研究者们花费了大量的精力对特征进行研究
数字图像在计算机中以灰度值矩阵的方式存储
所以最简单的,单个图像像素也是一种“特征”
但是,在视觉里程计中,希望特征点在相机运动之后保持稳定
而灰度值受光照、形变、物体材质的影响严重
在不同图像之间变化非常大,不够稳定
理想的情况是,当场景和相机视角发生少量改变时,还能从图像中判断哪些地方是同一个点
因此仅凭灰度值是不够的,需要对图像提取特征点
特征点是图像里一些特别的地方
例如:
可以把图像中的角点、边缘和区块都当成图像中有代表性的地方
不过,更容易精确地指出,某两幅图像当中出现了同一个角点;
同一个边缘则稍微困难一些,因为沿着该边缘前进,图像局部是相似的;
同一个区块则是最困难的
发现,图像中的角点、边缘相比于像素区块而言更加“特别”,它们不同图像之间的辨识度更强
所以,一种直观的提取特征的方式就是在不同图像间辨认角点,确定它们的对应关系
在这种做法中,角点就是所谓的特征
然而,在大多数应用中,单纯的角点依然不能满足很多我们的需求
例如,从远处看上去是角点的地方,当相机走近之后,可能就不显示为角点了
或者,当旋转相机时,角点的外观会发生变化,也就不容易辨认出那是同一个角点
为此,计算机视觉领域的研究者们在长年的研究中,设计了许多更加稳定的局部图像特征
如:
- 尺度不变特征变换 SIFT(ScaleInvariant Feature Transform)
- SIFT改进版 SURF
- ORB(Oriented FAST and Rotated BRIEF)等等
相比于朴素的角点,这些人工设计的特征点能够拥有如下的性质:
- 可重复性(Repeatability):相同的“区域”可以在不同的图像中被找到
- 可区别性(Distinctiveness):不同的“区域”有不同的表达
- 高效率(Efficiency):同一图像中,特征点的数量应远小于像素的数量
- 本地性(Locality):特征仅与一小片图像区域相关
特征点由关键点(Key-point)和 描述子(Descriptor)两部分组成
比方说,当谈论 SIFT 特征时,是指“提取 SIFT 关键点,并计算 SIFT 描述子”两件事情
- 关键点
指该特征点在图像里的位置,有些特征点还具有朝向、大小等信息 - 描述子
通常是一个向量,按照某种人为设计的方式,描述了该关键点周围像素的信息
描述子是按照“外观相似的特征应该有相似的描述子”的原则设计的
因此,只要两个特征点的描述子在向量空间上的距离相近,就可以认为它们是同样的特征点
历史上,研究者提出过许多图像特征
它们有些很精确,在相机的运动和光照变化下仍具有相似的表达,但相应地需要较大的计算量
其中, SIFT 当属最为经典的一种
它充分考虑了在图像变换过程中出现的光照,尺度,旋转等变化,但随之而来的是极大的计算量
所以在 SLAM 中甚少使用这种“奢侈”的图像特征
另一些特征,则考虑适当降低精度和鲁棒性,提升计算的速度
例如 FAST 关键点属于计算特别快的一种特征点(注意这里“关键点”的用词,说明它没有描述子)
而 ORB 特征则是目前看来非常具有代表性的实时图像特征
它改进了 FAST 检测子不具有方向性的问题,并采用速度极快的二进制描述子 BRIEF
使整个图像特征提取的环节大大加速
根据作者在论文中的测试,在同一幅图像中同时提取约 1000 个特征点的情况下, ORB 约要花费 15.3ms, SURF 约花费 217.3ms,SIFT 约花费 5228.7ms
由此可以看出 ORB 在保持了特征子具有旋转,尺度不变性的同时
速度方面提升明显,对于实时性要求很高的 SLAM 来说是一个很好的选择
大部分特征提取都具有较好的并行性,可以通过 GPU 等设备来加速计算
经过 GPU加速后的 SIFT,就可以满足实时计算要求
但是,引入 GPU 将带来整个 SLAM 成本的提升
3. ORB 特征
在目前的 SLAM 方案中, ORB 是质量与性能之间较好的折中
因此以 ORB 为代表,介绍提取特征的整个过程
ORB 特征亦由关键点和描述子两部分组成
- 它的关键点称为“Oriented FAST”,是一种改进的 FAST 角点
- 它的描述子称为 BRIEF(Binary Robust Independent Elementary Features)
因此,提取 ORB 特征分为两个步骤:
- FAST 角点提取:找出图像中的” 角点”
相较于原版的 FAST, ORB 中计算了特征点的主方向,为后续的 BRIEF 描述子增加了旋转不变特性 - BRIEF 描述子:对前一步提取出特征点的周围图像区域进行描述
3.1. FAST 关键点
FAST 是一种角点,主要检测局部像素灰度变化明显的地方,以速度快著称
它的思想是:如果一个像素与它邻域的像素差别较大(过亮或过暗) , 那它更可能是角点
相比于其他角点检测算法, FAST 只需比较像素亮度的大小,十分快捷
它的检测过程如下:
- 在图像中选取像素 ,假设它的亮度为 p
- 设置一个阈值 (比如 p 的 20%)
- 以像素 为中心, 选取半径为 3 的圆上的 16 个像素点
- 假如选取的圆上,有连续的
个点的亮度大于
p +
或小于
p −
那么像素 可以被认为是特征点
通常取 12,即为 FAST-12,其它常用的 取值为 9 和 11,分别称为 FAST-9, FAST-11 - 循环以上四步,对每一个像素执行相同的操作
在 FAST-12 算法中,为了更高效,可以添加一项 预测试操作,以 快速地排除绝大多数不是角点的像素
具体操作为,对于每个像素,直接检测邻域圆上的第 1, 5, 9, 13 个像素的亮度
只有当这四个像素中有三个同时大于
p +
或小于
p −
时
当前像素才有可能是一个角点,否则应该直接排除
这样的预测试操作大大加速了角点检测
此外,原始的 FAST 角点经常出现“扎堆”的现象
所以在第一遍检测之后,还需要用非极大值抑制(Non-maximal suppression)
在一定区域内仅保留响应极大值的角点,避免角点集中的问题
FAST 特征点的计算仅仅是比较像素间亮度的差异,速度非常快,但它也有一些问题
-
FAST 特征点数量很大且不确定,而往往希望对图像提取固定数量的特征
因此,在 ORB 中,对原始的 FAST 算法进行了改进
可以指定最终要提取的角点数量 ,对原始 FAST 角点分别计算 Harris 响应值
然后选取前 N 个具有最大响应值的角点,作为最终的角点集合 -
FAST 角点不具有方向信息
-
由于它固定取半径为 3 的圆,存在尺度问题:
远处看着像是角点的地方,接近后看可能就不是角点了
针对 FAST 角点不具有方向性和尺度的弱点, ORB 添加了尺度和旋转的描述
尺度不变性由构建图像金字塔,并在金字塔的每一层上检测角点来实现
而特征的旋转是由灰度质心法(Intensity Centroid)实现的
稍微介绍一下
质心是指以图像块灰度值作为权重的中心
其具体操作步骤如下:
- 在一个小的图像块 B 中,定义图像块的矩为:
- 通过矩可以找到图像块的质心:
- 连接图像块的几何中心 O 与质心 C,得到一个方向向量 ,于是特征点的方向可以定义为:
通过以上方法, FAST 角点便具有了尺度与旋转的描述,大大提升了它们在不同图像之间表述的鲁棒性
所以在 ORB 中,把这种改进后的 FAST 称为 Oriented FAST
3.2. BRIEF 描述子
在提取 Oriented FAST 关键点后,对每个点计算其描述子
ORB 使用改进的 BRIEF 特征描述
BRIEF 是一种 二进制 描述子,它的描述向量由许多个 0 和 1 组成
这里的 0 和 1 编码了关键点附近两个像素(比如说
和
)的大小关系:
如果
比
大,则取 1,反之就取 0
如果取了 128 个这样的
,
,最后就得到 128 维由 0, 1 组成的向量
在作者原始的论文中给出了若干种挑选方法,大体上都是按照某种概率分布,随机地挑选
和
的位置
BRIEF 使用了随机选点的比较,速度非常快
而且由于使用了二进制表达,存储起来也十分方便,适用于实时的图像匹配
原始的 BRIEF 描述子不具有旋转不变性的,因此在图像发生旋转时容易丢失
而 ORB 在 FAST 特征点提取阶段计算了关键点的方向
所以可以利用方向信息,计算了旋转之后的“Steer BRIEF”特征,使 ORB 的描述子具有较好的旋转不变性
由于考虑到了旋转和缩放,使得 ORB 在平移、旋转、缩放的变换下仍有良好的表现
同时, FAST 和 BRIEF 的组合也非常的高效,使得 ORB 特征在实时 SLAM 中非常受欢迎
4. 特征匹配
在展示了一张图像提取 ORB 之后的结果,下面来介绍如何在不同的图像之间进行特征匹配
特征匹配是视觉 SLAM 中极为关键的一步
宽泛地说,特征匹配解决了 SLAM 中的数据关联问题(data association)
即确定当前看到的路标与之前看到的路标之间的对应关系
通过对图像与图像,或者图像与地图之间的描述子进行准确的匹配
可以为后续的姿态估计,优化等操作减轻大量负担
然而,由于图像特征的局部特性,误匹配的情况广泛存在
而且长期以来一直没有得到有效解决,目前已经成为视觉 SLAM 中制约性能提升的一大瓶颈
部分原因是因为场景中经常存在大量的重复纹理,使得特征描述非常相似
在这种情况下,仅利用局部特征解决误匹配是非常困难的
不过,让先来看正确匹配的情况
考虑两个时刻的图像,如果
在图像
t 中提取到特征点 xmt , m = 1, 2,…, M
在图像
t+1 中提取到特征点
nt+1, n = 1, 2, …, N
最简单的特征匹配方法就是 暴力匹配(Brute-Force Matcher)
即对每一个特征点 xmt ,与所有的
nt+1测量描述子的距离
然后排序,取最近的一个作为匹配点,描述子距离 表示了两个特征之间的相似程度
不过在实际运用中还可以取不同的距离度量范数
对于浮点类型的描述子,使用欧氏距离进行度量即可
而对于二进制的描述子(比如 BRIEF 这样的),往往使用汉明距离(Hamming distance)做为度量
两个二进制串之间的汉明距离,指的是它们 不同位数的个数
然而,当特征点数量很大时,暴力匹配法的运算量将变得很大
特别是当想要匹配一个帧和一张地图的时候,这不符合在 SLAM 中的实时性需求
此时 快速近似最近邻(FLANN) 算法更加适合于匹配点数量极多的情况
这些匹配算法理论已经成熟,而且实现上也已集成到 OpenCV
参考:
相关推荐:
视觉SLAM笔记(29) g2o
视觉SLAM笔记(28) Ceres
视觉SLAM笔记(27) 非线性最小二乘
视觉SLAM笔记(26) 状态估计问题
视觉SLAM笔记(25) 拼接点云
谢谢!
转载:https://blog.csdn.net/qq_32618327/article/details/102403540