orb特征提取
视觉SLAM十四讲的第七讲里面关于特征的部分的复习
为什么需要图像特征?
视觉SLAM里面依靠图像的变化感知周围的物体,以及相机的运动。
通俗一点的讲,就是在什么样的运动情况下,现实世界中的若干个点能够在相邻的两张图像中投影成当前的情况。
那么正常的思路就是将A图像中的一点经过射影,映射出去,然后把B图像中与之对应的点射影出去,两者的交点恢复到真实世界的点,然后通过更多点的约束点恢复相机的运动
在这个过程中很关键的一个点就是怎么知道,图像A中的一点在图像B中的一点的位置。特征的出现就是为了解决这个问题。
什么是特征?
对于特征(传统SLAM中叫做路标),脑海里冒出来的第一个想法可能是通过图像块的灰度值匹配,但是在实际情况下,由于光照、视角的变化,图像块的灰度值会发生比较明显的变化,基于图像块的匹配非常的不稳定。
特征用于SLAM主要要解决两个问题,第一:从两张图片中尽可能多的检测出相同的关键点,第二:从两张图片中尽可能的匹配出更多的特征点。也就是说这里有两个过程,检测和匹配。
检测过程需要特征中的关键点提取方法,匹配的过程需要特征中的关键点描述方法,所以特征就由着两部分组成:关键点和描述子
ORB特征
ORB特征的出现是为了解决SIFT特征的速度慢的问题,在关键点检测的方法上使用了FAST的方法,在描述上,使用了BRIEF的描述子
FAST的方法,非常的简单,就是在图像的像素位置上取一个半径为3的圆上的16个像素点,如果圆上有连续的N(9或者11)个点大于或者小于中心点的灰度值得20%,那么这个点就是关键点
考虑到半径是固定的,这对于相机的前后移动可能会产生不一致的结果,所以可以加上图像金字塔。同时某一块区域可能出现非常多相似的关键点,极有可能会导致误匹配,所以这里可以使用非极大值抑制对选取出来的关键点进行筛选
而且考虑到图像的旋转,可以使用灰度质心的方法获取图像的旋转描述
BRIEF描述子也较为的简单,就是在关键点的周边随机的选取128组点(p,q),如果p>q,那么就为1,如果p<1,那么就为0,这样就得到了有一个128维度的二进制的向量,在匹配的过程中,可以使用汉明距离,就是有多少个值是一样的(对于其他的浮点数的描述子可以考虑使用欧式距离)