视觉里程计:特征点法之ORB特征点

VO的核心问题在于根据图像信息估计相机的运动轨迹 。通常从图像中选取具有代表性的点,并当相机运动后,从不同的图像中找到对应的相同点,从而确定相机位姿估计问题。在经典SLAM模型中,称这种点为路标,而在视觉SLAM中,路标指图像特征(Feature)。

图像特征是一组与计算任务相关的信息,计算任务取决于具体的应用。也即,特征是图像信息的另一种数字表示形式。在视觉里程计中,希望特征点在相机运动后保持稳定。仅凭借灰度值无法实现稳定性,故而需要对图像提取特征点

特征点

特征点是图像中的一些特别的地方,如角点、边缘等具有明显辨识度的区域:

在这里插入图片描述

一种直观的特征提取方式就是再不同的图像中辨认角点,确定它们之间的关系。此类方式中,角点就是所谓的特征,通常有Harris角点、FAST角点、GFTT角点等算法。

实际应用中,单纯提取角点的效果并不好。故而研究者设计了许多更为稳定的局部图像特征如SIFT、ORB、SURF等,具有如下特点:

  • 可重复性:相同特征可在不同图像中找到
  • 可区别性:不同特征具有不同描述
  • 高效率:同一图像中,特征点数量远小于像素数量
  • 本地性:特征仅与一小片图像区域相关

特征点由关键点 (Key-point)和描述子 (Descriptor)两部分组成。关键点指该特征点在图像里的位置,部分特征点还包含朝向、大小等信息;描述子通常为一个向量,描述了关键点周围像素的信息。

描述子按照“外观相似的特征应该具备相似的描述子”的原则进行设计,故而当两个特征点的描述子在向量空间上的距离相近,称其为相同的特征点。

ORB特征

ORB特征的关键点称为 Oriented FAST ,是一种改进的FAST角点;它的描述子称为 BRIEF。提取ORB特征有如下两步组成:

  • FAST角点提取
    • 找到图像中的角点
    • 计算特征点的主方向
  • BRIEF描述子:
    • 对提取出的特征点周围图像区域进行描述

相较于原版FAST算法,ORB通过计算特征点的主方向,为后续BRIEF描述子提供了旋转不变特性。

FAST关键点

FAST主要检测局部像素灰度变化明显的地方,以速度快出名。算法的核心思想为:当一个像素同邻域像素有较大差别(过亮、过暗)时,认定其更可能为角点。

算法设计

算法设计思路如下:

  1. 选取像素点 p p p,假定其亮度为 I p I_p Ip
  2. 设置阈值 T T T
  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为特征点
  5. 对每个像素点进行循环执行上述步骤

对于 N N N,通常选取9、11、12个,分别称为FAST-9、FAST-11、FAST-12

在这里插入图片描述

预处理

为提高算法的搜索效率,在FAST-12算法中,增加了一步预处理过程:对每一个像素,只有当领域圆上的第1、5、9、13个像素点中任意三个像素点的亮度大于 I p + T I_p+T Ip+T或小于 I p − T I_p-T IpT,该像素点才可能为一个特征点,否则直接排除。

角点集中问题

原始FAST角点的检测通常容易出现扎堆现象,故而在第一遍检测过后,应使用非极大值抑制(Non-maximal suppression),在一定区域内仅保留响应极大值的角点,从而避免角点集中的问题存在。

算法优缺点

FAST特征点的计算仅比较像素间亮度的差异,故而计算速度较快。但相同它具有重复性不高、分布不均匀的缺点。FAST角点不具备特征点的方向信息,同时该算法固定取半径为3的圆,存在尺度问题:远处看着想角点,接近后就发现不是角点了。

为解决此类问题,ORB特征对FAST进行改进,得到Oriented FAST

Oriented FAST

尺度不变性

针对FAST存在的尺度问题,ORB构建图像金字塔,并在每一层上检测角点。

所谓金字塔是指对图像进行不同层次的下采样,从而得到不同分辨率的图像。金字塔底层为原始图像,每上一层,进行一次固定倍率的缩放。

在这里插入图片描述

在特征匹配算法中,将较小的图像看成远处看过来的场景,并在金字塔上不同层上的图像上进行匹配,从而实现尺度不变性。

旋转不变性

在旋转方面,采用灰度质心算法(Intensity Centroid)进行实现。对特征点附近的图像灰度质心进行计算,所谓质心是指图像块灰度值作为权值的中心,计算方式如下:

  • 在一个小的图像块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^py^qI(x, y),\qquad p,q=\{0,1\} mpq=x,yBxpyqI(x,y),p,q={0,1}

  • 通过矩找到图像的质心:
    C = ( m 10 m 00 , m 01 m 00 ) C=\Bigl(\frac{m_{10}}{m_{00}},\frac{m_{01}}{m_{00}}\Bigr) C=(m00m10,m00m01)

  • 连接图像块几何中心 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)

BRIEF描述子

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

BRIEF是一种二进制描述子,其描述向量由许多个0、1组成,此处的0、1编码了关键点附近两个随机像素(p、q)的大小:若p大于q,取1,反之取0。重复选取128组(或256、512组)随机的p、q点进行编码,最终得到一个128维的由0和1构成的特征向量BRIEF-128。

BRIEF描述子能够使得特征点对光照环境发生改变时,不受较大影响。这是由于在相同的光照下,所选的p、q点之间的对比不会发生改变,从而使得最终得到的特征向量能够表征图像的特征信息。

BRIEF选取p、q的方式是随机的,也可提前定义选择的方式:

在这里插入图片描述

如上图,定义了五种不同的选取方式(每条边的两端为选取的p、q点)。原始BRIEF描述子不具备旋转不变性,图像在发生旋转时容易丢失。

ORB特征点对其进行改进,根据提取Oriented FAST时得到的关键点方向,计算旋转后的 Steer BRIEF描述子,从而具有旋转不变性。

对于二进制描述子,采用汉明距离(Hamming distance)作为度量单位,也即不同位数的个数。

特征匹配

特征匹配解决了视觉SLAM中数据关联的问题,也即当前图像信息中看到的路标同之前图像信息中看到的路标之间的关系。

在这里插入图片描述
假设在上一帧图像信息 I t I_t It中提取到的特征点为 x t m m = 1 , 2 , ⋯   , M x_t^m\enspace m=1,2,\cdots,M xtmm=1,2,,M;而当前图像信息 I t + 1 I_{t+1} It+1中提取到的特征点为 x t + 1 n n = 1 , 2 , ⋯   , N x_{t+1}^n\enspace n=1,2,\cdots,N xt+1nn=1,2,,N,则对于特征匹配可使用暴力匹配(Brute-Force Matcher)或快速近似最近邻匹配(FLANN)算法进行。

  • 2
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
实现基于特征点视觉里程计功能,需要进行以下步骤: 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. 对位姿进行优化和滤波。可以使用卡尔曼滤波、扩展卡尔曼滤波等进行位姿优化和滤波,得到更精确和稳定的视觉里程计结果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值