4. 视觉里程计基础
视觉惯性里程计(VIO)的“视觉”部分,本质上是在连续图像之间估计相机自身的运动,并恢复场景中特征点的三维位置。要理解 VIO 前端为何这样设计,必须先掌握视觉里程计的四种基础手段:特征点法、光流法、直接法,以及贯穿其中的对极几何与三角化。它们分别回答了“用什么表示图像”“如何建立帧间对应”“如何从对应关系恢复运动与深度”这三个核心问题。
一、核心原理:从像素到运动
相机在运动时,同一空间点在不同时刻成像于不同像素位置。视觉里程计的目标,就是利用这种像素位移反推相机位姿变化。根据“用什么信息做匹配”,可以分成三条技术路线:
- 特征点法:先提取角点、斑点等稳定特征(如 FAST、ORB、SIFT),再计算描述子进行匹配。优点是匹配鲁棒、可跨大视角变化,缺点是提取与描述耗时,且丢失了大量图像信息。
- 光流法:不计算描述子,而是基于灰度不变假设,追踪同一特征点在下一帧中的位置。典型算法为 Lucas-Kanade 稀疏光流,速度快,适合 VIO 前端。
- 直接法:跳过特征提取,直接最小化两帧之间的光度误差,用整幅图像的像素梯度估计运动。优点是能利用弱纹理区域,缺点是易受光照变化和曝光影响。
无论哪条路线,最终都要落到几何关系上:两帧之间的对极几何约束了匹配点的搜索范围,而三角化则把二维匹配恢复成三维点。
二、方法流程:特征点法与光流法的工程链路
在 VIO 工程中,前端通常采用“特征点 + 光流”的混合策略:用特征点保证可重复性,用光流保证追踪速度。典型流程如下:
- 对当前帧提取 FAST 角点,并用金字塔实现尺度不变性;
- 对上一帧特征点,在当前帧中执行 LK 光流追踪,得到像素位移;
- 用 RANSAC 结合对极几何剔除误匹配;
- 对成功追踪的点进行三角化,得到三维坐标;
- 将三维点与 IMU 预积分结果联合优化,输出位姿。
下面是一段简化的光流追踪与对极几何校验伪代码,便于理解工程实现:
// 1. 提取当前帧特征点
vector<Point2f> pts_cur;
goodFeaturesToTrack(img_cur, pts_cur, 150, 0.01, 10);
// 2. 对上一帧点做 LK 光流追踪
vector<Point2f> pts_prev = last_pts;
vector<Point2f> pts_tracked;
vector<uchar> status;
calcOpticalFlowPyrLK(img_prev, img_cur,
pts_prev, pts_tracked,
status, err);
// 3. 用基础矩阵剔除误匹配
Mat F = findFundamentalMat(pts_prev, pts_tracked,
FM_RANSAC, 1.0, 0.99);
// 保留内点,进入三角化
三、对极几何与三角化:视觉里程计的几何骨架
对极几何描述的是两个相机位姿之间的约束关系。设两帧相机中心为 C0、C1,空间点 P 在两帧的投影为 p0、p1,则 p0、p1 与基线 C0C1 共面,满足:
p1ᵀ · F · p0 = 0,其中 F 为基础矩阵;若已知内参,则用本质矩阵 E = KᵀFK。
这条约束的意义在于:给定 p0,p1 必定落在另一帧的一条极线上,搜索范围从二维降到一维,极大提升匹配效率。而三角化则是反向操作:已知两帧位姿和匹配点 p0、p1,通过两条射线求交,恢复 P 的三维坐标。三角化的精度与基线长度、观测角度密切相关——基线太短或视角太小,深度不确定性会急剧增大。
四、对比与选型:三种前端路线怎么选
下表从计算量、鲁棒性、适用场景三个维度对比三种方法,便于在工程中做取舍:
| 方法 | 核心信息 | 计算量 | 鲁棒性 | 典型场景 |
|---|---|---|---|---|
| 特征点法 | 描述子匹配 | 高 | 强,抗视角变化 | 回环、重定位 |
| 光流法 | 灰度追踪 | 中 | 中,依赖短基线 | VIO 前端追踪 |
| 直接法 | 光度误差 | 低至中 | 弱,怕光照变化 | 弱纹理、稠密建图 |
五、案例与误区复盘
假设无人机在室内飞行,画面以白墙和少量纹理为主。若使用纯特征点法,可能提取不到足够角点,导致前端失效;此时可切换到直接法或半直接法,利用墙面梯度信息。若使用纯光流法,当无人机快速旋转时,像素位移过大,LK 光流容易丢失目标,需要引入金字塔分层或 IMU 预测初值。
另一个高频问题是把对极几何当成“万能匹配器”。对极几何只提供约束,不提供唯一解;在纯旋转或基线极短时,本质矩阵退化,三角化失效。因此 VIO 必须依赖 IMU 提供运动先验,才能稳定运行。
总结来看,特征点法、光流法、直接法并非互斥,而是同一几何框架下的不同信息利用方式。对极几何负责“约束搜索”,三角化负责“恢复深度”,二者共同构成视觉里程计的几何骨架。在 VIO 工程中,选择哪种前端,取决于场景纹理、光照稳定性、算力预算以及 IMU 能否提供可靠先验。理解这些基础,才能在后续的滑动窗口优化与边缘化中做出正确取舍。