ORB-SLAM中的ORB特征提取

ORB-SLAM中的ORB特征提取

0.提取流程概览

1.构造金字塔
2.提取FAST角点
3.利用灰度质心法,计算旋转角度 [公式]
4.计算旋转后的BRIEF描述子

1.构造金字塔

2.提取FAST角点

2.1 如何分配每一层提取的特征点数量

金字塔层数越高,图像的面积越小,所能提取到的特征数量就越小。基于这个原理,我们可以按照面积将特征点均摊到金字塔每层的图像上。我们假设第0层图像的宽为W,长为L ,缩放因子为s(这里的 )。那么整个金字塔总的面积为

那么,单位面积的特征点数量为

那么,第0层应分配的特征点数量为

接着那么,推出了第α层应分配的特征点数量为

实际上,OpenCV里的代码不是按照面积算的,而是按照边长来算的。也就是上面公式中的换成s。

2.2 什么是FAST角点,如何提取?

步骤见《视觉SLAM十四讲》P155
按照上述步骤对图像上每个像素处理一遍,可以获取大量的FAST角点。FAST角点容易出现扎堆现象,要用非极大值抑制再处理一遍(Non-maximal suppression)。TODO: NMS具体实施。非极大值抑制的方法使用的分数计算很简单,计算一个中心点与周围16个点灰度差绝对值的和最为分数:

为了选择响应最大的个角点,还需要计算一个Harris响应。最后,在每层中选择响应最大的 个特征点。TODO: Harris角点的计算。

3 Oriented FAST,旋转角度计算

ORB计算角度也比较简单,首先一个圆形区域的灰度质心,连接质心和圆心形成一个向量,这个向量的角度就是角点的角度。圆的半径取为15,因为整个patch一般取的是31×31的。
注意,现在我们已经把坐标系的圆心设在了关键点上,那么灰度质心为

角度就是

至此,不仅仅提取了FAST角点,还找出了角点的角度。这个角度可以用来指导描述子的提取,保证每次都在相同的方向上计算描述子,实现角度不变性。
这就是Oriented FAST。

4 计算Rotation-Aware BRIEF, rBRIEF

4.1 BRIEF描述子

BRIEF是一个二进制的描述子,计算和匹配的速度都很快。
BEIFE的计算步骤如下

BRIEF的匹配采用汉明距离,非常快,简单说就是看一下不相同的位数有多少个。如下的两个描述子,不同的位数为4。实际上我们选择的点对数为256,那么距离范围就是0~256。

4.2 Steer BRIEF

BRIEF描述子是没有考虑旋转不变性的,Steered BRIEF根据Oriented FAST计算出的角度,把原始的256个点对的坐标旋转之后,再取灰度。从而实现了旋转不变性。
在这里插入图片描述
原始的256个点对坐标为S ,旋转后的为

4.3 Rotation-Aware BRIEF

上述过程虽然解决了旋转问题,但是也造成了描述子一些性能的下降。TODO: 具体什么呢?我也没看明白,留着以后看吧。
这个问题的解决是使用了学习的方法,利用了大量的数据,选择出了效果最好的256个点对位置。
以后每次提取特征点都使用这256个位置

4.4 抗噪能力的提高

在计算BRIEF描述子的时候,ORB使用的不是每个点的灰度,而是周围5×5的patch的灰度。因此起到了低通滤过的效果,对噪声有更强的鲁棒性。

5. ORB-SLAM对ORB特征的改进

ORB-SLAM中并没有使用OpenCV的实现,因为OpenCV的版本提取的ORB特征过于集中,会出现扎堆的现象。这会降低SLAM的精度,对于闭环来说,也会降低一幅图像上的信息量。具体的对ORB-SLAM的影响可以参考另一篇文章
杨小东:[ORB-SLAM2] ORB特征提取策略对ORB-SLAM2性能的影响
ORB-SLAM中的实现提高了特征分布的均匀性。

最简单的一种方法是把图像划分成若干小格子,每个小格子里面保留质量最好的n个特征点。这种方法看似不错,实际上会有一些问题。当有些格子里面能够提取的数量不足n个的时候(无纹理区域),整幅图上提取的特征总量就达不到我们想要的数量。严重的情况下,SLAM就会跟丢喽

ORB-SLAM中的实现就解决了这么一个问题,当一个格子提取不到FAST点的时候,自动降低阈值。ORB-SLAM主要改进了FAST角点提取步骤。

1.对于金字塔的每一层。
2.划分格子,格子的大小为30×30pixels
3.单独对每个格子提取FAST角点,如果提取不到点,就降低FAST阈值。这样保证纹理较弱的区域也能提取到一些FAST角点。这一步可以提取大量的FAST点。
4.基于四叉树,均匀的选取个FAST点。
上述步骤中,基于四叉树的方法有点复杂,下面分析一下。

1.如果图片的宽度比较宽,就先把分成左右w/h份。一般的640×480的图像开始的时候只有一个node。
2.如果node里面的点数>1,把每个node分成四个node,如果node里面的特征点为空,就不要了,删掉。
3.新分的node的点数>1,就再分裂成4个node。如此,一直分裂。
4.终止条件为:node的总数量> ,或者无法再进行分裂。
然后从每个node里面选择一个质量最好的FAST点。
下面通过一张图说明这个问题

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值