视觉里程计
转载自:https://www.guyuehome.com/46511
视觉里程计是VSLAM中的前端部分,而特征追踪是视觉里程计中的一个基础和关键的任务,它的作用是从两张或者多张图片中识别对应相同或相似的内容。通过追踪图像中局部特征在前后帧图像中的位置,可以实现视觉运动估计这个工作。
但是需要提及的是特征的抽取及匹配是整个VSLAM系统中最耗时的计算过程之一,所以如何实现快速且鲁棒的特征点检测匹配算法也是研究VSLAM一个重要的话题。
局部特征
图像的局部特征是一种用于描述图像中具有独特性、稳定性和可区分性的局部结构或纹理信息的方法,它可以有效地提高图像匹配的效果和精度。理想的局部特征就是一个点,在实际中,数字图像离散化时,最小单位是像素点,如果要定位某个像素点的话,必须分析该像素的邻域,所以任何局部特征都是隐式的包括一个空间范围。好的局部特征在图像的变换(如旋转、缩放、平移)下相对稳定,不会因为图像的变化而发生失效。由于全局特征容易受到噪声干扰,而局部特征比较稳定,常用于图像匹配。
举一个例子:想象一下我们做拼图游戏,需要把以下六个方块图案拼到下方图像对应位置,哪几个方块是最有把握的呢?
对于A和B,我们主要能看到的是大块的色块,其特征表现出一个面的结构,蓝色的天空都可以匹配上A,沿任何方向移动都可以,不存在唯一匹配的结果,对于B也是如此。这类结构作为特征来说是缺乏足够的区分度的。对于C和D,其中的线特征最为突出,在图中我们可以去找这些所有的线,但是我们也发现,沿着线的方向,其纹理也基本是一致的,我们可以找出线的约束方向,但却不好确定是在这个方向的哪个位置。最后来到EF,我们主要能看到一个角结构,相信大家很快就能找到其在图像中对应的位置,其中的角把两个方向都约束住了。而一定程度上角点可以代表这个角结构的位置。通过这个例子,我们可以发现点特征(如角点),相比于其他类型特征更具有区分度。
特征点的分类
常见的特征点分为角点与斑点两类,角点检测的算法主要是定位在图像中直线交叉或者曲率变化较大的像素点,传统的方法有基于梯度和基于密度等多种方法来找角点。相比于角点检测受噪声的影响较大的缺点,斑点检测的方法更容易获得鲁棒性和稳定性的特征,因为斑点更多的是代表一个封闭的区域/圆形区域。常见的角点检测算法如Harris、Shi-Tomasi,常见的斑点检测算法如SIFT、SURF。
基于特征的图像匹配流程主要分为三个部分,特征检测、特征描述和描述子匹配。一般特征点算法流程是先进行特征检测获取特征点在图像的位置,而后对特征点的邻域进行分析提取特征描述子。而在特征追踪时会比对不同图片上的特征描述子来获取描述子的匹配对。前两个步骤统称为特征点算法,也称特征提取。
特征描述也称特征的描述子计算,通常是将特征点周边的区域的一些信息转变为一个易于识别的形式,经常表示为一个高维的向量以此来比较两个特征点是不是相似。特征描述一般有两种方法,基于梯度的方法和基于强度的方法。基于梯度的方法常见的是根据区域内的像素梯度方向来生成描述子,基于强度的方法是通过比对特定位置像素点的强弱来生成描述子。常见的基于梯度的方法有SIFT和SURF等,基于强度的方法有LBP和BRIEF等。
常见的特征提取算法
SIFT
SIFT,全称为尺度不变特征变换(Scale-Invariant Feature Transform),是一种经典的特征点检测算法,该方法由加拿大教授大卫.劳伊(David G.Lowe)提取,他总结了基于不变量技术的特征检测方法,并1999年正式提出了一种基于尺度空间的、对图像缩放、旋转甚至仿射变换保持不变性的图像局部特征描述算子。
SIFT算法优缺点很明显,不仅具有尺度不变性,且在光照变化,图像旋转,视角变化中均有较好的不变性。缺点就是SIFT运算复杂度太高,很耗时。
SIFT算法的实质可以归为在不同尺度空间上查找特征,点(关键点)的问题。其包括特征点检测,特征点描述子计算及特征点匹配算法三块。接下来简述前面两个过程:
首先要知道,SIFT的本质是在不同尺度空间上寻找极值点。这里的尺度空间,模拟的是人眼镜观测事物的一个特点,即近大远小。近处的物体看起来大且清晰,远处的物体,看起来小且模糊。要把事物这种与观测位置有关的成像特点表达出来,常使用高斯图像金字塔来实现。
它首先从搭建图像金字塔开始,计算高斯差分图像金字塔。然后在同层及相邻层之间计算初始极值点。再使用泰勒展开计算精确极值点,其中会使用一些方法过滤掉低反应度的点及边缘点。最后使用特征点附近的梯度直方图计算主方向,并利用4x4个小方格中的8个主方向,形成128维的描述子。
接下来给出参考链接:SIFT算法
SURF
SIFT有着较好的效果,但是计算很耗时,这个特征计算也很复杂,大家就想怎么去改进它,因为它在找特征点时,一个卷积操作是比较耗时的,第二个就是在找到极值点后,还需要计算一个海森矩阵来去除边缘点,这一步也是比较耗时的,所以有学者就在想怎么去优化这几步。于是SURF诞生了。
SURF全称为Speeded Up Robust Features,由Herbert Bay等人在2006年提出。SURF算法主要分为三个步骤:尺度空间极值检测、关键点定位和方向分配。在尺度空间极值检测中,SURF使用了Hessian矩阵来检测图像中的稳定特征点。在关键点定位中,SURF使用了一种叫做“盒子滤波器”的算法来定位关键点。在方向分配中, SURF使用了一个类似于SIFT的方法来确定每个关键点的主方向。
与SIFT相比,SURF具有更快的计算速度和更好的尺度不变性。
参考链接如下:Surf算法特征点检测与匹配
ORB
ORB (Oriented FAST and Rotated BRIEF),是一种特征检测算子,其特征点的性能介于SIFT和SURF之间,但是其速度是SURF算法速度的10倍。
理解ORB需要对其含义有一些理解,ORB 是 Oriented Fast and Rotated Brief 的简称,也就是可以用来对图像中的关键点快速创建特征向量,这些特征向量可以用来识别图像中的对象。
其中,Fast 和 Brief 分别是特征检测算法和向量创建算法。ORB 首先会从图像中查找特殊区域,称为关键点。关键点即图像中突出的小区域,比如角点,比如它们具有像素值急剧的从浅色变为深色的特征。然后 ORB 会为每个关键点计算相应的特征向量。ORB 算法创建的特征向量只包含 1 和 0,称为二元特征向量。1 和 0 的顺序会根据特定关键点和其周围的像素区域而变化。该向量表示关键点周围的强度模式,因此多个特征向量可以用来识别更大的区域,甚至图像中的特定对象。
ORB 的特点是速度非常快,而且在一定程度上不受噪点和图像变换的影响,例如旋转和缩放变换等。
参考链接如下:Oriented FAST and Rotated BRIEF
补充链接:
sift的C++实现:https://github.com/phoenix16/SIFT
surf的C++实现:https://github.com/JairFrancesco/OpenSurf