如何提取、匹配图像特征点

描述

视觉 SLAM 主要分为视觉前端优化后端

前端也称为视觉里程计(VO)

VO 的实现方法,按是否需要提取特征,分为特征点法的前端以及不提特征的直接法前端

基于特征点法的前端,长久以来被认为是视觉里程计的主流方法。

本文,我们将从特征点法入手,学习如何提取、匹配图像特征点。

01

特征点

VO 的主要问题是如何根据图像来估计相机运动

我们习惯从图像中选取比较有代表性的点,然后,在此基础上,讨论相机位姿估计问题,以及这些点的定位问题。

在经典 SLAM 模型中,把它们称为路标,而在视觉 SLAM 中,路标则是指图像特征(Features)。

特征是图像信息的另一种数字表达形式

特征点是图像里一些特别的地方,我们可以把图像中的角点边缘区块作为图像特征的部分。

特征点由关键点(Key-point)和描述子(Descriptor)两部分组成。

当我们谈论 SIFT 特征时,是指 “提取 SIFT 关键点,并计算 SIFT 描述子” 两件事情。

关键点是指该特征点在图像里的位置,有些特征点还具有朝向、大小等信息。

描述子通常是一个向量,按照某种人为设计的方式,描述了该关键点周围像素的信息

描述子是按照 “外观相似的特征应该有相似的描述子” 的原则设计的。

因此,只要两个特征点的描述子在向量空间上的距离相近,就可以认为它们是同样的特征点。

在目前的 SLAM 方案中,ORB(Oriented FAST and Rotated BRIEF)特征是非常具有代表性的实时图像特征

它在保持特征子具有旋转,尺度不变性的同时,还会使整个图像特征提取的环节大大加速,对于实时性要求很高的 SLAM 来说是一个很好的选择。

因此,我们以 ORB 特征为代表,介绍提取特征的过程。

02

ORB 特征

ORB 特征亦由关键点和描述子两部分组成。

它的关键点称为 “Oriented FAST”,是一种改进的 FAST 角点;它的描述子称为 BRIEF

因此,提取 ORB 特征分为两个步骤:

1. FAST 角点提取:找出图像中的 “角点”。相较于原版的 FAST,ORB 中计算了特征点的主方向,为后续的 BRIEF 描述子增加了旋转不变特性。

2. BRIEF 描述子:对前一步提取出特征点的周围图像区域进行描述。

下面我们分别介绍FAST 和BRIEF。

FAST 关键点

FAST 是一种角点,主要检测局部像素灰度变化明显的地方,以速度快著称。

它的思想是:如果一个像素与它邻域的像素差别较大(过亮或过暗),那它更可能是角点。

相比于其他角点检测算法,FAST 只需比较像素亮度的大小,十分快捷。

但它也有一些问题。

首先,FAST 特征点数量很大且不确定

其次,FAST 角点不具有方向信息

所以,在 ORB 中,我们对原始的 FAST 算法进行了改进。

我们指定最终要提取的角点数量 N,对原始 FAST 角点分别计算 Harris 响应值,然后选取前 N 个具有大响应值的角,作为最终的角点集合。

同时,针对 FAST 角点不具有方向性和尺度的弱点,ORB 添加了尺度和旋转的描述

我们把改进后的 FAST 称为 Oriented FAST。

BRIEF 描述子

在提取 Oriented FAST 关键点后,我们对每个点计算其描述子。

ORB 使用的是改进的 BRIEF 特征描述。

BRIEF 是一种二进制描述子,它的描述向量由许多个 0 和 1 组成,这里的 0 和 1 编码了关键点附近两个像素(比如说 p 和 q)的大小关系:如果 p 比 q 大,则取 1,反之就取 0。

BRIEF 使用了随机选点的比较,速度非常快,而且由于使用了二进制表达,存储起来也十分方便,适用于实时的图像匹配。

原始的 BRIEF 描述子不具有旋转不变性,因此在图像发生旋转时容易丢失。

而 ORB 在 FAST 特征点提取阶段计算了关键点的方向,所以可以利用方向信息,计算了旋转之后的 “Steer BRIEF” 特征,使 ORB 的描述子具有较好的旋转不变性

由于考虑到了旋转和缩放,ORB 在平移、旋转、缩放的变换下仍有良好的表现。

同时,FAST 和 BRIEF 的组合也非常的高效,使得 ORB 特征在实时 SLAM 中非常受欢迎。

03

特征匹配

特征匹配是视觉 SLAM 中极为关键的一步,宽泛地说,特征匹配解决了 SLAM 中的数据关联问题(data association),即确定当前看到的路标与之前看到的路标之间的对应关系

通过对图像与图像,或者图像与地图之间的描述子进行准确的匹配,可以为后续的姿态估计,优化等操作减轻大量负担。

然而,由于图像特征的局部特性,误匹配的情况广泛存在,且长期以来没有得到有效解决,目前已经成为视觉 SLAM 中制约性能提升的一大瓶颈。

部分原因是因为场景中经常存在大量的重复纹理,使得特征描述非常相似。

在这种情况下,仅利用局部特征解决误匹配是非常困难的。

不过,现在我们先来看正确匹配的情况。

考虑两个时刻的图像。如果在图像 It 中提取到特征点 xmt,m = 1,2,……,M,在图像 It+1 中提取到特征点 xnt+1,n = 1,2,……,N,如何寻找这两个集合元素的对应关系呢?

最简单的特征匹配方法就是暴力匹配,即对每一个特征点 xmt,与所有的 xnt+1 测量描述子的距离,然后排序,取最近的一个作为匹配点

描述子距离表示了两个特征之间的相似程度,不过在实际运用中还可以取不同的距离度量范数

对于浮点类型的描述子,使用欧氏距离进行度量即可。

而对于二进制的描述子(比如 BRIEF 这样的),我们往往使用汉明距离做为度量——两个二进制串之间的汉明距离,指的是它们不同位数的个数

然而,当特征点数量很大时,暴力匹配法的运算量将变得很大,特别是当我们想要匹配一个帧和一张地图的时候。

这不符合我们在 SLAM 中的实时性需求。

此时快速近似最近邻算法更加适合于匹配点数量极多的情况。

审核编辑:黄飞

 

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分