视觉SLAM理论到实践系列(六)——特征点法视觉里程计(1)

视觉SLAM理论到实践系列文章

下面是《视觉SLAM十四讲》学习笔记的系列记录的总链接,本人发表这个系列的文章链接均收录于此

视觉SLAM理论到实践系列文章链接


下面是专栏地址:

视觉SLAM理论到实践专栏



前言

高翔博士的《视觉SLAM14讲》学习笔记的系列记录


视觉SLAM理论到实践系列(六)——特征点法视觉里程计(1)

特征点

视觉里程计的核心问题是如何根据图像估计相机运动。然而,图像本身是一个由亮度和色彩组成的矩阵,如果直接从矩阵层面考虑运动估计,将会非常困难。所以,比较方便的做法是:首先,从图像中选取比较有代表性的点。这些点在相机视角发生少量变化后会保持不变,于是我们能在各个图像中找到相同的点。然后,在这些点的基础上,讨论相机位姿估计问题,以及这些点的定位问题。在经典SLAM模型中,我们称这些点为路标。而在视觉SLAM中,路标则是指图像特征(Feature)。

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

在视觉里程计中,我们希望特征点在相机运动之后保持稳定,而灰度值受光照、形变、物体材质的影响严重,在不同图像间变化非常大,不够稳定。

特征点是图像里一些特别的地方。

角点的提取算法有很多,例如Harris角点、FAST角点、GFTT角点,等等。它们大部分是2000年以前提出的算法。

然而,在大多数应用中,单纯的角点依然不能满足我们的很多需求。例如,从远处看上去是角点的地方,当相机离近之后,可能就不显示为角点了。或者,当旋转相机时,角点的外观会发生变化,我们也就不容易辨认出那是同一个角点了。

为此,计算机视觉领域的研究者们在长年的研究中设计了许多更加稳定的局部图像特征,如著名的SIFT、SURF、ORB等等。相比于朴素的角点,这些人工设计的特征点能够拥有如下性质:

  1. 可重复性(Repeatability):相同的特征可以在不同的图像中找到。
  2. 可区别性(Distinctiveness):不同的特征有不同的表达。
  3. 高效率(Efficiency):同一图像中,特征点的数量应远小于像素的数量。
  4. 本地性(Locality):特征仅与一小片图像区域相关。

可以作为图像特征的部分:角点、边缘、区块

在这里插入图片描述

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

例如,当我们说“在一张图像中计算SFT特征点”时,是指“提取SIFT关键点,并计算SIFT描述子”两件事情。

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

描述子通常是一个向量,按照某种人为设计的方式,描述了该关键点周围像素的信息。描述子是按照“外观相似的特征应该有相似的描述子”的原则设计的。

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

历史上,研究者们提出过许多图像特征。它们有些很精确,在相机的运动和光照变化下仍具有相似的表达,但相应地计算量较大。其中,**SIFT(尺度不变特征变换,Scale-Invariant Feature Transform)**当属最为经典的一种。它充分考虑了在图像变换过程中出现的光照、尺度、旋转等变化,但随之而来的是极大的计算量。

另一些特征,则考虑适当降低精度和鲁棒性,以提升计算的速度。例如,FAST关键点属于计算特别快的一种特征点(注意,这里“关键点”的表述,说明它没有描述子),而ORB(Oriented FAST and Rotated BRIEF)特征则是目前看来非常具有代表性的实时图像特征。它改进了FAST检则子不具有方向性的问题,并采用速度极快的二进制描述子BRIEF(Binary Robust Independent Elementary Feature),使整个图像特征提取的环节大大加速。

ORB 特征

ORB特征由关键点和描述子两部分组成。它的关键点称为“Oriented FAST”,是一种改进的FAST角点,关于什么是FAST角点我们将在下文介绍。它的描述子称为BRIEF。因此,提取ORB特征分为如下两个步骤:

  1. FAST角点提取:找出图像中的“角点”。相较于原版的FAST,ORB中计算了特征点的主方向,为后续的BREF描述子增加了旋转不变特性。
  2. BRIEF描述子:对前一步提取出特征点的周围图像区域进行描述。ORB对BRIEF进行了一些改进,主要是指在BRIEF中使用了先前计算的方向信息。

下面分别介绍FAST和BRIEF。

FAST 关键点

FAST是一种角点,主要检测局部像素灰度变化明显的地方,以速度快著称。它的思想是:如果一个像素与邻域的像素差别较大(过亮或过暗),那么它更可能是角点。相比于其他角点检测算法,FAST只需比较像素亮度的大小,十分快捷。它的检测过程如下(如下图所示):

  1. 在图像中选取像素 p p p,假设它的亮度为 I p I_p Ip
  2. 设置一个阈值 T T T(比如, I p I_p Ip 的20%)
  3. 以像素 p p p 为中心,选取半径为 3 的圆上的 16 个像素点。
  4. 假如选取的圆上有连续的 N N N 个点的亮度大于 I p + T I_p+T Ip+T 或小于 I p − T I_p-T IpT,那么像素 p p p 可以被认为是特征点( N N N 通常取12,即FAST-12。其他常用的N取值为9和11,它们分别被称为FAST-9和FAST-11)。
  5. 循环以上四步,对每一个像素执行相同的操作。

