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