《视觉SLAM十四讲 第二版》笔记及课后习题(第八讲)

本文是《视觉SLAM十四讲》第二版的读书笔记,主要探讨了直接法与光流在视觉里程计中的应用。直接法通过最小化光度误差求解相机运动,克服了特征点法的计算耗时和信息利用率低的问题。光流是直接法的基础,用于跟踪像素运动。直接法分为稀疏、半稠密和稠密三种形式,适用于不同计算资源和应用场景。文章还讨论了直接法的优缺点,以及在光照变化和非凸性问题上的挑战,并提出了光流的其他方法和增强直接法鲁棒性的方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

读书笔记:视觉里程计2

直接法是视觉里程计另一主要分支,它与特征点法有很大不同。虽然它还没有成为现在VO 中的主流,但经过近几年的发展,直接法在一定程度上已经能和特征点法平分秋色。

直接法的引出

上一讲我们介绍了使用特征点估计相机运动的方法。尽管特征点法在视觉里程计中占据主流地位,研究者们认识到它至少有以下几个缺点:

  1. 关键点的提取与描述子的计算非常耗时。实践当中,SIFT 目前在CPU 上是无法实时计算的,而ORB 也需要近20 毫秒的计算。如果整个SLAM 以30 毫秒/帧的速度运行,那么一大半时间都花在计算特征点上。
  2. 使用特征点时,忽略了除特征点以外的所有信息。一张图像有几十万个像素,而特征点只有几百个。只使用特征点丢弃了大部分可能有用的图像信息。
  3. 相机有时会运动到特征缺失的地方,往往这些地方没有明显的纹理信息。例如,有时我们会面对一堵白墙,或者一个空荡荡的走廓。这些场景下特征点数量会明显减少,我们可能找不到足够的匹配点来计算相机运动。

我们看到使用特征点确实存在一些问题。有没有什么办法能够克服这些缺点呢?我们有以下几种思路:
• 保留特征点,但只计算关键点,不计算描述子。同时,使用光流法(Optical Flow)来跟踪特征点的运动。这样可以回避计算和匹配描述子带来的时间,但光流本身的计算需要一定时间;
• 只计算关键点,不计算描述子。同时,使用直接法(Direct Method)来计算特征点在下一时刻图像的位置。这同样可以跳过描述子的计算过程,而且直接法的计算更加简单。
• 既不计算关键点、也不计算描述子,而是根据像素灰度的差异,直接计算相机运动。

第一种方法仍然使用特征点,只是把匹配描述子替换成了光流跟踪,估计相机运动时仍使用对极几何、PnP 或ICP 算法。而在后两个方法中,我们会根据图像的像素灰度信息来计算相机运动,它们都称为直接法。

使用特征点法估计相机运动时,我们把特征点看作固定在三维空间的不动点。根据它们在相机中的投影位置,通过最小化重投影误差(Reprojection error)来优化相机运动。在这个过程中,我们需要精确地知道空间点在两个相机中投影后的像素位置——这也就是我们为何要对特征进行匹配或跟踪的理由。同时,我们也知道,计算、匹配特征需要付出大量的计算量。相对的,在直接法中,我们并不需要知道点与点之间之间的对应关系,而是通过最小化光度误差(Photometric error)来求得它们。

光流(Optical Flow)

直接法是从光流演变而来的。它们非常相似,具有相同的假设条件。光流描述了像素在图像中的运动,而直接法则附带着一个相机运动模型。为了说明直接法,我们先来介绍一下光流。
光流是一种描述像素随着时间,在图像之间运动的方法,如下图所示。随着时间的经过,同一个像素会在图像中运动,而我们希望追踪它的运动过程。计算部分像素运动的称为稀疏光流,计算所有像素的称为稠密光流。稀疏光流以Lucas-Kanade 光流为代表,并可以在SLAM 中用于跟踪特征点位置。因此,本节主要介绍Lucas-Kanade 光流,亦称LK光流

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

直接法(Direct Methods)

如图8-3所示,考虑某个空间

### 关于《视觉SLAM十四第二中的Eigen相关内容 在《视觉SLAM十四第二中,虽然主要讨论的是SLAM系统的理论基础和技术实现[^3],但Eigen库作为线性代数运算的重要工具,在多个章节都有提及和应用。 #### Eigen简介及其重要性 Eigen是一个高效的C++模板库,用于矩阵和向量操作。对于SLAM系统而言,Eigen提供了必要的数学支持来处理各种几何变换、优化问题等。由于其高效性和易用性,Eigen成为许多计算机视觉和机器人项目不可或缺的一部分[^5]。 #### 安装与配置 当涉及到具体安装时,建议按照官方文档或可靠教程来进行设置。需要注意的是,在遇到编译错误时不应急于重新安装整个环境;很多时候可能是某些细节上的疏忽所致。例如,有经验表明,初次尝试失败后不必轻易放弃当前本的Pangolin或其他依赖项,而应仔细排查其他可能的原因。 #### 应用实例 在实际编程实践中,Eigen被广泛应用于表示三维空间内的点云数据结构以及执行诸如旋转和平移之类的刚体运动学计算。下面给出一段简单的代码片段展示如何利用Eigen定义并操作齐次坐标系下的平移矩阵: ```cpp #include <iostream> #include <Eigen/Dense> using namespace std; using namespace Eigen; int main() { Vector3d t(0.7, 0.2, 1.5); // 平移向量 Matrix4d T = Matrix4d::Identity(); // 初始化单位矩阵 // 设置最后三列对应平移分量 T.block<3, 1>(0, 3) = t; cout << "Translation matrix:\n" << T << endl; return 0; } ``` 这段程序创建了一个基于输入参数`Vector3d t`构建出来的四维仿射变换矩阵`T`,其中包含了指定方向上移动的信息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值