在这里插入图片描述

在 FAST-12 算法中,为了更高效,可以添加一项预测试操作,以快速地排除绝大多数不是角点的像素。具体操作为,对于每个像素,直接检测邻域圆上的第 1,5,9,13 个像素的亮度。只有当这 4 个像素中有 3 个同时大于 I p + T I_p+T Ip+T 或小于 I p − T I_p-T IpT 时,当前像素才有可能是一个角点,否则应该直接排除。

这样的预测试操作大大加速了角点检测。此外,原始的FAST角点经常出现“扎堆”的现象。所以在第一遍检测之后,还需要用非极大值抑制(Non-maximal suppression),在一定区域内仅保留响应极大值的角点,避免角点集中的问题。

FAST 特征点的计算仅仅是比较像素间亮度的差异,所以速度非常快,但它也有重复性不强分布不均匀的缺点。

此外,FAST 角点不具有方向信息

同时,由于它固定取半径为 3 的圆,存在尺度问题:远处看着像是角点的地方,接近后看可能就不是角点了。

针对FAST角点不具有方向性和尺度的弱点,ORB添加了尺度旋转的描述。尺度不变性由构建图像金字塔,并在金字塔的每一层上检测角点来实现。而特征的旋转是由灰度质心法(Intensity Centroid)实现的。

金字塔是计算图视觉中常用的一种处理方法,示意图如下图所示。

在这里插入图片描述

金字塔底层是原始图像。每往上一层,就对图像进行一个固定倍率的缩放,这样我们就有了不同分辨率的图像。较小的图像可以看成是远处看过来的场景。

在特征匹配算法中,我们可以匹配不同层上的图像,从而实现尺度不变性。例如,如果相机在后退,那么我们应该能够在上一个图像金字塔的上层和下一个图像金字塔的下层中找到匹配。

在旋转方面,我们计算特征点附近的图像灰度质心。所谓质心是指以图像块灰度值作为权重的中心。其具体操作步骤如下:

  1. 在一个小的图像块B中,定义图像块的矩为
    m p q = ∑ x , y ∈ B x p y q I ( x , y ) , p , q = { 0 , 1 } m_{pq}=\sum_{x,y\in B}x^{p}y^{q}I(x,y),\quad p,q=\{0,1\} mpq=x,yBxpyqI(x,y),p,q={0,1}

  2. 通过矩可以找到图像块的质心:
    C = ( m 10 m 00 , m 01 m 00 ) C=\left(\frac{m_{10}}{m_{00}},\frac{m_{01}}{m_{00}}\right) C=(m00m10,m00m01)

  3. 连接图像块的几何中心 O O O 与质心 C C C,得到一个方向向量 O C → \overrightarrow{OC} OC ,于是特征点的方向可以定义为
    θ = arctan ⁡ ( m 01 m 10 ) \theta=\arctan(\frac{m_{01}}{m_{10}}) θ=arctan(m10m01)

通过以上方法,FAST 角点便具有了尺度与旋转的描述,从而大大提升了其在不同图像之间表述的鲁棒性。所以在 ORB 中,把这种改进后的 FAST 称为 Oriented FAST。

BRIEF 描述子

在提取 Oriented FAST 关键点后,我们对每个点计算其描述子。ORB 使用改进的 BRIEF 特征描述。我们先来介绍 BRIEF。

BRIEF 是一种二进制描述子,其描述向量由许多个 0 和 1 组成,这里的 0 和 1 编码了关键点附近两个随机像素(比如 p p p q q q)的大小关系:如果 p p p q q q 大,则取 1,反之就取 0。如果我们取了128个这样的 p , q p,q p,q ,则最后得到128维由0、1组成的向量。

BRIEF算法的核心思想是在关键点P的周围以一定模式选取N个点对,把这N个点对的比较结果组合起来作为描述子。为了保持踩点固定,工程上采用特殊设计的固定的pattern来做

在这里插入图片描述

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

原始的 BRIEF 描述子不具有旋转不变性,因此在图像发生旋转时容易丢失。而 ORB 在 FAST 特征点提取阶段计算了关键点的方向,所以可以利用方向信息,计算旋转之后的“Steer BRIEF”特征使 ORB 的描述子具有较好的旋转不变性。

由于考虑到了旋转和缩放,ORB 在平移、旋转和缩放的变换下仍有良好的表现。同时,FAST 和 BRIEF 的组合也非常高效,使得 ORB 特征在实时 SLAM 中非常受欢迎。

特征匹配

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

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

