3. 视觉SLAM基础:特征点法、直接法、半直接法的对比与选型

说到视觉SLAM,很多新手第一反应就是ORB-SLAM。但实际项目里,选错方法真的会让人想砸电脑。我见过有人拿着直接法去做低纹理的走廊,结果跑飞了;也见过有人用特征点法做AR应用,帧率卡得跟幻灯片似的。

这一章,咱们就把三种主流视觉SLAM方法掰开揉碎。不讲虚的,全是实战选型经验。

3.1 三种方法的核心理念

先搞清楚它们到底在干什么。说白了,就是怎么从图像里提取信息来估计相机运动。

方法 核心思想 代表作品
特征点法 提取角点/斑点等特征,计算描述子,匹配后解算位姿 ORB-SLAM2/3
直接法 直接利用像素灰度值,最小化光度误差 LSD-SLAM, DSO
半直接法 提取特征点但不计算描述子,用直接法跟踪 SVO, SVO2.0

嗯,这里要注意:半直接法这个名字容易让人误解。它并不是特征点法和直接法的简单拼接,而是取了各自的优点——用特征点来选像素,用直接法来跟踪。

3.2 特征点法:ORB-SLAM 深度解析

ORB-SLAM是我用得最多的框架,没有之一。它的成熟度在学术界和工业界都是顶级的。

3.2.1 为什么ORB特征这么流行?

ORB = FAST角点 + BRIEF描述子。FAST检测极快,BRIEF描述子是二进制串,匹配用汉明距离,位运算搞定。你想想看,SIFT算一个特征点的时间,ORB能算几十个。

关键优势:ORB具有旋转不变性和尺度不变性(通过图像金字塔)。这意味着相机旋转或远近移动时,特征点还能匹配上。

3.2.2 ORB-SLAM的三线程架构

我个人觉得,ORB-SLAM最值得学习的就是它的多线程设计。三个线程各司其职,互不干扰。

// 伪代码:ORB-SLAM核心流程
Thread 1: Tracking
  - 提取ORB特征
  - 匹配上一帧/地图点
  - 优化位姿(PnP + BA)
  - 决定是否插入关键帧

Thread 2: Local Mapping
  - 处理新关键帧
  - 三角化新地图点
  - 局部BA优化
  - 剔除冗余关键帧

Thread 3: Loop Closing
  - 检测回环(词袋模型DBoW2)
  - 计算Sim3变换
  - 全局BA优化

我在项目里遇到过一个问题:回环检测线程跑得慢,导致地图漂移累积。后来发现是词袋词典加载太大,换成轻量版就好了。

3.2.3 特征点法的优缺点

  • 优点:对光照变化鲁棒,支持重定位和回环检测,地图可复用
  • 缺点:纹理缺失时失效,计算描述子耗时,特征点稀疏导致建图不密

避坑指南:我曾经在纯白色墙壁的走廊里跑ORB-SLAM,结果特征点数量直接掉到个位数。后来加了IMU融合才稳住。如果你做室内导航,一定要考虑纹理退化场景。

3.3 直接法:LSD-SLAM 原理与局限

直接法走的是另一条路——不提取特征,直接用像素灰度。LSD-SLAM是直接法的代表作之一。

3.3.1 光度误差模型

直接法的核心假设:同一个空间点在不同图像中的投影点,灰度值应该相同。这个假设其实挺脆弱的,光照一变就崩。

// 光度误差公式
E = Σ || I1(p) - I2(π(T * π⁻¹(p, d))) ||²

其中:
I1, I2: 两帧图像的灰度
π: 投影函数
T: 相机位姿变换
d: 逆深度

说白了,就是找一组位姿和深度,让两帧图像的像素灰度差最小。

3.3.2 LSD-SLAM的独特设计

  • 半稠密深度图:只在高梯度区域估计深度,不是全稠密
  • 逆深度参数化:用1/d代替d,更适合概率滤波
  • Sim3位姿图优化:支持尺度漂移的检测与修正

个人经验:LSD-SLAM在纹理丰富的场景下,建图效果比ORB-SLAM密实得多。但一旦遇到快速运动或光照突变,它比特征点法更容易丢失。我建议只在慢速、光照稳定的场景下考虑直接法。

3.4 半直接法:SVO 的速度哲学

SVO(Semi-direct Visual Odometry)是我在无人机项目里最常用的方法。为什么?因为它快,快到可以在嵌入式平台上跑实时。

3.4.1 SVO的工作流程

SVO只有两个线程,比ORB-SLAM精简得多。

// SVO核心流程
Thread 1: Motion Estimation
  Step 1: 稀疏图像对齐(直接法)
    - 最小化上一帧与当前帧的像素块光度误差
    - 得到初始位姿估计
  Step 2: 特征点对齐
    - 用上一步位姿投影地图点到当前帧
    - 优化特征点像素位置
  Step 3: PnP优化
    - 用对齐后的2D-3D对应关系优化位姿

Thread 2: Mapping
  - 深度滤波器更新
  - 关键帧决策
  - 地图点管理

你看,SVO没有回环检测,没有全局BA。这就是它快的代价——没有全局一致性。

3.4.2 SVO的致命短板

  • 没有回环检测:误差会一直累积,无法消除
  • 容易丢失:快速旋转时,图像对齐容易失败
  • 地图不可复用:每次启动都要重新初始化

我曾经踩过的坑:在无人机上跑SVO,飞了3分钟后位置漂移了2米。因为没有回环,这个误差只会越来越大。后来我加了VIO融合,用IMU约束漂移,才勉强能用。

3.5 三种方法的系统对比

咱们用一张表把核心差异说清楚。

对比维度 特征点法 (ORB-SLAM) 直接法 (LSD-SLAM) 半直接法 (SVO)
计算速度 中等 (30-50ms/帧) 较慢 (50-80ms/帧) 快 (10-20ms/帧)
纹理依赖 高 (需要特征点) 中 (需要梯度) 中 (需要特征点)
光照鲁棒性 强 弱 中
建图密度 稀疏 半稠密 稀疏
回环检测 支持 支持 不支持
地图复用 支持 有限 不支持
适用场景 通用SLAM 慢速、纹理丰富 高速、轻量级

3.6 选型决策指南

到底选哪个?我一般按这个逻辑来决策。

  1. 需要回环和地图复用? → 选ORB-SLAM,没得商量
  2. 计算资源紧张(如嵌入式)? → 选SVO,但要接受漂移
  3. 需要半稠密建图? → 选LSD-SLAM或DSO
  4. 光照变化剧烈? → 选ORB-SLAM,直接法会崩
  5. 快速运动? → 选SVO或ORB-SLAM,别碰直接法

我的建议:如果你刚开始学视觉SLAM,从ORB-SLAM入手。它的代码质量高、文档多、社区活跃。等你把特征点法吃透了,再去看直接法和半直接法,会理解得更深。

3.7 三种方法的核心逻辑对比图

下面这张图帮你理清三种方法的数据流差异。

三种视觉SLAM方法核心逻辑对比 特征点法 (ORB-SLAM) 提取ORB特征 + 计算描述子 特征匹配 (汉明距离) PnP / BA 优化位姿 回环检测 + 全局优化 直接法 (LSD-SLAM) 直接使用像素灰度值 最小化光度误差 逆深度滤波更新 Sim3 位姿图优化 半直接法 (SVO) 提取FAST角点 (无描述子) 稀疏图像对齐 (直接法) 特征对齐 + PnP 无回环检测,纯VO 选型口诀:要精度和鲁棒选ORB,要速度选SVO,要建图密度选LSD

3.8 实战选型建议

最后,给你一个可以直接用的选型清单。

我的推荐组合:

  • 机器人导航:ORB-SLAM3 + 轮式里程计,兼顾精度和鲁棒性
  • 无人机飞控:SVO + IMU,追求低延迟和高帧率
  • AR/VR设备:DSO(改进版直接法),需要半稠密地图做遮挡处理
  • 自动驾驶:ORB-SLAM + 多传感器融合,安全第一

记住,没有万能的方法。选型的关键是搞清楚你的场景约束——计算资源、运动速度、光照条件、纹理丰富度。把这些想清楚了,选型自然就出来了。