作者丨卢涛@知乎
来源丨https://zhuanlan.zhihu.com/p/355441452
编辑丨3D视觉工坊
非完整版注释: https://github.com/smilefacehh/ORB-SLAM3-Note本文介绍ORB相关的一些概念,FAST特征点、BRIEF描述子、ORB如何改进得到旋转不变性,然后从工程实践上介绍金字塔图像每层特征分配数量如何计算、四叉树如何精简特征点。如果有理解上的错误,请您指正。
FAST特征点
提取流程:
1.以P为中心,选取半径为3的圆,共16个像素
2.判断1、9位置与P灰度差值(同正负)是否均超过阈值,如果没有,则不是角点
3.再判断1、9、5、13位置与P灰度差值(同正负)是否至少三个超过阈值,如果没有,则不是角点
4.设定阈值,如果超过连续9(或者12)个像素与P的灰度差值(分正负的)大于阈值,则认为P为角点
5.非极大值抑制。这一步是在提取了所有角点之后执行的,前面4步提取的角点会堆积,相邻的两个角点,删除灰度差值和(16个点与P的灰度差的和)更小的角点。
几种特征点的效率对比(来自网络)
特征点 SIFT SURF ORB FAST 单帧耗时(ms) 244 197 11 2.8ORB-SLAM给出的时间统计,ORB提取单帧耗时11ms,基本能达到30fps。

在特征点邻域随机选择(高斯分布)256对点坐标,比较点1与点2大小,小于取1,大于取0,构成256位二进制,即为描述子。通常用uchar*存储二进制描述子,16个字节,8位。
这里给FAST、BRIEF都加上旋转不变性。解释一下旋转不变性,如果没有,那么图像旋转一下,同一个位置可能不是FAST点了,计算的BRIEF跟原来的也不一样了。

在特征点周围取半径15的圆形邻域,计算灰度质心,点到质心的连线与水平方向夹角记为该特征点的方向,存angle属性。灰度质心计算公式:
FAST特征点有了方向,BRIEF的方向就好办了,256对点的参考坐标系是水平向右x,竖直向上y,把这个参考系旋转一下,x正向与上面红色箭头对齐。然后计算BRIEF描述子(steered BRIEF)就可以了。这样即便图像旋转了,BRIEF算出来还是一样的。但是steered BRIEF改变了一些性质,orb作者给出了下面这幅图。

先说说横纵坐标的含义。对100k个描述子按位(256位)相加计算均值,得到256个均值,记做变量x = {0.5, 0.5, 0.1, 0, 1, ...},再与0.5相减得到变量x' = |x - 0.5| = {0, 0, 0.4, 0.5, 0.5, ...},那么横坐标就是这里的x',纵坐标就是对应计数。再看直方图,BRIEF的横坐标集中在0处,也就是变量x集中在0.5处。意思就是对于描述子上的每一位的平均值大多数都非常接近0.5,也有平均值为0或者1的,只不过非常少,这些值就构成了一个高斯分布。直方图等价于对折之后的高斯分布,留一半。方差一目了然,BRIEF方差最大,而steered BRIEF所有描述子在各个位上的平均的分布则比较平均。至于为什么方差小,区分能力比较差,没太明白,有兴趣可以看看论文。
那么作者提出了rotated BRIEF,用大量的数据,选择出效果最好的256个点对位置,以后每次计算描述子都使用这256个坐标。
备注SIFT(来自网络):
1.高斯金字塔,尺度
2.相邻高斯金字塔减法,得到高斯差分图像,边缘特征显现
3.在高斯差分图像上检测特征点,像素点比周围8个,相邻高斯差分图像上9*2=18个像素点灰度值都大或都小,认为是特征点
4.像素梯度直方图,计算主方向
5.描述子,尺度*方向
每层特征点数量分配接下来是实际提取特征点的操作。首先计算图像金字塔,假设我们总共需要提取N个特征点,每层金字塔分配多少呢。很简单,根据图像面积比例分配,ORB-SLAM3实际是按图像边长比例来分配。第0层图像面积设为1,第1层根据尺度比例(逆尺度,0


微信扫码登录