一、标定基础回顾:四相机系统坐标系定义与转换关系
做四相机联合标定,第一步不是调参数,而是把坐标系理清楚。我见过太多项目,标定精度上不去,最后发现是坐标系定义就乱了。说白了,坐标系就是整个系统的「通用语言」,语言不通,后面全是白搭。
1.1 四相机系统里有哪些坐标系?
一个典型的四相机系统,至少涉及四类坐标系。嗯,这里我按从「个体」到「整体」的顺序列出来:
| 坐标系 | 符号 | 描述 | 维度 |
|---|---|---|---|
| 像素坐标系 | (u, v) | 图像上的行列位置,原点在左上角 | 2D |
| 图像物理坐标系 | (x, y) | 以光轴与像面交点为原点,单位mm | 2D |
| 相机坐标系 | (Xc, Yc, Zc) | 以光心为原点,Zc沿光轴向前 | 3D |
| 世界坐标系 | (Xw, Yw, Zw) | 用户自定义的全局参考系 | 3D |
你想想看,一个空间点从世界坐标系到最终像素,中间要经历三次变换。我在项目中遇到过有人直接把相机坐标系当世界坐标系用,结果四台相机拼出来的点云全是错位的。
1.2 核心转换关系:从世界到像素
这个链条必须刻在脑子里。我习惯把它拆成三步:
- 刚体变换:世界坐标 → 相机坐标(旋转R + 平移t)
- 透视投影:相机坐标 → 归一化成像平面(内参矩阵K)
- 畸变校正 + 数字化:归一化坐标 → 像素坐标(畸变模型 + 像素缩放)
用公式表达就是:
s * [u, v, 1]^T = K * [R | t] * [Xw, Yw, Zw, 1]^T
其中 s 是尺度因子。为什么会有 s?因为从3D到2D丢失了深度信息,投影过程天然带一个尺度模糊。这个细节在单目标定时不明显,但四相机联合标定时,尺度一致性是最大的坑之一。
关键点:四相机联合标定,本质就是求解每台相机的内参K_i,以及每台相机相对于同一个世界坐标系的[R_i | t_i]。
1.3 四相机系统的特殊之处
单目标定你可能会做,但四相机系统多了两个维度:
- 多视角重叠:相邻相机之间必须有公共视场,否则无法建立约束
- 全局一致性:四个相机的位姿必须统一到同一个世界坐标系下
我曾经踩过一个坑:四台相机分别标定,各自精度都很好,但拼在一起就是不对。后来发现,每台相机标定时用的棋盘格位置不同,世界坐标系原点根本没对齐。这就是典型的「局部最优,全局崩溃」。
避坑指南:我曾经在产线上调试四相机系统,发现标定结果反复跳动。查了两天才找到原因——标定板在四个相机视野中只出现了三个,缺失的那台相机没有约束,位姿直接飘了。记住:四相机联合标定,每张图像必须保证至少两台相机能同时看到标定板。
1.4 坐标系转换关系图
下面这张图把整个转换链路画清楚了。我建议你把它存下来,调试时对照着看:
1.5 联合标定的输入输出
搞清楚了坐标系,我们再来看联合标定到底要什么、给什么。我习惯用一张表说清楚:
| 项目 | 内容 |
|---|---|
| 输入 | 多组同步图像(每组包含4个相机同时拍摄的标定板图像) |
| 待求参数 | 4组内参K_i + 4组外参[R_i | t_i](共4×6=24个外参自由度) |
| 约束条件 | 同一标定板角点在多相机图像中的重投影误差最小化 |
| 输出 | 全局统一的相机参数文件(.yaml / .json) |
个人经验:我习惯在标定前先做一次「预对齐」——用一张大棋盘格同时覆盖四个相机的视野,粗略估算相机之间的相对位姿。这样后续优化时,初值更准,收敛更快。别小看这一步,能省你半天调试时间。
1.6 一个小结
坐标系定义是四相机联合标定的地基。地基歪了,后面盖的楼再漂亮也得塌。我个人习惯在项目一开始就画好坐标系转换图,贴在工位上,每次调试前先看一眼。你想想看,如果连世界坐标系原点在哪都没统一,那标定结果怎么可能对?