论文Review SLAM DSO | Direct Sparse Odometry | 直接稀疏视觉里程计经典论文详解
基本信息
题目:Direct Sparse Odometry
作者:Jakob Engel, Vladlen Koltun, Daniel Cremers
单位:Technical University Munich, Intel Labs
方向:Monocular Visual Odometry / Direct Method / Sparse Optimization
关键词:直接法、稀疏视觉里程计、光度误差、滑动窗口优化、逆深度、光度标定、边缘点匹配、非特征点匹配
摘要:
DSO 是一篇非常经典的单目直接法视觉里程计论文。它提出了一种“直接 + 稀疏”的视觉里程计框架。传统特征法通常先提取角点、描述子,再进行匹配,然后最小化几何重投影误差。DSO 则直接使用图像灰度值作为观测量,通过最小化光度误差来同时优化相机位姿、点的逆深度、相机内参以及亮度仿射参数。它不依赖特征描述子,也不要求点必须是角点,因此可以利用边缘、弱纹理区域中的灰度变化。另一方面,DSO 又不像稠密直接法那样引入平滑先验,而是只选择一批信息量较高、空间分布均匀的稀疏像素点,从而保持优化问题的稀疏性和实时性。
DSO 的核心价值不只是“直接法 VO”,而是把直接法做成了类似稀疏 Bundle Adjustment 的形式:它用光度误差替代几何重投影误差,并在滑动窗口中联合优化所有相关变量。这一点对后来的 VIO、直接法 SLAM、视觉-激光融合中的光度残差设计都有很大影响。

