ORB-SLAM策略思考之ORB特征点提取
![image-20240118153936809](https://i-blog.csdnimg.cn/blog_migrate/71a06b39bfe0397870d6baafabc16104.png)
对于ORB特征点的原有策略,主要是使用图像金字塔的方式来解决特征的尺度问题,在ORB-SLAM系统中,就使用了8层缩放因子为1.2的图像金字塔去保证ORB特征的尺度不变性,而旋转不变性是通过特征点角度和BRIEF描述子实现的,其中特征点的角度主要通过灰度质心法进行计算,然后使用计算得到的角度对BRIEF描述子的模版进行角度旋转来解决旋转不变性问题。除此之外,ORB-SLAM系统还提出了一些更加奇特的方法,有特征点均匀化策略和灰度质心计算加速策略。
1. 特征点均匀化策略
- 对于
openCV
自带的ORB
特征点的提取算法,会有特征点集中的情况方法,即特征点会在某些高图像特征梯度的部分,集中分布。 - 这种当这种情况方法时,有可能会使后续的位姿估计发生比较大的误差,因为特征都集中到了一块
- FAST双阈值分块检测策略
- 对待检测特征点的图像进行分块,对每一块图像进行FAST角点检测
- 通过设置双阈值的方法,来使得FAST角点尽量在每一块图像中都检测到,当降低FAST角点检测阈值后,还不能检测到的话,则舍弃该图像块的区域。
- 四叉树特征点筛选策略
- 对图像不停的进行均匀的四等分,其中特征点较多的部分先四等分,等到分块的区域大于等于要求提取的特征点数目后停止
- 这里值得注意的是,得到的图像块数目不一定能等于要求的特征点数目,这里解决策略如下:
- 在对每一个图像块进行分裂后,要及时检查是否已经达到特征点数目要求了,这样即使超出了特征点数目的要求,也只是比较少的分裂的图像块
- 对每个图像块中提取一个特征点,其的响应值一定是最大的
- 对这些特征点进行排序,只需要响应值大的部分,其余的剔除
2. 灰度质心法加速策略
![加速灰度质心法](https://i-blog.csdnimg.cn/blog_migrate/5c493a71c04e3e57a3fbd18ad4eee29d.png#pic_center)
对普通的灰度质心法,其计算思路是这样的:
- 确定好灰度质心法计算所需要的半径大小
- 使用 m 10 = ∑ ∑ x I ( x , y ) m_{10}=\sum\sum xI(x,y) m10=∑∑xI(x,y)计算出按x轴的灰度矩
- 使用 m 01 = ∑ ∑ y I ( x , y ) m_{01}=\sum\sum yI(x,y) m01=∑∑yI(x,y)计算出按y轴的灰度矩
- 使用 θ = arctan m 10 m 01 \theta=\arctan \frac{m_{10}}{m_{01}} θ=arctanm01m10,可以计算出特征点的主方向
- 假设计算灰度质心的区域内,像素的数目为n个,这种计算方法中使用到乘法数目有2n次,且有一次的 arctan \arctan arctan算法
而ORB-SLAM对灰度质心法做了改良,使其速度得到了增加
- 确定好灰度质心法计算所需要的半径大小
- 对于红色的中心区域,其对应y轴上的灰度矩为0,只需要计算x轴方向上的矩即可
- 对于以红色轴对称部分的 ( 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′))。
- 最后,使用
openCV
中实现的快速计算 arctan \arctan arctan的算法来实现角度的计算 - 首先,使用这种方法,乘法的次数少于n次,并且计算 arctan \arctan arctan时也节省了时间