SLAM前端(里程计一):ORB特征点提取

ORB特征 = Fast+描述子,Fast判断该点是不是特征点,描述子计算该特征点的方向信息。

1 Fast角点

(1)Fast规则

如下图,遍历每个像素点检测在像素点附近的圆形窗口上的16个像素的灰度,如果有n个连续点都比中心像素的灰度大或者小的话,这样的中心点就是FAST角点。n可以是12或者9。

SLAM前端(里程计一):ORB特征点提取_第1张图片

(2)非极大值已知剔除接近点

算法很可能检测出的角点彼此相邻,所以提出了使用非极大值抑制算法来去除一部分的相邻角点,思路是 为每一个检测到的角点计算它的响应大小(score function)。响应定义为中心点和它周围16个像素点的绝对偏差的和。比较两个相邻的角点响应值。值较低的角点将会被删除。

2 特征点描述子

(1)计算特征点灰度质心

计算当前图像块内的灰度总和:

                                                                         M = \sum_{x,y} I(x,y)

计算x方向上像素加权和:

                                                                     M_x = \sum_{x,y}x\cdot I(x,y)

计算y方向上像素加权和:

                                                                     M_y = \sum_{x,y}y\cdot I(x,y)

灰度质心坐标为C(M_x,M_y)

定义方向:\theta = atan2(M_y,M_x),即质心与形心连线的矢量方向。

可以理解成密度不同的规则立体,灰度质心类似该立体的质心,方向类似该立体形心与质心连线矢量方向。

(2)生成描述子

BRIEF是在一个特征点的邻域选择n对像素点(p,q),比较其灰度值大小,如果I(p)>I(q),则令其对应的值为1,否则为0,这样对n对像素比较之后,就形成一个长度为n的二进制向量。一般一般n取128、256或512,opencv默认为256。

第(1)步计算出了该特征点的方向,以该方向为y轴,顺时针垂直方向构建x轴,在该坐标系下选取n对匹配点。

注意:BRIEF原文作者提出了五种方法选择点对,但是ORBSLAM采用统计学习的方法选择点对集合,并且实际应用过程中ORB_SLAM已经训练好了。直接按照这种方法去计算获得256个点对就好。直接可以计算256维的描述子了。

 

训练方法如下:(只应用的话不用考虑)

首先建立300k个特征点测试集。对于测试集中的每个点,考虑其31x31邻域。这里不同于原始BRIEF算法的地方是,这里在对图像进行高斯平滑之后,使用邻域中的某个点的5x5邻域灰度平均值来代替某个点对的值,进而比较点对的大小。这样特征值更加具备抗噪性。另外可以使用积分图像加快求取5x5邻域灰度平均值的速度。

从上面可知,在31x31的邻域内共有(31-5+1)x(31-5+1)=729个这样的子窗口,那么取点对的方法共有M=265356种,我们就要在这M种方法中选取256种取法,选择的原则是这256种取法之间的相关性最小。怎么选取呢?

1)在300k特征点的每个31x31邻域内按M种方法取点对,比较点对大小,形成一个300kxM的二进制矩阵Q。矩阵的每一列代表300k个点按某种取法得到的二进制数。

2)对Q矩阵的每一列求取平均值,按照平均值到0.5的距离大小重新对Q矩阵的列向量排序,形成矩阵T。

3)将T的第一列向量放到R中。

4)取T的下一列向量和R中的所有列向量计算相关性,如果相关系数小于设定的阈值,则将T中的该列向量移至R中。

5)按照4)的方式不断进行操作,直到R中的向量数量为256。

通过这种方法就选取了这256种取点对的方法。这就是rBRIEF算法。

你可能感兴趣的:(SLAM)