目标:
理解光流法跟踪特征点的原理
理解直接法是如何估计相机位姿的
使用g2o进行直接法的计算。
1、直接法引出
特征点法的缺点:
缺点 | 解决思路 | |
---|---|---|
关键点的提取与描述子的计算非常耗时。 | 1、保留特征点,只计算关键点,不计算描述子,使用光流跟踪特征点运动(仍使用特征点,匹配描述子换成光流跟踪,估计相机运动仍使用对极几何,Pnp或ICP算法) | |
关注与特征点,忽略了特征点之外的所有信息。 | 法2、只计算关键点,不计算描述子,使用直接法,计算特征点在下一时刻图像的位置。 | |
特征缺失(白墙,空荡荡的走廊) | 法3、既不计算关键点,也不计算描述子,根据像素灰度差异,直接计算相机运动。 |
法1还是特征点法;法2,法3,则是直接法;
特征点法 | 直接法 | |
---|---|---|
优化相机运动 | 特征点在相机中的投影,最小化投影误差 | 在直接法中,我们并不需要知道点与点之间之间的对应关系,而是 |
通过最小化光度误差(Photometric error)来求得它们 最小化光度误差 |
||
SVO,LSD_SLAM | ||
重构稀疏特征点(稀疏地图) | 直接法分为稀疏、稠密和 | |
半稠密三种。 | ||
直接法根据 | ||
像素的亮度信息,估计相机的运动 |
区别:
需要配对点,通过其它法得到
不需要配对点,直接得到关系
不提特征计算VO的思路:
通过其它方式寻找配对点–光流
无配对点–直接法
2、光流(特征点法)
一般分为稀疏光流和稠密光流
稀疏以Lucas-Kanade(LK)光流为代表
稠密以Horn-Schunck(HS)光流为代表(计算所有像素)
本质上是估计像素再不同的时刻图像中的运动。
2.1 Lucas-Kanade光流
- 灰度不变假设
$$
\left[
\begin{array}{}
u \
v
\end{array}
\right]
^*
= -(A^T A)^{-1} A^T b
$$
$$
3、实践:LK光流
3.1 TMU数据集
1 | 1、 rgb.txt, depth.txt 记录了文件的采集时间和对应的文件名 |
3.2 LK光流
OpenCV进行LK光流处理。跟踪特征点。
对第一张图像提取Fast角点。然后LK光流进行跟踪它们;绘画在图中。
ch8/useLK/useLk.cpp
1 |
|
运行
1 | ./build/useLK ../data |
最后,我们可以通过光流跟踪的特征点,用 PnP、 ICP 或对极几何来估计相机运动,
这些方法在上一章中都讲过,我们不再讨论。总而言之,光流法可以加速基于特征点的视
觉里程计算法,避免计算和匹配描述子的过程,但要求相机运动较慢(或采集频率较高)。
4、直接法
实践:RGB-D的直接法
直接法估计相机运动
4.1 推导:
4.2 讨论
5 实践 RGB-D的直接法
5.1 稀疏直接法
slambook/ch8/directMethod/direct_sparse.cpp
5,2 定义直接法的边
1 | /******************************************** |
5.3 使用直接法估计相机运动
1 | build/direct_sparse ~/dataset/rgbd_dataset_freiburg1_desk |
5.4 半稠密直接法
我们很容易就能把程序拓展成半稠密的直接法形式。对参考帧中,先提取梯度较明显
的像素,然后用直接法,以这些像素为图优化边,来估计相机运动。
1 | // select the pixels with high gradiants |
这只是一个很简单的改动。我们把先前的稀疏特征点改成了带有明显梯度的像素。于是在
图优化中会增加许多的边。这些边都会参与估计相机位姿的优化问题,利用大量的像素而
不单单是稀疏的特征点。由于我们并没有使用所有的像素,所以这种方式又称为半稠密方
法(Semi-dense)
5.5 直接法的讨论
相比于特征点法,直接法完全依靠优化来求解相机位姿。从式(8.16)中可以看到,像
素梯度引导着优化的方向。如果我们想要得到正确的优化结果,就必须保证大部分像素梯
度能够把优化引导到正确的方向。
5.6 直接法优缺点总结
优点 | 省略计算特征点,描述子的时间, | |
只需要有像素梯度即可,无需特征点 | ||
可以构建半稠密,乃至稠密地图,(特征点法无法做到) | ||
缺点 | 非凸性 | |
单个像素没有区分度 | ||
混渎职不变是很强的假设 |
思考
1、除了 LK 光流之外,还有哪些光流方法?它们各有什么特点?
2、在本节的程序的求图像梯度过程中,我们简单地求了 u + 1 和 u - 1 的灰度之差除 2,
作为 u 方向上的梯度值。这种做法有什么缺点?提示:对于距离较近的特征,变化
应该较快;而距离较远的特征在图像中变化较慢,求梯度时能否利用此信息?
3、在稀疏直接法中,假设单个像素周围小块的光度也不变,是否可以提高算法鲁棒性?
请编程实现此事。
4、使用 Ceres 实现 RGB-D 上的稀疏直接法和半稠密直接法。
5、相比于 RGB-D 的直接法,单目直接法往往更加复杂。除了匹配未知之外,像素的距
离也是待估计的。我们需要在优化时把像素深度也作为优化变量。阅读 [59, 57],你
能理解它的原理吗?如果不能,请在 13 讲之后再回来阅读。
6、由于图像的非凸性,直接法目前还只能用于短距离,非自动曝光的相机。你能否提出
增强直接法鲁棒性的方案?阅读 [58, 60] 可能会给你一些灵感。
必备知识:
泰勒展开
超定线性方程(最小二乘法求解)