Ethan Rublee等人2011年在《ORB:An Efficient Alternative to SIFT or SURF》文章中提出了ORB算法。结合Fast与Brief算法,并给Fast特征点增加了方向性,使得特征点具有旋转不变性,并提出了构造金字塔方法,解决尺度不变性。
FAST:Feature From Accelerated Segment Test
BRIEF:Binary Robust Independent Elementary
下面图中有一个很小的角点,就在那个尖尖的位置,显然,一个尖尖的位置,是非常适合作为特征点的,事实上,所有棱角分明的图像区域,我们都能拿来作为特征点。
那么有什么好办法怎么得到尖尖的位置信息?
人眼只要一扫,就能找到它,然而这个过程是不自知的,不自知的过程,就不能交给我们的计算机来处理,计算机是个离散的系统,它只不过把我们的想法量化,然后确定无疑的一步一步执行。
对于计算机来说,一张图片,在它的“大脑”CPU中,就是一组像素点序列,因此,从计算机算法的角度考虑问题,这个问题其实是在问,尖尖的位置,和其它位置,在计算机存储的像素点序列中,怎么区分开?
好了,有了这个思路,那我们把这个像素区单独拿出来研究,杂一看,是黑乎乎的一团,周围好像有点不一样,似乎有章可循。我们可以把最黑的挑出来,作为圆心,画个圆。画多大?这个看我们的需要,这里不妨以三个像素点为半径画圆。
在圆周上现在有16个像素点,我们给它顺时针编号,为了方便起见,最上角编号为1。每个像素点的像素值设为I(x),我们把与中心点像素值差别很大的称为白点,设置一个阈值,比如10,差别大于10,就是白点,那么计算一下16个像素点和中心像素点的差,找出所有的白点。
直觉上,我们倾向于认为,如果连续的3/4个像素点,都和中心点黑白差异比较大,那我们有理由相信,这是一个与众不同的点,也就是我们关心的特征点。
事实上,如果我们拿出1,6,11,16号点,我们会发现,如果这四个点有一个不是白点,那么按照我们的定义,这个区域肯定不是特征点。
目前为止,我们已经得到尖尖的特征点。其它特征点,一样的方法。然后我们得到了第二个,第三个,......,如同下图
(下图仅仅找出部分特征点,过滤掉了很多,具体这里不讲)
图侵删,援引自:https://blog.csdn.net/guoyunfei20/article/details/78792770
关于FAST特征点提取算法的c++实现,参阅下面的文章。
https://www.cnblogs.com/polly333/p/5417353.html
那么问题来了,得到了好多特征点,怎么区分?
“要知道,视觉SLAM中,我们想要得到相机的运动轨迹,而输入信息是视频流,也就是只有一张张连续的照片,称之为帧,前后两帧图像中,同一个特征点出现在了图像上不同的位置,这是显而易见的,这不同的位置是怎么来的?显然是相机的位置,或者姿态发生了变化。
相机在连续的两个位姿下,拍摄了空间中同一位点,这个位点在两张照片中的像素坐标是不一样的,相机的空间位姿变换,和像素点的位置变换之间存在一个变换矩阵,这个矩阵描述了相机的平移和旋转变化。变换矩阵和相机自身的物理属性有关系,高翔的《视觉SLAM十四讲》中具体推导出了变换矩阵。有了变换矩阵,还有了特征点的在图像中的位置,我们就能得到相机的运动方程。用一个特征点得到的相机运动不可靠,同时,随着相机镜头的转变,之前的特征点可能消失,因此,我们通常需要很多特征点,来保证slam过程的精确性和连续性。”
这就要回答第二个大问题,如何描述特征点。
我们已经解决了怎么找出一个特征点的问题,现在假如在一帧图像中得到了n个特征点,我们怎么区分开这些特征点?当然,如果只有一个图片,那直接给不同的特征点编个号,1,2,3,......n,显然对于SLAM来说,这是行不通的。为了描述运动,我们需要前后两张图中同一个特征点的像素坐标,那怎么找出同一个特征点来?
对于人来说,两张图中同一个特征好像轻而易举的就能被发现,这又是一个不自知的过程,那对于计算机,一切都是明确的可执行的。问题其实在问,如何让同一个特征点代表同一个数?即建立起不同特征点的一一映射关系。
orb SLAM用到了BRIEF算法。BRIEF在2010年的一篇名为《BRIEF:Binary Robust Independent Elementary Features》的文章中提出,是对已检测到的特征点进行描述,它是一种二进制编码的描述子。
算法步骤如下:
1、为减少噪声干扰,先对图像进行高斯滤波(方差为2,高斯窗口为9x9)。
2、以特征点为中心,取SxS的邻域窗口。在窗口内随机选取一对(两个)点,比较二者像素的大小,进行如下二进制赋值。
其中,p(x),p(y)分别是随机点x=(u1,v1),y=(u2,v2)的像素值。3、在窗口中随机选取N对随机点,重复步骤2的二进制赋值,形成一个二进制编码,这个编码就是对特征点的描述,即特征描述子。(一般N=256)
以上便是BRIEF特征描述算法的步骤。
关于一对随机点的选择方法,原作者测试了以下5种方法,其中方法(2)比较好。
引用自https://blog.csdn.net/hujingshuang/article/details/46910259
可以推测x,y呈现同一高斯分布时,特征子比较稳定。