一步步带你看懂orbslam2源码--orb特征点提取(二)


ORB-SLAM2目录:

   一步步带你看懂orbslam2源码–总体框架(一)
   一步步带你看懂orbslam2源码–orb特征点提取(二)
   一步步带你看懂orbslam2源码–单目初始化(三)
   一步步带你看懂orbslam2源码–单应矩阵/基础矩阵,求解R,t(四)
   一步步带你看懂orbslam2源码–单目初始化(五)


回顾:
  上一节我们主要讲解了SLAM的基本分类,具体场景应用点以及目前现有的部分开源方案.最后讲解了ORB-SLAM2的总体框架和主要贡献.
  由于整个系统都是基于ORB特征点进行运行的,因此本章节将主要讲解ORB特征点的原理以及根据orb-slam2源码讲解实现细节.


理论环节
ORB特征点的原理

  特征点,顾名思义就是图片中具备明显特征的点.在许多学者长期的研究下,著名的特征点有诸如:SIFT,SURF,FAST,ORB等.通常我们说提取特征点,实际上则包括提取关键点计算描述子两个过程.

  SIFT特征点具备良好的尺度和方向不变性,而且对光照,抖动等噪声具有较强的鲁棒性.但由于SIFT的计算量比较大,根据orbslam2作者发表的论文"ORB-SLAM a Versatile and Accurate Monocular SLAM System"中可以知道,一张照片提取1000个SIFT特征点的平均时间为300ms,无法实现实时的SLAM系统,虽然后面有学者提出了在GPU加速下能够实现实时,但是毕竟实际的应用场景中,SLAM主要是为上层应用提高感知信息,理应不能占用过多的计算资源.而基于SIFT描述子改进的SURF描述子尽管提高了一个数量级的提取效率,但仍然无法满足SLAM系统的要求.

  FAST特征点则直接利用了关键点与周围像素点灰度值的关系,提取时间非常短,能够实现实时计算,但是FAST关键点不具备尺度和方向不变性,无法应用与SLAM系统.而ORB特征点则结合了一种改进的FAST关键点和BRIEF,具备有良好的尺度和方向不变性.提取一张照片的ORB特征点大约需要15ms,既实现了实时性,同时还保证了所提取特征点的可靠性.

  ORB特征点的提取是基于图像金字塔的,在不同尺度的图像上面提取Oriented FAST 关键点(增加了方向的FAST关键点)和 BRIEF 描述子,以此来实现尺度和方向的不变性,具体原理将在下文阐述.

提取FAST关键点

  检测像素点P是否为FAST关键点,首先以P点为中心,取半径为3的圆上的16个像素点,如上图所示.假设P点处的灰度值: I p I_p Ip,设定阈值 T T T,如果在这16个点当中,有连续 N N N( N N N通常取12,即为 FAST-12)个点不满足:
I p − T ≤ I p ≤ I p + T I_p-T\le I_p≤I_p+T IpTIpIp+T
  即判断该像素点P为FAST关键点.不过,通常为了再进一步的提高提取速度,大家都会先进行一步预测试操作,即先判断 P 点周围上下左右4个像素点,如果有3个点符合要求才进一步判断其他的像素点.但是如果仅仅是这样子提取,难免会出现特征点扎堆等情况.因此,我们通常在提取特征点的时候都会进行非极大值抑制(Non-maximal suppression),即在一小块区域内,只取最大Harris响应值的前 N N N个.

  你以为这样子就算提取FAST关键点完成了??其实并不然,ORB特征点提取的是Oriented FAST,即加入了方向,具体操作步骤如下:

至此,才算完成了FAST关键点的提取.

计算BRIEF描述子

  orbslam2中的brief描述子是一种二进制描述子,总共具有256bit,即32个字节的长度.每位bit为0或1.根据一定的点对选取规则选择点对,该选取规则应当使点对与点对之间的相关性最低(换言之,点对与点对之间尽量垂直,毕竟本科时候概率论中应该说过吧…哈哈哈…如果你有细看源码,你会发现在 ORBextractor.cc 文件中有一个bit_pattern_31_数组,里面就是存放了256点对的坐标 )并判断该点对两个像素点的灰度值大小(比如说 p p p q q q的关系, p > q p>q p>q则取1,否则取0)

图像金字塔的构建

  谈完了Oriented FAST关键点的提取和BRIEF描述子的计算,笔者还是觉得有必要讲解一下金字塔构建的机理,毕竟Oriented FAST和BRIEF的计算都是基于图像金字塔上面操作的.

  为什么要构建图像金字塔呢?假想你在很远的地方看到一个美女,真特么漂亮,但是你走近了之后发现,特么油光满面,满面痘痘…咳咳咳~~举这个例子呢,主要是为了说明在不同的距离情况下,观看同一事物会产生不同的结果,毕竟太远了,变模糊了,看不清了是吧.同样,在相机中也会发生这种情况,这个时候我们就人为的构造不同尺度的图像,来模拟不同距离下观看同一事物的结果,这就是传说中的图像金字塔.如果在进行尺度变换之前图片有进行高斯模糊过,即用高斯核进行卷积,则又可以称之为高斯图像金字塔.

  在opencv库中,pyrDown/pyrUp和resize都可以达到缩放图像的目的,区别是前者是先高斯模糊然后采样,后者通过插值的方法实现.很遗憾的是orbslam2中采用的是插值的方法(resize函数)(咳咳~这样我就不用去讲解麻烦的卷积过程了…真好…虽然后面还是有对金字塔的图片进行了高斯模糊…)

  如上,假设一张8×6的图片,尺度因子 s c a l e scale scale为2,意味着把原图像的 w i d t h width width h i g h t hight hight缩小为原来的 1 2 \dfrac{1}{2} 2

评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值