然而,由于图像特征的局部特性,误匹配的情况广泛存在,而且长期以来一直没有得到有效解决,目前已经成为视觉SLAM中制约性能提升的一大瓶颈。部分原因是场景中经常存在大量的重复纹理,使得特征描述非常相似。在这种情况下,仅利用局部特征解决误匹配是非常困难的。

在这里插入图片描述

让我们先来看正确匹配的情况,等做完实验再讨论误匹配问题。

考虑两个时刻的图像。如果在图像 I t I_t It 中提取到特征点 x t m , m = 1 , 2 , ⋯   , M x^m_t,m=1,2,\cdots,M xtm,m=1,2,,M,在图像 I t + 1 I_{t+1} It+1 中提取到特征点 x t + 1 n , n = 1 , 2 , ⋯   , N x^n_{t+1},n=1,2,\cdots,N xt+1n,n=1,2,,N,如何寻找这两个集合元素的对应关系呢?

最简单的特征匹配方法就是暴力匹配(Brute-Force Matcher)。即对每一个特征点 x t m x^m_t xtm 与所有的 x t + 1 n x^n_{t+1} xt+1n 测量描述子的距离,然后排序,取最近的一个作为匹配,点。描述子距离表示了两个特征之间的相似程度,不过在实际运用中还可以取不同的距离度量范数。对于浮点类型的描述子,使用欧氏距离进行度量即可。而对于二进制的描述子(比如BRIEF这样的),我们往往使用汉明距离(Hamming distance)作为度量一两个二进制串之间的汉明距离,指的是其不同位数的个数

然而,当特征点数量很大时,暴力匹配法的运算量将变得很大,特别是当想要匹配某个帧和张地图的时候。这不符合我们在SLAM中的实时性需求。

此时,**快速近似最近邻(FLANN)**算法更加适合于匹配点数量极多的情况。由于这些匹配算法理论已经成熟,而且实现上也已集成到 OpenCV,所以这里就不再描述它的技术细节了。感兴趣的读者可以参考阅读文献[47]。

[47] M. Muja and D. G. Lowe,Fast approximate nearest neighbors with automatic algorithm configuration.,in VISAPP(1),pp.331-340,2009.

muja_flann.pdf

在这里插入图片描述

实践:特征提取与匹配

已知特征点匹配后:我们需要计算相机的运动:求取位姿

1.当相机为单目时,我们只知道2D的像素坐标,因而问题是根据两组2D点估计运动。该问题用对极几何解决

2.当相机为双目、RGB-D时,或者通过某种方法得到了距离信息,那么问题就是根据两组3D点估计运动。该间题通常用ICP解决

3.如果一组为3D,下组为2D,即,我们得到了一些3D点和它们在相机的投影位置,也能估计相机的运动。该问题通过PnP求解。

  • 21
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实现基于特征视觉里程功能,需要进行以下步骤: 1. 安装ROS(Robot Operating System)以及相关的依赖库。 2. 安装视觉SLAM(Simultaneous Localization and Mapping)框架,例如ORB-SLAM、LSD-SLAM、SVO等。 3. 准备相机和IMU(Inertial Measurement Unit)的数据,并进行预处理,例如去畸变、去重采样等。 4. 运行视觉SLAM框架,进行相机位姿的估和地图构建。 5. 将IMU数据与视觉SLAM的位姿进行融合,得到更准确的位姿估。 6. 对位姿进行优化和滤波,例如使用卡尔曼滤波、扩展卡尔曼滤波等。 以下是基于ORB-SLAM2实现基于特征视觉里程功能的具体步骤: 1. 安装ROS以及ORB-SLAM2和相关依赖库: ``` sudo apt-get install ros-kinetic-desktop-full sudo apt-get install ros-kinetic-libg2o sudo apt-get install ros-kinetic-libg2o-dev sudo apt-get install ros-kinetic-pcl-ros sudo apt-get install libglew-dev sudo apt-get install libboost-all-dev ``` 2. 下载ORB-SLAM2源代码并编译: ``` git clone https://github.com/raulmur/ORB_SLAM2.git cd ORB_SLAM2 chmod +x build.sh ./build.sh ``` 3. 准备相机和IMU数据,并进行预处理。可以使用ROS自带的相机驱动和IMU驱动,例如Intel RealSense相机和Intel RealSense IMU。 4. 运行ORB-SLAM2节点,进行相机位姿的估和地图构建: ``` rosrun ORB_SLAM2 Mono /path/to/vocabulary /path/to/settings ``` 其中,/path/to/vocabulary是ORB-SLAM2的词袋文件路径,/path/to/settings是ORB-SLAM2的配置文件路径。 5. 将IMU数据与ORB-SLAM2估的位姿进行融合,得到更准确的位姿估。可以使用IMU数据进行前向运动估和旋转估,然后将ORB-SLAM2估的位姿进行修正。 6. 对位姿进行优化和滤波。可以使用卡尔曼滤波、扩展卡尔曼滤波等进行位姿优化和滤波,得到更精确和稳定的视觉里程结果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值