0. 前言
图像中有代表性的点(如:角点、边缘),在相机视角发生少量变化后保持(描述子)不变。这样就能在相邻图像中找到相同点,以此估计相机位姿和这些点的空间位置。称这些点为特征(或路标)。
与图像中提取的角点这样朴素的特征相比,人工设计的局部图像特征更具备尺度、旋转、光照等不变性,如SIFT,SURF、FAST、ORB等。特征点由关键点(特征点在图像中位置)和描述子(人为设计的向量,描述周围像素的信息)组成,提取关键点并计算描述子,由描述子的空间距离(实际中使用不同的距离度量范数,如浮点类型,用欧式距离;二进制类型,用汉明距离(不同位数的个数))远近代表特征点的相似程度。
然而,SIFT(Scale-Invariant Feature Transform)充分考虑了图像变换中出现的光照、尺度、旋转等变化,但计算量极大,对于CPU无法实现实时计算,只能用GPU加速计算以实现实时,但这也增加了计算成本。FAST关键点计算特别快,但没有描述子,所以使用FAST关键点的SVO可以在机载CPU上实现55fps的速度,但不能回环检测,容易丢失场景。ORB(Oriented Fast and Rotated BRIEF)改进FAST检测子不具备方向性问题,用速度极快的二进制描述子Brief,保证旋转、尺度不变性和快速性,是目前最好的选择。
1. ORB特征
1.1 Oriented Fast 关键点
FAST关键点检测过程:
(1) 选取像素p,其亮度为Ip;
(2) 设置阈值T(如20%*Ip);
(3) 以p为中心,以3为半径选取周围16个像素;
(4) 如果这16个像素中有连续的N(N可取12、11、9,对应FAST-12,FAST-11、FAST-9,其中FAST-12预测试操作:只有当邻域圆上第1、5、9、13像素中有3个同时大于或小于,当前像素p才可能是角点)个点的亮度大于Ip+T或小于Ip-T,则p可作为特征点。
(5) 对每个像素循环执行上述操作。
Tips:
(1) 原始FAST角点经常出现集中现象,需要非极大值抑制以在一定区域内保留响应极大值的角点。
(2) ORB需要在数量很大的FAST角点中提取前N个有最大Harris响应值的角点,作为最终的角点集合。
(3) FAST角点存在尺度问题:远看是角点,近看不是角点。ORB构建图像金字塔,对图像进行不同层次降采样,以模拟镜头远近观测,在金字塔每一层上检测角点实现尺度不变性。
(4) FAST角点不具备方向性。ORB用灰度质心法实现特征旋转的描述:连接图像块B的几何中心O和质心C,得到方向向量,特征点方向可定义为:
式中:
1.2 BRIEF描述子
0、1表示两个像素的大小关系;加入选取128个像素对,则可用128维由0、1组成的向量作为某一像素周围区域的描述;像素对的选取按某种概率分布。
2. 特征匹配
图像与图像,或图像与地图之间描述子匹配当前特征与之前看到的特征,以便于后续姿态估计、优化。
有暴力匹配、快速近似最近邻等方法。(opencv-BFMatcher)
由于特征的局部性,往往存在误匹配,制约SLAM性能。工程上可根据经验制定描述子匹配筛选依据(汉明距离小于最小距离的2倍),筛选出正确匹配的特征点;还有其他去除误匹配算法。
3. 单目相机,根据两组2D点用对极几何估计相机运动
对极几何中的三角形是由于平移出现的。
代入两像素点归一化平面上的坐标:
则:
等式两边与t做外积、左乘有:
,
得到对极约束:
或以P1,P2形式表示:
记:本质矩阵,基础矩阵,对极约束整理为:
则相机位姿估计步骤为:
(1)根据配对点的像素位置求出E或F(八点法、随即采样一致性RANSAC);
(2)根据E或F求出R,t (对E做SVD分解)。
讨论:
(1)为啥SVO代码中会分情况对特征点求E或H矩阵?因为无人机俯视拍摄,某些相邻帧特征点处于同一平面,则可以通过单应性矩阵H来描述处于共同平面上的一些点在两张图像之间的变换关系,相机位姿估计仍包括根据匹配点计算H阵(直接线性变换法);对H进行分解得到R与t(数值法、解析法)。
当特征点共面或相机发生纯旋转时,基础矩阵退化造成影响,通常会同时估计F与H,选择重投影误差较小的作为最终的运动估计矩阵。
(2) 对E分解时,通常把t进行归一化,会导致单目视觉的尺度不确定性,因此需要进行初始化,为后续的轨迹和地图提供单位。初始化方法:(1)对t进行归一化;(2)将特征点深度归一化(可以控制场景大小、计算数值更稳定)。
4. 通过三角测量/三角化,用相机运动估计特征点的空间位置。
三角化的矛盾:一方面,提高三角化精度的方法有提高特征点提取精度,即提高图像分辨率,但这会增大图像,增加计算成本;增大平移量,但会导致图像外观发生明显变化,使特征提取与匹配变得困难(平移太小,三角化精度不够)。
在SVO论文中提到用深度滤波器的方法定量计算每个特征点的位置及其不确定性。
我感觉三角化是几何方法,深度滤波器是数值迭代方法。