特征点是什么
SLAM需要根据路标来计算当前相机的位置和姿态。而视觉SLAM的路标就是图像中的特征点了。注意:只要谈到图像中的特征点你就得记得它包含两个内容关键点和描述子。关键点指的特征点在图像中的位置,而描述子是指的是关键点的朝向和周围像素信息。相同特征点他们的描述子相似。
现在已有很多特征点提取算法。其中既能兼顾性能又能兼顾精度的一种特征点提取算法那就是:ORB特征点。前面我们提到了只要提到特征点那就意味着包含两个东西:关键点和描述子。
ORB特征点
ORB它的关键点叫做Oriented FAST,就是有方向的FAST关键点。ORB的描述子是BRIEF描述子。
我们现在先解释下什么是FAST关键点
FAST关键点
它的思想是任何物体的边缘一定是灰度值变化较大,那么我只用比较哪些地方灰度值变化较大。然后把这个地方作为关键点。然后它怎么做的呢?遍历整个图片的像素。为了判断一个像素是不是关键点,它在周围以3像素为半径画一个圈。这个圈上有16个像素点。比较当前像素点与这16个像素点的差异。当然我们需要设定一个阈值,差异度超过多少算高差异。然后统计高差异的像素点个数。FAST-12认为>=12个大差异的像素点那就把当前像素点设置为关键点,FAST-11是认为11个,FAST-9是认为9个。
ORB对FAST关键点的改进:
原始的FAST关键点存在缺点:
FAST关键点数量很大,而我们往往只想找固定数量的特征点。于是ORB对FAST算法进行改进:FAST选定的那些点的原始像素计算Harris响应值,然后选取前N个最大的。FAST-12就选12个最大的。
FAST关键点没有方向。然后ORB的改进就是说找到整个图像块的质点,关键点与质点的连线就是方向。
讲完关键点了接下来需要讲ORB使用的BRIEF(Binary Robust Independent Elementary Feature)描述子。
BRIEF描述子
描述子的作用是用来匹配两个特征点是否是同一个特征点。一般描述子的构造都是在关键点周围画个圈,对圈内的像素点进行计算得到一个向量。这个向量能反映这个关键点周围像素的特点。即它可以描述当前这个特征点的周围特性。因为相同的特征点周围肯定是相似的,所以可以用描述子来判断两个特征点是不是同一个。
而BRIEF描述子它是怎么提取周围像素的特征的呢?
它做法非常简单。就是从周围选N对像素点。比如说其中第i对像素点是(p,q)如果p比q大,描述子向量第i个值就是1,反之则是0. 描述子向量的维度是N。选N对像素点就是BRIEF-N。一般是随机选的。当然你也可以自己设计选取像素点的规则。
当然ORB对BRIEF也进行了改进,改进的方法是利用之前得到的关键点与质点的连线方向对图片进行旋转然后获取描述子。为什么要旋转?因为两个特征虽然长的一样,但是如果他们发生了旋转那么他们提取到的周围的特征那就很不一样的。这样会使得程序认为他们两个为不一样的特征点。
现在我们已经讲好了ORB特征点是什么,以及怎么获得。我怎么知道哪些是相同的特征点呢?(因为我们要根据相同特征点他们之间位置关系来计算出相机的位置和姿态关系),接下来介绍下如何判断两张图提取的特征点是否为同一个。
根据特征点的描述子比较特征点之间的相似度
我们已经知道ORB使用的描述子是一个二进制向量长得像这样:[1,0,1,0,0,1…]。那么怎么比较两个特征点相似度呢?最简单方法是暴力比较。如何度量相似度?我们直接比较数字相同的个数。由于都是二进制,进行XOR运算就很快计算出数字不同的个数。当特征点很多的时候暴力匹配很耗费时间,所以一般是用快速最近邻算法FLANN找相同特征点。
OpenCV已经集成了ORB特征点的提取算法。