Introduction
在 DSO 之前,视觉 SLAM/VO 主要可以按两个维度划分:
一个维度是 直接法 vs 间接法。
间接法先从图像中提取中间表示,比如角点、描述子、光流匹配点,然后在后端中最小化几何误差。ORB-SLAM、PTAM 这类方法就是典型代表。直接法则跳过特征提取和描述子匹配,直接把图像像素强度作为观测量,用光度误差来估计相机运动和三维结构。
另一个维度是 稀疏 vs 稠密。
稀疏方法只使用少量点,优化规模较小,Hessian 结构更简单。稠密或半稠密方法会使用大量像素,通常还需要引入几何平滑先验,使深度图更加连续。但一旦引入平滑先验,几何变量之间就产生相关性,优化问题会变大,也会更难做到实时的联合优化。
DSO 的定位正好是:
Sparse + Direct
也就是:
不使用特征描述子,不优化几何重投影误差,而是直接优化图像光度误差;同时也不做稠密建图,不引入几何平滑先验,而是只选择一批稀疏但有信息量的像素点。
论文认为,这种组合有两个关键好处。
第一,直接法可以使用更多类型的图像信息。
特征法通常偏好角点,因为角点容易稳定检测和匹配。但很多场景中并没有足够角点,比如白墙、走廊、弱纹理区域。直接法只要求局部有灰度变化,因此边缘、弱纹理梯度、光照变化区域都可能被利用。
第二,稀疏化可以保留高效优化结构。
稠密直接法虽然利用了更多像素,但如果加入深度平滑先验,就会让点与点之间耦合,破坏稀疏 BA 中非常重要的结构。DSO 不加几何平滑先验,而是通过均匀采样少量点来让系统可观,从而可以像稀疏 BA 一样用 Schur Complement 高效求解。
研究问题与目标
DSO 想解决的问题可以概括为:
能不能在不使用特征描述子的情况下,构建一个实时、准确、鲁棒,并且能联合优化位姿、深度、内参和光度参数的单目视觉里程计系统?
这背后其实有几个具体目标。
第一,摆脱传统角点和描述子的限制。
DSO 希望不依赖 ORB、SIFT、FAST 这类特征点,而是直接从图像灰度中获取运动和结构约束。
第二,避免稠密直接法中的强平滑先验。
LSD-SLAM、DTAM 等方法会使用较多像素,并往往依赖一定形式的深度正则化。DSO 认为这种先验可能带来偏置,尤其会影响大尺度长期轨迹精度。
第三,建立完整的光度模型。
直接法最怕图像亮度不一致。如果相机自动曝光、镜头暗角、相机响应函数非线性,而算法还假设亮度恒定,那么光度误差就不再可靠。DSO 因此把曝光时间、响应函数、暗角校正和亮度仿射模型都放进了系统。
第四,在滑动窗口中进行联合优化。
DSO 不是单纯做帧间跟踪,也不是先估深度再估位姿,而是在一个活动窗口中联合优化相机位姿、逆深度、相机内参和光度参数。这是它作为经典工作的核心原因之一。
主要贡献
DSO 的主要贡献可以概括为四点。
第一,提出了直接稀疏 VO 框架。
它使用稀疏像素点,但残差不是重投影误差,而是光度误差。每个点在参考帧中以逆深度表示,并投影到其他帧,通过比较小邻域内的灰度差来构造残差。
第二,实现了完整联合优化。
DSO 在滑动窗口中同时优化关键帧位姿、点的逆深度、相机内参和亮度仿射参数。这相当于把传统稀疏 BA 中的几何误差替换为光度误差,形成一种“光度 Bundle Adjustment”。
第三,系统性引入光度标定。
论文使用响应函数、镜头暗角和曝光时间来校正图像,使像素值更接近真实 irradiance。这个处理对于直接法非常重要,因为直接法的观测量就是像素强度本身。
第四,提出了一套完整的前端策略。
直接法后端高度非凸,必须有足够好的初值。DSO 因此设计了关键帧管理、候选点选择、候选点跟踪、点激活、外点剔除和遮挡检测等机制,让系统能够实时运行。
Method
1. DSO 的核心思想:不用描述子,直接比较像素亮度
传统特征法的流程通常是:
图像 → 提取特征点 → 计算描述子 → 匹配 → PnP / BA → 优化重投影误差
DSO 的流程更接近:
图像 → 光度校正 → 选择有梯度的像素点 → 根据深度和位姿投影到其他帧 → 比较像素灰度 → 优化光度误差
也就是说,DSO 不问“这个点的描述子是否匹配”,而是问:
如果当前估计的位姿和深度是正确的,那么同一个三维点在不同图像上的亮度是否应该一致?
这就是直接法的核心假设。
但严格来说,DSO 并不是简单假设原始像素亮度恒定。它认为图像亮度受到曝光、镜头暗角和相机响应函数影响,所以需要先做光度标定,再引入帧间亮度仿射补偿。
2. 光度标定:为什么直接法必须认真处理亮度?
DSO 的光度模型写成:
其中:
() 是图像中观察到的像素值;
() 是相机响应函数;
() 是曝光时间;
() 是镜头暗角函数;
() 是真实场景 irradiance。
这个式子说明,原始灰度值不是场景亮度本身。它至少受到三个因素影响。
第一,曝光时间。
自动曝光会让同一个场景点在不同帧中亮度不同。论文图 3 中展示了曝光时间可能变化超过 500 倍。如果直接假设亮度恒定,残差会被曝光变化严重污染。
第二,镜头暗角。
图像中心和边缘的亮度可能不一致。同一个物体从图像中心移动到边缘时,即使真实亮度不变,观测灰度也会变化。
第三,相机响应函数。
很多相机输出图像并不是线性 irradiance,而是经过 gamma、白平衡、图像增强等处理后的结果。直接比较这种非线性像素值并不可靠。
因此 DSO 先做光度校正:
校正后,后续论文中的 () 默认指光度校正后的图像。
这个设计非常重要。特征法对亮度变化有一定鲁棒性,因为描述子通常会做归一化,或者至少对局部亮度变化不那么敏感。但直接法直接使用像素值,亮度建模不准确会直接影响优化。
迁移理解
如果我们在其他算法中使用光度误差,比如视觉-惯性系统、LiDAR-Visual 系统、NeRF tracking、直接法重定位,都应该注意:
不能直接拿 RGB 或灰度值做残差,然后默认它们天然可比。
更稳妥的做法是至少引入以下几类补偿:
曝光时间补偿;
亮度仿射模型;
vignetting 校正;
相机响应函数校正;
必要时对图像做归一化或局部亮度补偿。
如果没有完整光度标定,至少要像 DSO 一样引入每帧的 affine brightness 参数,用来吸收一部分曝光和亮度变化。
3. 直接法如何进行匹配?
DSO 中的“匹配”并不是描述子匹配,而是基于投影和光度误差的隐式匹配。
对于参考帧 () 中的一个像素点 (
),它有一个逆深度 (
)。根据当前估计的相机位姿 (
) 和相机内参 (
),可以把这个点投影到目标帧 (
) 上。
投影过程是:
其中:
这一步的含义是:
先把参考帧像素 (p) 根据逆深度反投影成三维点;
再用参考帧到目标帧的相对位姿变换这个三维点;
最后用相机模型投影到目标帧,得到位置 (p')。
如果当前位姿和深度正确,那么参考帧中点 (p) 附近的灰度模式,应该能在目标帧的 (p') 附近找到。
因此 DSO 的匹配不是“先找对应点再优化”,而是“在优化中通过投影位置直接建立对应关系”。这也是直接法和间接法的根本差异。
候选点跟踪中的显式搜索
不过在前端初始化时,DSO 仍然需要给新点一个较好的初始深度。这个时候它会沿极线进行离散搜索,寻找光度误差最小的位置。这个过程类似 LSD-SLAM 的深度滤波思想。
也就是说,DSO 中有两类匹配思想:
第一类是后端优化中的隐式匹配。
给定深度和位姿,直接投影,然后计算光度误差。
第二类是候选点跟踪时的显式极线搜索。
为了初始化候选点深度,沿极线搜索光度误差最小的位置,并估计深度和方差。
这两者不要混淆。后端 BA 式优化主要依赖投影模型;前端候选点初始化才使用极线搜索。
4. 光度误差代价函数如何计算?
DSO 对一个参考帧点 () 在目标帧 (
) 中的光度误差定义为一个小像素块上的加权 SSD:
其中:
() 是围绕点 (
) 的像素 pattern;
() 是 (
) 投影到目标帧的位置;
() 是参考帧校正后的像素值;
() 是目标帧投影位置的像素值,通过双线性插值得到;
() 是曝光时间;
() 是每帧的亮度仿射参数;
() 是 Huber norm;
() 是梯度相关权重。
这个残差有几个关键点。
4.1 不是单像素,而是小 pattern
DSO 没有只比较中心像素,而是比较一个小邻域。论文中使用 8 个像素组成的 pattern。这样做有几个原因:
第一,单像素约束太弱。
每个点只有一个逆深度未知量。如果只用一个像素残差,约束很不稳定。使用多个邻域像素可以提供更多局部结构信息。
第二,小 pattern 相当于隐式利用局部梯度信息。
它不仅比较中心亮度,也比较附近像素的灰度变化。因此可以理解为同时利用了局部一阶、二阶灰度变化。
第三,pattern 不能太大。
太大的块容易受到遮挡、非刚体、透视变化、光照变化影响,也会增加计算量。论文实验发现 8 像素 pattern 是精度和效率之间的折中。

4.2 使用 Huber norm
直接法容易受到外点影响,比如遮挡、动态物体、反光、模糊、错误深度。DSO 因此使用 Huber norm,而不是普通平方误差。
Huber 的作用是:
小残差时接近平方误差,保证优化精度;
大残差时接近 L1,降低外点影响。
4.3 使用梯度相关权重
DSO 的权重定义为:
这个设计看起来有点反直觉。通常我们觉得梯度越大越可靠,为什么 DSO 要 down-weight 高梯度点?
论文给出的解释是:高梯度区域对几何误差非常敏感。
如果投影位置 () 有一点点偏差,在强边缘上就会造成很大的灰度误差。这种误差未必来自亮度噪声,而可能来自微小几何误差、插值误差或标定误差。因此高梯度点的残差需要适当降权。
可以把它理解为:
DSO 的残差模型主要是光度误差,但现实中也存在小的几何噪声。这个权重相当于对小几何噪声的一种近似边缘化。
4.4 总能量函数
整个滑动窗口中的光度误差为:
其中:
() 是活动关键帧集合;
() 是关键帧 (
) 中 host 的点;
() 是点 (
) 被观测到的其他帧集合。
如果曝光时间已知,DSO 还会加入亮度仿射参数的先验:
这个先验的作用是防止 () 漂移。
如果没有光度标定或曝光时间未知,DSO 会把 (),并设 (
),让仿射亮度参数自由吸收亮度变化。
5. 为什么使用逆深度?
DSO 中每个三维点不是用世界坐标 () 表示,而是用参考帧中的像素坐标加一个逆深度表示。像素坐标是固定的,真正优化的只有一个变量:逆深度 (
)。
这和传统特征 BA 不同。传统 BA 中,一个三维点通常有三个自由度。而 DSO 中,一个点被定义为:
参考帧中某个像素射线与真实三维表面的交点。
因此它的图像位置已经固定在 host frame 上,只需要估计这条射线上的深度。
这样做有几个好处:
第一,参数更少。
每个点只优化一个逆深度,而不是三个坐标。
第二,适合单目深度不确定性。
远处点的深度不确定性在深度空间中很非线性,但在逆深度空间中更适合高斯近似。
第三,保持稀疏优化结构。
点的逆深度可以通过 Schur Complement 消元,使后端类似传统稀疏 BA。
但它也有一个代价:
点必须依附于某个 host keyframe。如果 host keyframe 被边缘化,对应点也通常要被边缘化,系统需要设计良好的滑动窗口管理策略。
6. 滑动窗口优化:光度版 Bundle Adjustment
DSO 的后端可以理解为:
用光度误差替代几何重投影误差的滑动窗口 BA。
它优化的变量包括:
关键帧位姿 ();
每帧亮度仿射参数 ();
点的逆深度 ();
相机内参 ()。
优化方法使用 Gauss-Newton。
残差线性化后得到:
然后求解:
并更新状态。
6.1 残差依赖关系
一个点的残差不仅依赖目标帧位姿,也依赖 host frame 位姿。因为点的三维位置是从 host frame 的像素和逆深度反投影出来的。
因此每个残差依赖:
host frame pose;
target frame pose;
point inverse depth;
camera intrinsics;
host 和 target 的亮度仿射参数。
这比传统重投影误差稍复杂。传统 BA 中,某个三维点已经在世界坐标下表示,残差通常依赖目标帧位姿和三维点。DSO 中点依附于 host frame,所以 host frame 也进入残差。
不过论文指出,这不会破坏 Schur Complement 之后的求解结构,因此仍然可以高效优化。
6.2 First Estimate Jacobian
DSO 使用了 First Estimate Jacobian。
简单说,就是某些 Jacobian 不在每次状态更新后都重新线性化,而是固定在第一次估计点附近。
这么做是为了保持系统一致性。
单目 VO 有一些不可观自由度,比如绝对尺度和绝对位姿。如果每次边缘化和线性化点不一致,系统可能会错误地引入虚假的约束,让不可观方向变得“看起来可观”,从而破坏一致性。
DSO 的处理是:
几何部分和光度参数相关 Jacobian 使用 First Estimate Jacobian;
图像梯度 () 仍在当前投影位置计算,因为图像梯度本身不平滑,且不影响系统 null-space。
这个细节对工程实现很重要。很多滑动窗口系统的问题不在残差设计,而在边缘化和线性化点处理不一致。
6.3 边缘化
为了实时运行,DSO 不可能让窗口无限增长。
当活动变量太多时,它会边缘化旧关键帧和旧点。
边缘化使用 Schur Complement。
如果要消掉变量 (),保留变量 (
),线性系统可以写为:
消元后得到新的先验:
这个先验会保留在后续优化中。
它相当于把被边缘化掉的旧信息压缩成一个二次项。
需要注意的是,边缘化会固定线性化点,所以 DSO 才强调 First Estimate Jacobian 和 tangent space 的一致性。
Front-end
直接法后端高度非凸。
如果初始位姿或深度不准,投影点可能偏离真实位置超过几像素,图像线性化就失效。因此 DSO 的前端非常关键。
1. 关键帧管理
DSO 默认保留最多 () 个活动关键帧。
新帧到来时,先用当前活动点生成半稠密深度图,然后使用直接图像对齐估计新帧位姿。这个过程使用图像金字塔和恒速运动模型初始化。
是否创建新关键帧由三个指标共同决定:
- 第一,视野变化。
用平均光流大小衡量。如果视角变化大,需要新关键帧。
- 第二,平移造成的遮挡和反遮挡。
即使总光流不大,只要相机有明显平移,也可能出现新的可见区域,因此需要新关键帧。
- 第三,曝光变化。
如果曝光或亮度变化明显,也需要新关键帧,以保证后续光度建模更稳定。
关键帧过少,会导致遮挡和视角变化处理不好;关键帧过多,又会让关键帧过早边缘化,线性化点更不准确。论文实验表明,过少和过多都会影响性能。
2. 点选择
DSO 目标是在活动窗口中保持大约 () 个 active points,并且让它们在图像中分布均匀。
点选择不是只找角点。
DSO 会选择局部梯度足够大的像素,并通过分块策略保证空间均匀分布。
具体做法是:
- 先把图像分成 (
) 的块,计算每个块内的自适应梯度阈值;
- 再把图像分成 (
) 的小块,每个小块选择梯度最大的点;
- 如果某些区域没有强梯度点,再降低阈值,用更大的 block 尺寸补充弱梯度点。
这样可以让点覆盖边缘、角点和弱纹理区域。
论文实验显示,只使用 FAST corners 会显著降低 DSO 的精度和鲁棒性。这说明 DSO 的优势不是“用了稀疏点”,而是“可以从非角点区域采样有效信息”。
3. 候选点跟踪与激活
新选出来的点不会立刻进入优化。它们先作为 candidate points,在后续帧中沿极线搜索,估计粗略深度和方差。
当旧点被边缘化后,系统再从候选点中选择一部分激活为 active points。
激活时也要考虑空间分布,避免所有点集中在少数纹理丰富区域。
这个设计有点像“前端先养点,后端再使用”。
直接法优化需要比较好的深度初值,所以 candidate tracking 是很重要的初始化步骤。
4. 外点和遮挡检测
DSO 会尽早移除不可靠观测:
候选点沿极线搜索时,如果最小光度误差不够明显,就丢弃;
后端观测中,如果光度误差超过阈值,就移除该观测;
阈值会根据当前帧残差中位数自适应调整。
这对直接法很重要。因为遮挡、运动模糊、动态物体、反光都会造成光度误差异常。
实验
论文在三个数据集上评估 DSO:
TUM monoVO:提供光度标定,包含大量室内外视频;
EuRoC MAV:无人机室内数据,没有完整光度标定;
ICL-NUIM:合成室内数据。
对比方法主要是 ORB-SLAM。
论文也尝试了 LSD-SLAM 和 SVO,但它们在很多序列上失败,一个重要原因是这些方法假设亮度恒定,而真实数据中存在明显曝光变化。
1. 和 ORB-SLAM 的对比


在 TUM monoVO 和 ICL-NUIM 上,DSO 在精度和鲁棒性上明显优于 ORB-SLAM。
在 EuRoC 上,ORB-SLAM 的精度更好一些,但鲁棒性较低。论文解释主要有两个原因:
第一,EuRoC 没有提供完整光度标定,削弱了 DSO 的优势;
第二,EuRoC 中存在很多小回环和反向运动,ORB-SLAM 的局部建图可以隐式利用这些重复观测,而 DSO 是纯 VO,会不断边缘化离开视野的点和帧。
这个对比要谨慎理解。
DSO 是 VO,不带全局闭环;ORB-SLAM 是 SLAM 系统,具备局部地图和闭环能力。论文为了公平已经关闭了显式 loop closure,但 ORB-SLAM 的局部地图机制仍然会带来一些优势。
2. 光度标定实验
论文逐步关闭光度标定组件:
关闭曝光时间;
关闭暗角校正;
关闭响应函数校正;
最后退化到普通亮度恒定假设。

实验结果显示:
完整光度标定最好;
去掉暗角和响应函数会降低精度和鲁棒性;
完全使用 brightness constancy 的表现最差。
这说明直接法不是简单“比较灰度”就行。
如果不处理相机成像过程,光度误差可能是不可信的。
3. 点数和窗口大小实验
论文发现,使用更多点并不会线性提升精度。

当点数超过约 500 后,精度收益很快变小。默认使用 2000 点,更多是为了获得更稠密、更好看的点云,而不是显著提高轨迹精度。
窗口大小也类似。
当活动关键帧数量达到 7 后,继续增加带来的收益很小,但计算量会上升。
这对工程实现很有启发:
SLAM 系统不是点越多越好。关键是点的质量、分布、可观性和优化结构。
4. 点类型实验
论文比较了普通梯度点和 FAST corners。
结果显示,只使用 FAST corners 会明显变差。

这证明 DSO 的核心优势之一是:
它不仅能用角点,还能用边缘和弱纹理中的灰度变化。
这也是直接法在某些弱纹理场景下比特征法更稳的原因。
5. 几何噪声和光度噪声实验
论文做了一个很有意思的实验:分别向图像中加入几何噪声和光度噪声。


结论是:
直接法对光度噪声更鲁棒;
间接法对几何噪声更鲁棒。
原因很直观。
直接法优化的是光度误差。如果相机几何标定不准、存在 rolling shutter 或镜头畸变残留,那么投影位置会错,像素强度比较就会失败。
间接法先提取局部特征,特征位置对低频几何畸变相对更稳,而且后端优化的是几何误差,所以更能承受一些几何噪声。
这也是 DSO 的一个重要结论:
直接法非常适合几何标定准确、全局快门、机器视觉相机等场景;
但在普通手机、网络摄像头、rolling shutter 严重的消费级相机上,特征法可能更稳。
技术分析
1. DSO 为什么叫 Direct Sparse Odometry?
Direct 指的是:
它直接使用图像像素强度作为测量量,优化光度误差,而不是先提取特征再优化几何误差。
Sparse 指的是:
它只选择少量像素点参与优化,而不是使用整张图像,也不引入稠密深度图平滑先验。
Odometry 指的是:
它是纯视觉里程计,主要估计局部连续运动,不做完整全局 SLAM,也不依赖闭环优化。
所以 DSO 的本质是:
稀疏采样 + 光度残差 + 滑动窗口联合优化。
2. DSO 和 LSD-SLAM 的区别
LSD-SLAM 也是直接法,但它是 semi-dense 方法,使用半稠密深度图,并依赖深度滤波和位姿图优化。
DSO 更像是 BA 框架。
它把点的逆深度和关键帧位姿放在一个滑动窗口中联合优化,并使用 Schur Complement 保持高效。
简单理解:
LSD-SLAM 更像“直接法跟踪 + 半稠密深度图 + pose graph”;
DSO 更像“光度误差版本的稀疏 BA”。
3. DSO 和 ORB-SLAM 的区别
ORB-SLAM 的观测是特征匹配点,误差是几何重投影误差。
DSO 的观测是像素灰度,误差是光度误差。
ORB-SLAM 更依赖角点和描述子匹配。
DSO 可以使用边缘和弱纹理梯度。
ORB-SLAM 对曝光、亮度变化相对更不敏感。
DSO 必须认真处理光度标定。
ORB-SLAM 对 rolling shutter、几何畸变更鲁棒。
DSO 对几何标定要求更高。
ORB-SLAM 是完整 SLAM 系统。
DSO 是纯 VO,没有闭环和重定位。
4. DSO 的优化为什么非凸性更强?
传统特征法中,匹配已经由前端完成。后端只需要让三维点投影到已知二维观测附近。虽然也非线性,但观测位置是固定的。
DSO 中,图像本身进入了误差函数。
目标帧的像素值 () 随投影位置 (
) 改变,而图像灰度函数不是光滑连续的解析函数。只要投影点偏差超过一两个像素,局部线性化就可能失效。
所以直接法非常依赖初值。
这也是 DSO 要使用图像金字塔、恒速模型、候选点跟踪、关键帧策略和 recovery tracking 的原因。
如何迁移到其他算法中?
DSO 的思想非常适合迁移到其他 SLAM/VIO/多传感器融合算法中,但不能机械照搬。比较实用的迁移方式有以下几类。
1. 把光度误差作为视觉残差加入 VIO
在 VIO 中,传统视觉残差通常是特征点重投影误差。
可以借鉴 DSO,把部分特征点或像素点改成光度残差:
然后联合优化:
- IMU 状态;
- 相机位姿;
- 点的逆深度;
- 亮度仿射参数;
- 外参;
- 时间偏移等。
但要注意,VIO 中 IMU 可以提供很好的位姿初值,因此直接法残差的收敛半径问题会缓解。这也是很多直接法 VIO 能够工作的原因。
2. 在 LiDAR-Visual 系统中使用 frame-to-map photometric residual
如果系统中已经有 LiDAR 点云地图,可以把地图点投影到图像上,然后比较地图点颜色和图像颜色。这类思路在后来的 R3LIVE 等系统中也能看到。
迁移时需要注意:
- 地图点颜色要稳定更新;
- 相机曝光变化要补偿;
- 点云和图像的外参要准确;
- 遮挡关系要处理;
- 不能把所有点都用于光度残差,要选择可见且梯度有效的点。
3. 在特征法 SLAM 中增加 direct refinement
可以保留原来的特征前端,用 ORB/SIFT/SuperPoint 建立粗匹配,然后在局部窗口中加入 DSO 式光度残差进行精细优化。
这种混合方式的优点是:
- 特征法提供较大收敛范围;
- 直接法提供亚像素级对齐精度;
- 系统比纯直接法更鲁棒。
但缺点是系统复杂度增加,而且特征残差和光度残差的权重需要仔细调。
4. 迁移光度标定思想
即使不做完整 DSO,也可以迁移它的光度建模思想。
例如,在任何使用 photometric loss 的算法中,都可以考虑:
- 加入每帧 affine brightness;
- 使用 Huber loss;
- 对高梯度残差进行权重调整;
- 使用曝光时间补偿;
- 在数据采集时尽量保存 raw 图像、曝光时间、响应函数和 vignetting 参数。
这对直接法、NeRF tracking、视觉定位、图像对齐、稠密重建都很有价值。
5. 迁移点选择策略
DSO 的点选择策略也很实用。
很多系统不需要密集使用所有像素,只需要选择分布均匀、梯度足够、有可观性的点。
可以借鉴:
- 分块选点;
- 自适应梯度阈值;
- 补充弱纹理区域点;
- 保持图像空间均匀分布;
- 在滑动窗口中维持固定数量 active points。
这比简单选择 top-K 梯度点更稳,因为 top-K 点很容易集中在少数纹理丰富区域。
局限性
1. 对几何标定非常敏感
DSO 依赖精确投影。
如果相机内参不准、畸变未完全去除、rolling shutter 严重,那么投影点会偏移,光度误差会迅速变差。
论文的几何噪声实验也说明,直接法比特征法更容易受到几何扰动影响。
因此 DSO 更适合:
- 全局快门相机;
- 准确标定的工业相机;
- 畸变较小或已精确去畸变的数据;
- 曝光信息可获得的数据。
不太适合直接套在:
- rolling shutter 很严重的手机视频;
- 自动图像增强强烈的消费级相机;
- 压缩严重的视频;
- 标定不准确的数据。
2. 对初值依赖强
直接法的图像残差只有局部线性有效。
如果初始位姿偏差太大,投影点落到错误位置,优化可能收敛到错误局部极小值,甚至直接失败。
所以 DSO 必须依赖:
- 图像金字塔;
- 恒速模型;
- 关键帧频率控制;
- 候选点深度初始化;
- recovery tracking。
这也限制了它在大视角重定位、宽基线匹配中的使用。
直接法更适合连续视频,而不适合两张相隔很远的图像直接匹配。
3. 没有闭环和全局一致性
DSO 是 visual odometry,不是完整 SLAM。
它会不断边缘化旧帧和旧点,因此无法像 ORB-SLAM 那样通过闭环消除长期漂移。
如果要构建完整 SLAM,需要额外加入:
- 回环检测;
- 重定位;
- pose graph optimization;
- 地图复用;
- 全局 BA 或局部-全局联合优化。
4. 光度一致性假设仍然有限
即使做了光度标定,现实中仍然有很多因素破坏光度一致性:
- 非朗伯反射;
- 高光;
- 阴影变化;
- 动态物体;
- 自动白平衡;
- 运动模糊;
- 图像压缩;
- rolling shutter 带来的局部曝光差异。
DSO 用 Huber、亮度仿射和外点剔除缓解这些问题,但不能完全解决。
5. 稀疏点云不是完整三维重建
DSO 可以输出较密的梯度点云,但它不是稠密重建方法。
它的地图主要服务于跟踪,不保证表面完整性,也不适合直接用于高质量建模。
如果目标是稠密建图,需要结合深度补全、MVS、TSDF、NeRF 或其他重建模块。
6. 单目尺度不可观
DSO 是单目 VO,本身无法恢复真实尺度。
它只能估计 up-to-scale 的轨迹。如果需要真实尺度,需要融合:
- IMU;
- 双目;
- RGB-D;
- LiDAR;
- 轮速计;
- 已知物体尺寸;
- 地面约束。
个人理解
DSO 经典的地方不在于它“第一次做了直接法”,而在于它把直接法系统化、BA 化、工程化了。
它证明了一件事:
直接法不一定要稠密,也不一定要依赖深度平滑先验。只要点选得好、光度模型足够准确、优化结构设计合理,稀疏直接法也可以做到实时、高精度和高鲁棒性。
DSO 对后续工作的影响主要有三点。
第一,它让光度误差成为 SLAM 后端中的一类标准残差。
后来的很多 VIO、RGB-D、LiDAR-Visual 系统都借鉴了这种 photometric residual。
第二,它强调了光度标定的重要性。
很多直接法失败不是因为直接法思想不行,而是因为相机模型、曝光模型和图像预处理没有做好。
第三,它说明数据量不是越多越好。
稠密像素并不一定带来更好精度。选择少量高质量、分布均匀、约束有效的点,往往更适合实时系统。
从今天看,DSO 也有明显时代局限。
它没有深度学习特征,没有语义动态剔除,没有神经隐式地图,也没有现代 VIO 中成熟的 IMU 紧耦合框架。但它的核心思想仍然非常值得学习:残差怎么建模、变量怎么参数化、光度误差怎么标定、滑动窗口怎么边缘化、前端怎么为非凸优化提供初值。
如果你想理解直接法 SLAM,DSO 仍然是绕不开的一篇论文。
总结
DSO 的完整技术链路可以概括为:
- 输入图像先进行光度校正;
- 在图像中选择空间均匀、梯度有效的稀疏点;
- 用候选点跟踪沿极线初始化逆深度;
- 在滑动窗口中构造小 pattern 光度残差;
- 联合优化关键帧位姿、逆深度、相机内参和亮度参数;
- 用 Schur Complement 边缘化旧点和旧帧;
- 通过关键帧管理和外点剔除维持实时性和鲁棒性。
它最重要的公式是光度误差:
它最重要的思想是:
用光度误差直接约束相机运动和三维结构,同时通过稀疏点选择保持类似 BA 的高效优化结构。
它最适合的场景是:
- 相机几何标定准确;
- 曝光和响应可以建模;
- 图像序列连续;
- 需要实时 VO;
- 场景中角点不多但存在边缘或弱纹理梯度。
它最明显的短板是:
- 对 rolling shutter 和几何误差敏感;
- 对初值依赖强;
- 没有闭环;
- 单目尺度不可观;
- 对真实复杂光照仍然有限。
所以,DSO 不是万能方案,但它是理解直接法视觉里程计的一篇核心论文。学习 DSO 的重点不只是记住公式,而是理解它为什么要“直接”、为什么又要“稀疏”,以及它如何把光度误差真正放进一个可实时运行的滑动窗口优化系统中。
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐


所有评论(0)