ORB-SLAM2-ORB相关

ORB相关

FAST角点检测

FAST算法的主要思想为:如果一个像素与周围邻域的像素差别较大(过亮或者过暗),那么可以认为该像素是一个角点。
和SIFT、SURF相比,FAST算法只需要比较像素和其邻域像素的灰度值大小,计算量要小很多,但同时它也相对比较粗糙,精准性要差一些。
FAST算法的一般步骤为:

  1. 在图像中选取一个像素p,假设其灰度值为Ip
  2. 设定一个合适的阈值T
  3. 考虑以该像素点为中心的一个半径等于3像素的离散化的Bresenham圆,这个圆的边界上有16个像素
  4. 如果在这个大小为16个像素的圆上有n个连续的像素点,它们的像素值要么都比Ip+t大,要么都比Ip−t小,那么它就是一个角点。
    ORB-SLAM2-ORB相关

BRIEF特征描述子

  1. 定义
    BRIEF是一种二进制的描述子,其描述向量是0和1表示的二进制串。在特征点的周围选择128(位数根据实际情况设定)对这样的p和q的像素对,0和1表示p和q灰度值的大小:如果p比q大则选择1,反之就取0。就得到了128维由0,1组成的向量,也就是BRIEF特征描述子。
  2. p和q像素对的选取方式
    p和q的选取方式有很多种,大体上都是按照某种概率分布,随机地挑选 p 和 q 的位置。要注意,这个选取的模板一旦选好就固定下来了,在整个系统中一直使用这个模板,而不是每个特征点都要重新选一次。(ORB-SLAM2中已经给好了pattern,是在ORBextractor.cpp文件中定义的一个名为bit_pattern_31_的256*4个元素的静态数组,每四个数代表一对像素点,也就是说ORB-SLAM2中的BRIEF特征描述子是256位的)
    ORB-SLAM2-ORB相关
  3. 如何进行相似性判别
    BRIEF特征描述子的相似性由汉明距离来比较,也就是说,把两个BRIEF描述子按位进行比较,有多少个不相同的位数,他们的距离就是多少。

ORB做的改进

FAST和BRIEF的搭配有两个主要缺点:

  • 不具有尺度不变性
  • 不具有旋转不变性

ORB针对它们做出了改进:

  • 尺度不变性
    在ORB中使用图像金字塔,并且在每一层金字塔上检测角点。
    ORB-SLAM2-ORB相关
  • 旋转不变性
    利用灰度质心法,给每个特征点规定一个方向,在这个方向的基础上,用描述子进行描述。
    ORB-SLAM2-ORB相关

ORB-SLAM2对ORB做的改进

  1. 如何使提取的特征点在图像中分布得更均匀
    (1)如何解决弱纹理区域提取不到特征点的问题:
    a.将图像划分为多个区域进行提取(这样每个区域可以用不同的阈值
    b.先用正常阈值进行FAST特征提取,若提取不到特征点则降低阈值重新提取
    (2)如何解决某些区域提取特征点密度过高的问题
    采用四叉树的方法对特征点进行裁剪
    ORB-SLAM2-ORB相关

  2. 如何加速特征点的匹配以及提高匹配的正确性
    (1)根据图像金字塔与特征点尺度关系(SearchByProjection函数)
    对于双目或深度相机,在帧A中的提取到的特征点Pa和帧B中的Pb是具有深度信息的,结合Pa的深度信息、Pa在图像金字塔中的层数与Pb的层数,可以预测Pb所在的金字塔层数(有点绕,可以参考这篇文章
    (2)根据旋转主方向、最优匹配与次优匹配距离比,减少错误匹配:统计整张图片中所有描述子相对上一帧中匹配点描述子的旋转,如果某个描述子的旋转与整体有明显差别,则认为是错误的匹配(创建匹配器ORBmatcher时)
    (3)BoWs语法树缩小匹配范围(SearchByBoW函数)
    在匹配时只对有相同单词的特征点进行匹配。
    ORB-SLAM2-ORB相关
    (4)对于两个相邻帧,只在特征点坐标附近找匹配点(SearchForInitialization函数)
    对于两个相邻帧A和B,假设A帧中提取到了特征点Pa,它在A帧中的坐标是(x,y),那么我们在B帧中只在坐标(x,y)附近一个范围内寻找它的匹配点。(因为我们默认两帧之间移动的距离是有限的)
    (5)结合特征点深度与SE(3)、Sim(3)位姿,3D投影的方式缩小匹配范围(SearchBySim3,SearchByProjection)
    在利用恒速运动模型估计位姿之后,可以将当前帧观测到的2D特征点投影到3D坐标系,再进一步投影到上一帧的2D图像坐标系中,只对投影附近一个邻域内的点进行匹配。
    (5.5)利用投影剔除不必要的地图点(Fuse)
    (严格意义上说这个不算加速匹配,但是都是利用投影做的,所以就在这说了)
    在上一条中,如果被匹配的点本身已经有了mappoint了,那我们还是更相信原来已有的mappoint。就把当前这个mappoint给去掉。
    (6)根据极线约束减少错误匹配(CheckDistEpipolarLine)
    ORB-SLAM2-ORB相关
    A帧中观测到的某个特征点,在B帧中一定对应某一条线,如果B帧中某个特征点离这条线过远,则认为不是匹配点。(对极几何知识,参考十四讲7.3)
    (7)根据当前帧对某mappoint的观测角度(isInFrustum函数)
    如果当前帧的观测角度与该mappoint的平均观测角度相差较大,则认为是错误匹配。

上一篇:TEB程序解析1(base_teb_edges.h)


下一篇:DDD和C#-限制对子实体的访问