ORB-SLAM策略思考之ORB特征点提取

ORB-SLAM策略思考之ORB特征点提取

image-20240118153936809

对于ORB特征点的原有策略,主要是使用图像金字塔的方式来解决特征的尺度问题,在ORB-SLAM系统中,就使用了8层缩放因子为1.2的图像金字塔去保证ORB特征的尺度不变性,而旋转不变性是通过特征点角度和BRIEF描述子实现的,其中特征点的角度主要通过灰度质心法进行计算,然后使用计算得到的角度对BRIEF描述子的模版进行角度旋转来解决旋转不变性问题。除此之外,ORB-SLAM系统还提出了一些更加奇特的方法,有特征点均匀化策略灰度质心计算加速策略

1. 特征点均匀化策略

  1. 对于openCV自带的ORB特征点的提取算法,会有特征点集中的情况方法,即特征点会在某些高图像特征梯度的部分,集中分布。
  2. 这种当这种情况方法时,有可能会使后续的位姿估计发生比较大的误差,因为特征都集中到了一块
  3. FAST双阈值分块检测策略
    1. 对待检测特征点的图像进行分块,对每一块图像进行FAST角点检测
    2. 通过设置双阈值的方法,来使得FAST角点尽量在每一块图像中都检测到,当降低FAST角点检测阈值后,还不能检测到的话,则舍弃该图像块的区域。
  4. 四叉树特征点筛选策略
    1. 对图像不停的进行均匀的四等分,其中特征点较多的部分先四等分,等到分块的区域大于等于要求提取的特征点数目后停止
    2. 这里值得注意的是,得到的图像块数目不一定能等于要求的特征点数目,这里解决策略如下:
      1. 在对每一个图像块进行分裂后,要及时检查是否已经达到特征点数目要求了,这样即使超出了特征点数目的要求,也只是比较少的分裂的图像块
      2. 对每个图像块中提取一个特征点,其的响应值一定是最大的
      3. 对这些特征点进行排序,只需要响应值大的部分,其余的剔除

2. 灰度质心法加速策略

加速灰度质心法

对普通的灰度质心法,其计算思路是这样的:

  1. 确定好灰度质心法计算所需要的半径大小
  2. 使用

    m

    10

    =

    x

    I

    (

    x

    ,

    y

    )

    m_{10}=sumsum xI(x,y)

    m10?=∑∑xI(x,y)计算出按x轴的灰度矩

  3. 使用

    m

    01

    =

    y

    I

    (

    x

    ,

    y

    )

    m_{01}=sumsum yI(x,y)

    m01?=∑∑yI(x,y)计算出按y轴的灰度矩

  4. 使用

    θ

    =

    arctan

    ?

    m

    10

    m

    01

    heta=arctan frac{m_{10}}{m_{01}}

    θ=arctanm01?m10??,可以计算出特征点的主方向

  5. 假设计算灰度质心的区域内,像素的数目为n个,这种计算方法中使用到乘法数目有2n次,且有一次的

    arctan

    ?

    arctan

    arctan算法

而ORB-SLAM对灰度质心法做了改良,使其速度得到了增加

  1. 确定好灰度质心法计算所需要的半径大小
  2. 对于红色的中心区域,其对应y轴上的灰度矩为0,只需要计算x轴方向上的矩即可
  3. 对于以红色轴对称部分的

    (

    x

    ,

    y

    )

    (x',y')

    (x′,y′)和

    (

    x

    ,

    ?

    y

    )

    (x',-y')

    (x′,?y′),其对应的x轴方向的灰度矩为

    m

    10

    =

    x

    (

    I

    (

    x

    ,

    y

    )

    +

    I

    (

    x

    ,

    ?

    y

    )

    )

    m_{10}=x'(I(x',y')+I(x',-y'))

    m10?=x′(I(x′,y′)+I(x′,?y′)),y轴方向的灰度矩为

    m

    01

    =

    y

    (

    I

    (

    x

    ,

    y

    )

    ?

    I

    (

    x

    ,

    ?

    y

    )

    )

    m_{01}=y'(I(x',y')-I(x',-y'))

    m01?=y′(I(x′,y′)?I(x′,?y′))。

  4. 最后,使用openCV中实现的快速计算

    arctan

    ?

    arctan

    arctan的算法来实现角度的计算

  5. 首先,使用这种方法,乘法的次数少于n次,并且计算

    arctan

    ?

    arctan

    arctan时也节省了时间