坐标系基础:世界坐标系、相机坐标系、图像坐标系、像素坐标系之间的转换关系
做视觉标定这么多年,我见过太多工程师一上来就对着公式硬啃,结果越看越晕。其实说白了,坐标系转换就是解决一个核心问题:怎么把现实世界中一个点的位置,准确地映射到相机拍出来的照片上。
我个人习惯把这件事拆成四步走。每一步对应一个坐标系,环环相扣。你只要搞懂了这四步,标定原理就通了七成。
1. 四个坐标系,各司其职
先认识一下今天的主角们。它们就像一条流水线上的四个工位,每个工位干自己的活:
| 坐标系 | 单位 | 描述 |
|---|---|---|
| 世界坐标系 | mm / m | 我们熟悉的真实三维空间。比如机械臂的基座、流水线的起点,都可以作为原点。 |
| 相机坐标系 | mm / m | 以相机光心为原点,Z轴指向镜头前方。说白了,就是「相机眼中的三维世界」。 |
| 图像坐标系 | mm | 在相机内部,感光芯片上的物理平面。单位是毫米,原点一般在芯片中心。 |
| 像素坐标系 | pixel | 我们最终看到的图像。原点在左上角,单位是像素。你拍的照片就是它。 |
嗯,这里要注意:世界坐标系和相机坐标系是三维的,图像和像素坐标系是二维的。从三维到二维,必然有信息丢失——这就是透视投影在起作用。
2. 转换链条:从世界到像素
整个转换过程,就像一条单向流水线:
世界坐标 → 相机坐标 → 图像坐标 → 像素坐标
每一步都有明确的数学关系。我画了一张图帮你理清脉络:
这张图你看明白了吗?标定的本质,就是求解这些参数。下面我们一步步拆解。
3. 第一步:世界坐标系 → 相机坐标系(刚体变换)
这一步最简单。世界坐标系和相机坐标系之间,只差一个旋转和一个平移。用数学表达就是:
|Xc| | R11 R12 R13 | |Xw| |Tx|
|Yc| = | R21 R22 R23 | |Yw| + |Ty|
|Zc| | R31 R32 R33 | |Zw| |Tz|
写成齐次坐标更简洁:
[Xc, Yc, Zc, 1]^T = [R | T] * [Xw, Yw, Zw, 1]^T
这里的R是3x3旋转矩阵,T是3x1平移向量。它们合起来就是相机外参。
我的经验: 在实际项目中,我习惯用旋转向量而不是旋转矩阵来标定。因为旋转向量只有3个参数,优化起来更稳定。用Rodrigues公式可以互相转换,OpenCV里直接有函数。
4. 第二步:相机坐标系 → 图像坐标系(透视投影)
这一步是三维到二维的关键跳跃。用的是小孔成像模型:
x = f * Xc / Zc
y = f * Yc / Zc
写成矩阵形式:
|x| |f 0 0 0| |Xc|
|y| = |0 f 0 0| |Yc|
|1| |0 0 1 0| |Zc|
|1 |
这里f是焦距。你想想看,Zc在分母上——这就是为什么距离越远,物体在图像上越小。
避坑指南: 我曾经在一个项目中,相机安装角度有点偏,结果标定出来的焦距值总是飘。后来发现是畸变没校正到位。记住:畸变校正一定要在投影之前做,顺序不能乱。
5. 第三步:图像坐标系 → 像素坐标系(仿射变换)
图像坐标系的原点在芯片中心,单位是毫米。像素坐标系的原点在左上角,单位是像素。转换关系:
u = x / dx + cx
v = y / dy + cy
其中dx、dy是每个像素的物理尺寸,cx、cy是主点坐标(光心在像素坐标系中的位置)。
写成矩阵:
|u| |1/dx 0 cx| |x|
|v| = |0 1/dy cy| |y|
|1| |0 0 1 | |1|
核心要点: 内参矩阵K =
|fx 0 cx|
|0 fy cy|
|0 0 1 |
其中fx = f/dx, fy = f/dy。标定就是求这4个参数(fx, fy, cx, cy)加上畸变系数。
6. 完整转换公式(一步到位)
把三步串起来,从世界坐标到像素坐标的完整公式:
Zc * |u| |fx 0 cx 0| |R11 R12 R13 Tx| |Xw|
|v| = |0 fy cy 0| |R21 R22 R23 Ty| |Yw|
|1| |0 0 1 0| |R31 R32 R33 Tz| |Zw|
|0 0 0 1| |1 |
简化写法:
Zc * [u, v, 1]^T = K * [R | T] * [Xw, Yw, Zw, 1]^T
这就是视觉标定的核心方程。所有标定算法,本质上都是在求解K、R、T。
7. 实战中的几个坑
- 棋盘格要平整: 我见过有人用打印纸贴在弯曲的纸箱上标定,结果误差大得离谱。标定板一定要贴在刚性平面上。
- 图片数量要够: 我个人习惯拍15-20张不同角度的图片。太少的话,内参解不稳定。
- 覆盖整个视场: 标定图片要分布在画面的各个区域,尤其是边缘。中心区域拍再多,边缘畸变也标不准。
- 注意Zc的符号: 在相机坐标系中,物体在相机前方,Zc > 0。如果标定出来Zc是负的,说明坐标系定义反了。
一个小技巧: 标定完成后,可以用重投影误差来评估标定质量。一般误差小于0.5个像素就算不错。如果超过1个像素,建议检查标定板或重新采集图片。
好了,坐标系转换这部分就讲到这里。你只要记住那条转换链条,再理解每一步的物理意义,标定原理就掌握了一大半。下一节我们聊聊具体的标定方法和操作步骤。