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) 算法:

  1. 初始化相机参数和三维点
  2. 计算当前残差:\(r_{ij} = \mathbf{x}_{ij} - \pi(\mathbf{P}_i \mathbf{X}_j)\)
  3. 计算雅可比矩阵 \(\mathbf{J}\)
  4. 求解法线方程:\((\mathbf{J}^T\mathbf{J} + \lambda \mathbf{I})\Delta\mathbf{p} = \mathbf{J}^T\mathbf{r}\)
  5. 更新参数:\(\mathbf{p} \leftarrow \mathbf{p} + \Delta\mathbf{p}\)
  6. 如果残差减小,减小 \(\lambda\);否则增大 \(\lambda\),重复第 4 步
  7. 收敛时停止

收敛标准:

  • 残差平方和变化 \(< \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 总结

结构运动是从图像序列恢复三维场景和相机运动的基础问题。它统一了校准、三角化等子问题,但同时带来尺度歧义等固有限制。

关键要点:

  1. 固有歧义:尺度、投影、仿射歧义
  2. 管线设计:特征匹配 → 初始化 → 增量注册 → 光束调整
  3. 核心技术:对极几何、PnP、光束调整
  4. 实际应用:SLAM、密集重建、虚拟现实
  5. 开源框架:OpenMVG, COLMAP, ORB-SLAM



Enjoy Reading This Article?

Here are some more articles you might like to read next:

  • notes of ML
  • notes of VCI
  • notes of AIP
  • notes of AI Math Fundamentals
  • notes of ICS