第一章:课程导论与预备知识——相机外参到底是什么?

各位同学好,我是这门课的主讲。在正式开始之前,我想先聊聊一个很基础、但又特别容易被忽视的问题:相机外参矩阵。

我见过不少刚入行的朋友,一上来就调OpenCV的solvePnP,跑出来一个旋转向量和平移向量,然后直接拿去用。结果呢?要么坐标系对不上,要么融合IMU时炸了。嗯,说白了,就是没搞懂外参矩阵到底在描述什么。

这一章,我们就把这个地基打牢。

1.1 什么是相机外参?

相机外参,英文叫 Extrinsic Parameters。它描述的是:相机坐标系 相对于 世界坐标系 的位姿。

你想想看,相机放在桌子上、装在车上、挂在无人机上,它总有一个位置和朝向吧?外参矩阵就是用来表达这个“位置+朝向”的数学工具。

一句话总结:外参矩阵 = 旋转矩阵 R + 平移向量 t。它把世界坐标系下的点,变换到相机坐标系下。

我个人习惯把外参矩阵理解成“相机在世界中的身份证”。有了它,你才知道相机在哪、在看哪。

1.2 为什么需要解算外参?

这个问题其实很实际。我举几个场景:

  • AR/VR: 你要把虚拟物体“放”在现实世界的某个位置。如果外参不准,虚拟物体就会飘。
  • 视觉SLAM: 每一帧图像,你都要知道相机当前在哪。外参就是每一帧的位姿。
  • 3D重建: 多张照片拼成一个模型,每张照片的外参必须精确对齐。
  • 机器人导航: 相机看到路标,你得知道路标相对于机器人的位置,才能规划路径。

说白了,没有外参,相机就是一个“睁眼瞎”。它能看到像素,但不知道这些像素对应到现实世界的哪里。

避坑指南: 我曾经在一个项目中,直接用标定板算出来的外参去融合IMU,结果发现IMU的坐标系和相机坐标系差了90度。后来才发现,我用的标定板坐标系定义和IMU的坐标系定义不一致。所以,外参的“参考系”一定要先对齐。

1.3 外参矩阵的数学定义

好,我们来看数学形式。外参矩阵通常写作 [R | t],是一个 3×4 的矩阵:

外参矩阵 = [ R  |  t ]
            [ 0  |  1 ]   (齐次形式,4×4)

其中:

  • R:3×3 旋转矩阵。描述相机坐标系相对于世界坐标系的旋转。
  • t:3×1 平移向量。描述相机坐标系原点在世界坐标系中的位置。

它的作用很简单:把一个世界坐标系下的点 P_w,变换到相机坐标系下 P_c。

P_c = R * P_w + t

用齐次坐标写就是:

[ P_c ]   =  [ R  t ]  *  [ P_w ]
[  1  ]      [ 0  1 ]     [  1  ]

这里有个细节要注意:R 必须是正交矩阵,且行列式为 +1。我见过有人直接拿数值优化出来的矩阵当R用,结果不满足正交性,后面全乱套了。

1.4 旋转矩阵的三种常见表示

在实际工程中,我们很少直接用9个参数的旋转矩阵。为什么呢?因为优化起来约束太多。常用的替代方案有:

表示方式 参数数量 优点 缺点
旋转矩阵 R 9 直观,无奇异性 必须满足正交约束,优化困难
旋转向量 (轴角) 3 紧凑,无约束 有奇异性(角度为0或π时)
四元数 4 无奇异性,插值方便 需要归一化,不直观

我个人习惯在SLAM系统中用四元数做优化,最后再转成旋转矩阵去渲染。为什么呢?因为四元数没有万向锁问题,而且插值平滑。

1.5 课程整体大纲与学习路径

这门课一共30章,我把它分成四个阶段:

  1. 基础篇(第1-5章): 外参矩阵的数学基础、坐标系定义、针孔模型、畸变模型。这部分是“内功”。
  2. 解算篇(第6-15章): PnP问题、EPnP、直接线性变换、非线性优化、BA。这部分是“招式”。
  3. 实战篇(第16-25章): 基于OpenCV、Eigen、Ceres的代码实现,从单帧到多帧,从纯视觉到视觉+IMU。这部分是“实战”。
  4. 进阶篇(第26-30章): 外参在线标定、鲁棒估计、退化场景处理、工程部署优化。这部分是“心法”。

下面这张图,帮你快速建立知识体系:

课程知识体系结构 基础篇 数学基础·坐标系 解算篇 PnP·BA·优化 实战篇 OpenCV·Ceres 进阶篇 在线标定·鲁棒 学习路径建议: 1. 先掌握基础篇的坐标系定义和数学推导 2. 再学习解算篇的各种PnP算法原理 3. 实战篇跟着代码一步步实现,不要只看不写 4. 进阶篇解决实际工程中的“脏活累活” 每章都配有代码示例和避坑指南,建议边学边练

1.6 你需要准备什么?

这门课不是零基础课。我假设你已经:

  • 熟悉线性代数(矩阵乘法、特征值、SVD)
  • 会用C++,了解OpenCV的基本操作
  • 对相机模型有基本概念(针孔模型、内参矩阵)

如果你对上面这些还有点模糊,别担心。我在基础篇会快速带大家过一遍,但不会花太多时间。毕竟,我们的目标是实战。

重要提醒: 外参矩阵的解算,90%的坑都出在坐标系定义上。从第一章开始,我建议大家养成一个习惯:每写一段代码,先问自己“当前这个点是在哪个坐标系下?”。这个习惯能帮你省下大量调试时间。

好,第一章就到这里。记住:外参矩阵不是一堆数字,它是相机和世界之间的桥梁。搞懂它,后面的路就好走了。