1、特征点法的缺点
特征点法具有以下缺点:
1、关键点的提取与描述子的计算非常耗时
2、特征点的数量远小于图像像素数量,只使用特征点丢弃了大部分可能有用的图像信息
3、相机有时会运动到特征缺失的地方,往往这些地方没有明显的纹理信息,从而使得特征点数目减少,无法估计运动
克服特征点法缺点的思路:
1、只计算关键点,不计算描述子。使用光流法跟踪特征点的运动,回避计算和匹配描述子带来的时间
2、只计算关键点,不计算描述子。使用直接法计算特征点在下一时刻图像的位置
3、不使用特征点,而是根据像素灰度的差异,直接计算相机运动
第一种方法仍然使用特征点,只是把匹配描述子替换成了光流跟踪
后面两个方法中,根据图像的像素灰度信息来计算相机运动,它们都称为直接法
使用特征点法估计相机运动时,把特征点看作固定在三维空间的不动点,通过最小化重投影误差优化相机运动,这需要精确地知道空间点在两个相机中投影后的像素位置
在直接法中,不需要知道点与点之间之间的对应关系,通过最小化光度误差优化相机运动
特征点法只能重构稀疏地图,而直接法分为稀疏、稠密和半稠密三种
2、光流
光流是一种描述像素随着时间,在图像之间运动的方法。计算部分像素运动的称为稀疏光流,计算所有像素的称为稠密光流
稀疏光流以 Lucas-Kanade(LK) 光流为代表,可以在 SLAM 中用于跟踪特征点位置
将图像看作时间的函数:I(t)。那么,一个在 t 时刻,位于 (x,y) 处的像素,它的灰度可以写成:
含义是某个空间点位于 t 时刻图像的 (x, y) 像素的深度
光流法用到 灰度不变假设:同一个空间点的像素灰度值,在各个图像中是固定不变的
对于 t 时刻位于 (x,y) 处的像素,设 t + dt 时刻,它运动到 (x + dx,y + dy) 处。由于灰度不变:
对上式左边进行泰勒展开:
从而有:
两边除以 dt:
是像素在 x 轴的运动速度,
是像素在 y 轴的运动速度,记为
;
是 I 在 x 方向的梯度,
是 I 在 y 方向的梯度,记为
上式的矩阵形式为:
这是带有两个变量的一次方程,为了求解,需要增加约束
假设一个 w×w 大小的窗口中所有像素点具有相同的运动,可以得到 w×w 个约束:
设:
将约束用一个方程表示:
上式的最小二乘解是( 与
同解):
3、直接法
考虑某个空间点 P 和两个时刻的相机。P 的世界坐标为 ,它在两个相机(内参相同)上成像,记非齐次像素坐标为
,
。以第一个相机为参照系,设第二个相机旋转和平移为 R,t,对应李代数为 ξ
投影方程:
在直接法中,由于没有特征匹配,无从知道哪一个 与
对应着同一个点
直接法的思路是根据当前相机的位姿估计值,来寻找 的位置。但若相机位姿不够好,
的外观和
会有明显差别。于是,为了减小这个差别,优化相机的位姿,寻找与
更相似的
,在这个过程中最小化的不是重投影误差,而是光度误差:
在直接法中,假设一个空间点在各个视角下,成像的灰度是不变的。由于有许多个(比如 N 个)空间点 ,那么,整个相机位姿估计问题变为:
使用李代数的扰动模型,左乘一个小扰动:
记(q 是旋转空间点受扰后的位置,u 是旋转空间点受扰后的像素坐标):
将式子泰勒展开:
其中, 是投影方程关于相机坐标系下的三维点的导数。记
,则:
两式相乘后
误差相对于李代数的雅可比矩阵:
得到雅可比矩阵后即可使用最小二乘法进行迭代求解
根据 P 的来源,可以将直接法分类:
1、P 来自稀疏关键点,则称为稀疏直接法。稀疏直接法不必计算描述子,并且只使用数百个像素,因此速度最快,但只能计算稀疏的重构
2、P 来自部分像素,则称为半稠密直接法。如果像素梯度为零,整一项雅可比就为零,不会对计算运动增量有任何贡献。因此,可以考虑只使用带有梯度的像素点,舍弃像素梯度不明显的地方。这种方法可以重构半稠密结构
3、 P 是所有像素,则称为稠密直接法。由于像素点太多,多数CPU无法实时计算,需要GPU加速
直接法的优点:
1、省去计算特征点和描述子的时间
2、算法执行需要像素梯度,不需要特征点
3、可以构建半稠密甚至稠密地图
直接法的缺点:
1:、非凸性。直接法完全依靠梯度搜索,降低目标函数来计算相机位姿。图像是非凸函数,使得优化算法容易进入极小。因此仅在运动很小时,直接法才成功
2、单个像素没有区分度
3、灰度不变的假设太强。如果相机自动曝光,调整曝光参数,会使得图像整体亮度改变(光照变化也会出现这种情况),从而破坏灰度不变假设,使算法失效