第一章:课程导论与预备知识——相机外参到底是什么?
各位同学好,我是这门课的主讲。在正式开始之前,我想先聊聊一个很基础、但又特别容易被忽视的问题:相机外参矩阵。
我见过不少刚入行的朋友,一上来就调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-5章): 外参矩阵的数学基础、坐标系定义、针孔模型、畸变模型。这部分是“内功”。
- 解算篇(第6-15章): PnP问题、EPnP、直接线性变换、非线性优化、BA。这部分是“招式”。
- 实战篇(第16-25章): 基于OpenCV、Eigen、Ceres的代码实现,从单帧到多帧,从纯视觉到视觉+IMU。这部分是“实战”。
- 进阶篇(第26-30章): 外参在线标定、鲁棒估计、退化场景处理、工程部署优化。这部分是“心法”。
下面这张图,帮你快速建立知识体系:
1.6 你需要准备什么?
这门课不是零基础课。我假设你已经:
- 熟悉线性代数(矩阵乘法、特征值、SVD)
- 会用C++,了解OpenCV的基本操作
- 对相机模型有基本概念(针孔模型、内参矩阵)
如果你对上面这些还有点模糊,别担心。我在基础篇会快速带大家过一遍,但不会花太多时间。毕竟,我们的目标是实战。
重要提醒: 外参矩阵的解算,90%的坑都出在坐标系定义上。从第一章开始,我建议大家养成一个习惯:每写一段代码,先问自己“当前这个点是在哪个坐标系下?”。这个习惯能帮你省下大量调试时间。
好,第一章就到这里。记住:外参矩阵不是一堆数字,它是相机和世界之间的桥梁。搞懂它,后面的路就好走了。