坐标系基础:世界坐标系、相机坐标系、图像坐标系、像素坐标系
做外参标定,说白了就是搞清楚相机在空间里到底「站」在哪、朝哪看。而这一切的起点,就是四个坐标系之间的来回转换。
我记得刚入行那会儿,总觉得坐标系这东西太基础,不就是几个坐标轴嘛。直到第一次做多相机拼接,发现图像怎么都对不齐,折腾了两天才意识到——哦,原来是我把图像坐标系和像素坐标系搞混了。嗯,这种坑,踩过一次就记住了。
一、四个坐标系,一张图说清楚
先给你一个整体印象。我们平时说的「标定」,本质上就是在四个坐标系之间搭桥:
世界坐标系 → 相机坐标系 → 图像坐标系 → 像素坐标系
这是一个单向流水线,数据从真实世界一路流到数字图像。
下面这张图是我自己画的,帮你把整个流程串起来:
二、逐个拆解四个坐标系
1. 世界坐标系 (World Coordinate System)
世界坐标系就是我们生活的三维空间。你随便找个墙角,把原点定在那,X轴朝东、Y轴朝北、Z轴朝天——这就是一个世界坐标系。
我个人习惯把世界坐标系的原点选在标定板的第一个角点上。为什么?因为这样外参矩阵的物理意义最直观,调试的时候一眼就能看出相机离标定板多远、偏了多少角度。
小技巧:做外参标定时,世界坐标系的原点最好选在场景中一个「不会动」的参考物上。比如地面上的一个标记点,或者标定板的固定角点。千万别选在移动的物体上——我见过有人把原点定在汽车上,结果车一开,整个世界都乱了。
2. 相机坐标系 (Camera Coordinate System)
相机坐标系的原点在相机的光心(也就是镜头中心)。Z轴指向相机正前方,X轴朝右,Y轴朝下——注意,这个Y轴方向和世界坐标系是反的。
为什么会这样?因为图像在计算机里存储时,原点在左上角,Y轴向下为正。相机坐标系为了和像素坐标系保持一致,就把Y轴也设计成向下了。嗯,这里要注意,很多初学者在这个地方栽跟头。
世界坐标系到相机坐标系的转换,靠的就是外参矩阵。说白了,就是一次旋转加一次平移:
// 世界坐标 → 相机坐标
P_c = R * P_w + t
// 写成齐次形式
| Xc | | R11 R12 R13 tx | | Xw |
| Yc | = | R21 R22 R23 ty | * | Yw |
| Zc | | R31 R32 R33 tz | | Zw |
| 1 | | 0 0 0 1 | | 1 |
这个4x4矩阵,就是我们要标定的外参矩阵。R是旋转矩阵,t是平移向量。
3. 图像坐标系 (Image Coordinate System)
图像坐标系是二维的,原点在相机光轴与成像平面的交点——也就是图像的中心点。单位是毫米。
从相机坐标系到图像坐标系,用的是小孔成像模型:
x = f * Xc / Zc
y = f * Yc / Zc
这里f是焦距。你看,Zc出现在了分母上——这就是为什么远处的物体看起来小。透视投影,说白了就是「近大远小」的数学表达。
避坑指南:我曾经在项目里直接用像素坐标去算外参,结果怎么都对不上。后来才发现,图像坐标系的单位是毫米,像素坐标系的单位是像素,中间差了一个「像素尺寸」的缩放因子。千万别跳步。
4. 像素坐标系 (Pixel Coordinate System)
像素坐标系就是我们最终看到的图像。原点在图像的左上角,u轴向右,v轴向下。单位是像素。
从图像坐标到像素坐标,就是一个缩放加平移:
u = x / dx + u0
v = y / dy + v0
其中dx和dy是每个像素在x和y方向上的物理尺寸(单位:毫米/像素),(u0, v0)是图像中心点的像素坐标。
写成矩阵形式就是内参矩阵:
| u | | fx 0 u0 | | x |
| v | = | 0 fy v0 | * | y |
| 1 | | 0 0 1 | | 1 |
这里fx = f/dx,fy = f/dy,是归一化后的焦距。
三、完整的转换链条
把上面四步串起来,就是完整的投影公式:
| u | | fx 0 u0 | | R11 R12 R13 tx | | Xw |
| v | = | 0 fy v0 | * | R21 R22 R23 ty | * | Yw |
| 1 | | 0 0 1 | | R31 R32 R33 tz | | Zw |
| 0 0 0 1 | | 1 |
// 简写为:
p = K * [R|t] * P_w
K是内参矩阵,[R|t]是外参矩阵。外参标定要解的,就是这个[R|t]。
四、一张表总结
| 坐标系 | 维度 | 单位 | 原点位置 | 转换到下一级 |
|---|---|---|---|---|
| 世界坐标系 | 3D | 米 | 自定义(推荐标定板角点) | 外参矩阵 [R|t] |
| 相机坐标系 | 3D | 米 | 相机光心 | 小孔成像(除以Zc) |
| 图像坐标系 | 2D | 毫米 | 图像中心 | 内参矩阵 K |
| 像素坐标系 | 2D | 像素 | 图像左上角 | — |
五、实操中的几个要点
- 齐次坐标是个好东西。用齐次坐标可以把旋转和平并到一个矩阵里,计算起来特别方便。我个人写代码时,所有3D点都用齐次坐标表示,省事。
- 注意坐标轴方向。相机坐标系的Y轴向下,世界坐标系的Y轴通常向上。这个差异在计算旋转矩阵时一定要考虑进去。
- 像素坐标是离散的。图像坐标是连续的(毫米),但像素坐标是整数。做投影时,最后一步会取整,这就引入了量化误差。高精度标定时,这个误差不能忽略。
一句话记住:外参解决「相机在哪、朝哪看」的问题,内参解决「光线怎么落到传感器上」的问题。两者结合,才能把三维世界映射到二维图像。
好了,坐标系的基础就讲到这里。你想想看,这四个坐标系其实就是一个从三维到二维的「压缩管道」。理解了这条管道,后面学外参标定算法就会轻松很多。