CV - 9: 结构运动(Structure from Motion)
9.1 问题概述
结构运动(SfM)的定义
结构运动(Structure from Motion)是计算机视觉中的核心问题:
输入: 多张图像,图像对应的相机参数未知
输出:
- 相机参数(运动):每张图像对应的相机外参(旋转、平移)
- 场景结构:图像中对应点的三维坐标
形式上,给定 \(m\) 张图像中 \(n\) 个固定三维点的对应关系 \(\mathbf{x}_{ij}\)(第 \(i\) 张图像中第 \(j\) 个点的投影),求:
\[\mathbf{x}_{ij} \simeq \mathbf{P}_i \mathbf{X}_j \quad (i=1,\ldots,m; j=1,\ldots,n)\]其中 \(\mathbf{P}_i\) 是第 \(i\) 张图像的投影矩阵,\(\mathbf{X}_j\) 是第 \(j\) 个三维点。
与相关问题的关系
校准(Calibration):
- 输入:3D 到 2D 的点对应
- 输出:相机参数
- 已知:三维世界坐标
三角化(Triangulation):
- 输入:相机参数 + 2D 到 2D 的点对应
- 输出:三维点坐标
- 已知:相机外参
结构运动(SfM):
- 输入:仅 2D 到 2D 的点对应
- 输出:三维点 + 相机参数
- 未知:一切
9.2 SfM 的固有歧义性
Necker Cube 歧义
从单张图像无法唯一确定三维结构。经典的 Necker 立方体例子展示了这一点——同一个二维投影可能对应两种不同的三维结构解释。
这说明从单视图信息恢复三维结构存在固有的不确定性。
尺度歧义(Scale Ambiguity)
关键观察: 将场景中所有三维点按因子 \(k\) 缩放,同时将相机的平移向量也按 \(1/k\) 缩放,图像观察保持完全不变。
数学表述:设原来的投影为: \(\mathbf{x} = \mathbf{K}[\mathbf{R} | \mathbf{t}] \mathbf{X}\)
如果我们将 \(\mathbf{X}\) 替换为 \(k\mathbf{X}\),将 \(\mathbf{t}\) 替换为 \(\mathbf{t}/k$,则:\)\mathbf{x}’ = \mathbf{K}[\mathbf{R} | \mathbf{t}/k] (k\mathbf{X}) = \mathbf{K}\mathbf{R}(k\mathbf{X}) + \mathbf{K}(\mathbf{t}/k) \cdot k = \mathbf{K}[\mathbf{R} | \mathbf{t}] \mathbf{X} = \mathbf{x}$$
结论: 投影方程在尺度变换下不变,所以没有参考测量或已知距离,无法恢复绝对尺度。
影响:
- 单目 SfM 只能恢复到一个未知的尺度因子 \(k\)
- 恢复的三维点坐标和相机平移都是不确定的(差一个尺度)
- 如果第一张图像的相机坐标是原点,第二张的平移为 \(\mathbf{t}\),实际上可能是 \(k\mathbf{t}\),而三维点可能是 \(k\mathbf{X}\)
解决方法:
- 双目系统:已知基线长度 \(b\),可直接恢复尺度
- 已知物体大小:利用世界中的参考尺度
- ICP 配准:如果有参考扫描或地图,可以对齐恢复尺度
- 视觉里程计累积:多帧累积可改善尺度估计
投影歧义(Projective Ambiguity)
在没有相机标定的情况下,可以恢复到投影歧义:
\[\mathbf{x} \simeq \mathbf{P}\mathbf{X} = \mathbf{P}\mathbf{Q}^{-1}(\mathbf{Q}\mathbf{X})\]其中 \(\mathbf{Q}\) 是任意的 \(4 \times 4\) 满秩矩阵。
自由度: 投影矩阵有 \(4 \times 4 = 16\) 个元素,减去射影等价下的 1 个自由度,共 15 个自由度。
仿射歧义(Affine Ambiguity)
施加平行性约束(parallelism constraints)可以升级到仿射歧义:
\[\mathbf{x} \simeq \mathbf{P}\mathbf{X} = \mathbf{P}\mathbf{Q}^{-1}(\mathbf{Q}\mathbf{X})\]其中 \(\mathbf{Q}\) 是仿射变换矩阵,保持平行关系。
仿射变换有 \(12\) 个参数(包括 \(3 \times 3\) 线性变换和 \(3\) 维平移),减去 1 个整体尺度自由度。
尺度恢复
使用双目系统恢复绝对尺度:
- 已知基线长度(两相机中心距离)\(b\)
- 可以恢复绝对尺度
使用单目序列恢复尺度:
- 利用已知大小的物体
- 利用相机运动的约束
- 利用先验知识
9.3 SfM 管线
典型的多视图 SfM 流程
多张图像
↓
特征提取与匹配
↓
初始相机姿态估计(两视图)
↓
增量式相机注册与三角化
↓
光束调整(Bundle Adjustment)
↓
密集深度估计(可选)
↓
三维重建结果
关键步骤详解
1. 特征提取与匹配
- 检测不变特征点(SIFT, ORB 等)
- 描述子匹配和几何验证
- 输出:图像间对应的特征点对
2. 两视图几何估计
- 使用对极约束估计基础矩阵 \(\mathbf{F}\) 或本质矩阵 \(\mathbf{E}\)
- 分解得到相对姿态(\(\mathbf{R}, \mathbf{t}\))
- 三角化初始三维点
3. 增量式注册
- 逐张添加新图像
- 估计新相机姿态(透视-三点问题 PnP)
- 三角化新点
4. 光束调整(Bundle Adjustment, BA)
光束调整是 SfM 中最关键的优化步骤,用于同时精细化所有相机参数和三维点坐标。
优化问题表述:
给定多张图像中观察到的点投影 \(\mathbf{x}_{ij}\)(第 \(i\) 个相机中第 \(j\) 个点的投影),求相机参数 \(\{\mathbf{P}_i\}_{i=1}^m\) 和三维点坐标 \(\{\mathbf{X}_j\}_{j=1}^n\) 使得:
\[\min_{\mathbf{P}, \mathbf{X}} \sum_{i=1}^m \sum_{j=1}^n w_{ij} \|\mathbf{x}_{ij} - \pi(\mathbf{P}_i \mathbf{X}_j)\|^2\]其中:
- \(\pi\):投影函数(将齐次坐标归一化为像素坐标)
- \(w_{ij}\):权重(观察置信度),如果点 \(j$ 在图像\)i$$ 中不可见则为 0
- 总共约 \(2mn\) 个约束方程(每个观察贡献 2 个约束)
- 约 \(6m + 3n\) 个未知数(每个相机 6 个自由度,每个点 3 个坐标)
稀疏性结构:
雅可比矩阵具有块稀疏结构:
观察矩阵 J 的结构:
J = [
∂f1/∂P1 0 ∂f1/∂X1 ∂f1/∂X2 ...
∂f1/∂P2 0 ∂f1/∂X1 ∂f1/∂X2 ...
0 ∂f2/∂P2 ... ...
...
]
这种结构使得可以使用Schur补偶法高效求解:
- 先消除三维点变量,得到相机参数的约化系统
- 求解相机参数
- 回代求解三维点坐标
- 时间复杂度从 \(O((m+n)^3)\) 降低到 \(O(m^3 + mn^2)\)
算法实现:
通常使用 Levenberg-Marquardt (LM) 算法:
- 初始化相机参数和三维点
- 计算当前残差:\(r_{ij} = \mathbf{x}_{ij} - \pi(\mathbf{P}_i \mathbf{X}_j)\)
- 计算雅可比矩阵 \(\mathbf{J}\)
- 求解法线方程:\((\mathbf{J}^T\mathbf{J} + \lambda \mathbf{I})\Delta\mathbf{p} = \mathbf{J}^T\mathbf{r}\)
- 更新参数:\(\mathbf{p} \leftarrow \mathbf{p} + \Delta\mathbf{p}\)
- 如果残差减小,减小 \(\lambda\);否则增大 \(\lambda\),重复第 4 步
- 收敛时停止
收敛标准:
- 残差平方和变化 \(< \epsilon_1\)
- 参数变化范数 \(< \epsilon_2\)
- 达到最大迭代次数
常见陷阱和解决方案:
| 问题 | 原因 | 解决方案 |
|---|---|---|
| 局部极值 | 初始值差 | 多初始化、全局优化 |
| 发散 | 坏的初值、异常值 | RANSAC 外点处理、鲁棒损失函数 |
| 缓慢收敛 | 病态条件 | 参数归一化、尺度调整 |
| 内存溢出 | 点太多 | 递进式 BA、稀疏求解器 |
5. 密集深度估计
- 从稀疏点云生成密集深度
- 立体匹配、平面扫描等方法
9.4 两视图立体 vs 结构运动
两视图立体(Two-View Stereo)
输入: 已标定的立体对(已知相机矩阵 \(\mathbf{K}_1, \mathbf{K}_2\))
已知: 相对姿态 \(\mathbf{R}, \mathbf{t}\)
任务: 生成密集深度图
优点:
- 相机参数已知
- 只需立体匹配
- 深度计算直接
限制:
- 需要预先标定
- 基线固定
- 适合特定应用
结构运动(SfM)
输入: 多张未标定图像
未知: 相机参数和三维结构
任务: 同时估计相机参数和三维结构
优点:
- 无需预先标定
- 使用任意视角
- 灵活性强
- 适合一般场景
挑战:
- 尺度歧义
- 非线性优化复杂
- 初始化敏感
- 累积误差
9.5 实际应用
自动驾驶定位
SfM 用于:
- 视觉里程计(Visual Odometry)
- SLAM(实时定位与建图)
- 高精地图生成
三维重建
- 文物数字化
- 建筑物重建
- 无人机测量
虚拟现实
- 视点合成
- 虚实融合
- 沉浸式内容
事件摄像机 SfM
使用基于事件的传感器实现高速、低功耗的视觉系统。
9.6 常见挑战与解决方案
挑战 1:特征匹配的歧义
问题: 重复纹理或缺乏纹理导致匹配错误
解决方案:
- 几何验证(RANSAC)
- 使用多种描述子
- 相互匹配一致性检查
挑战 2:初始化困难
问题: 初始相机姿态估计易陷入局部极值
解决方案:
- 多初始化尝试
- 使用已知场景约束
- 循序渐进的初始化
挑战 3:尺度模糊
问题: 单目 SfM 的根本限制
解决方案:
- 双目视觉
- IMU 辅助
- 已知大小物体参考
挑战 4:动态场景
问题: 移动物体违反静态假设
解决方案:
- 动态物体分割
- 鲁棒估计(M-estimator)
- 分层 SfM
9.7 总结
结构运动是从图像序列恢复三维场景和相机运动的基础问题。它统一了校准、三角化等子问题,但同时带来尺度歧义等固有限制。
关键要点:
- 固有歧义:尺度、投影、仿射歧义
- 管线设计:特征匹配 → 初始化 → 增量注册 → 光束调整
- 核心技术:对极几何、PnP、光束调整
- 实际应用:SLAM、密集重建、虚拟现实
- 开源框架:OpenMVG, COLMAP, ORB-SLAM
Enjoy Reading This Article?
Here are some more articles you might like to read next: