2、成像几何基础:小孔成像模型、针孔相机模型、世界坐标系、相机坐标系、图像坐标系、像素坐标系
好,咱们正式开始聊成像几何。这部分是相机标定的地基,地基不牢,后面全白搭。我个人习惯把这一章叫做「坐标系串讲」,因为说白了,整个标定过程就是不同坐标系之间来回倒腾。
2.1 小孔成像模型:最朴素的相机
先说说小孔成像。你拿一个黑盒子,前面戳个小孔,后面放块感光板。光线穿过小孔,在板上投下一个倒立的像。这就是最原始的相机。
嗯,这里要注意:小孔越小,像越清晰,但进光量也越少。我在项目中遇到过用针孔相机做工业检测的案例,结果因为小孔太小,曝光时间要好几秒,生产线根本跑不起来。后来还是换成了透镜。
核心公式:
小孔成像的几何关系其实就一句话:
像的大小 / 物体的大小 = 像距 / 物距
用数学表达就是:
-x / X = f / Z
其中负号表示像是倒立的。
2.2 针孔相机模型:数学化的相机
针孔相机模型,说白了就是把小孔成像数学化。它假设光线是直线传播的,没有畸变,没有模糊。当然,现实中没有这么完美的相机,但作为数学模型,它足够好用。
我刚开始做标定时,总觉得针孔模型太理想化,后来发现:你先用理想模型把问题理清楚,再考虑畸变修正,这是最稳妥的路径。 你想想看,如果连理想情况都搞不定,加上畸变只会更乱。
我的经验: 针孔模型中有四个关键参数——焦距 f、主点偏移 (cx, cy)。这些参数合起来叫内参矩阵。我曾经在标定一个广角镜头时,发现主点偏移特别大,一开始以为是标定错了,后来查资料才知道广角镜头的主点偏移本来就大。嗯,别慌,这是正常的。
2.3 四个坐标系:从世界到像素
接下来是重头戏。四个坐标系,一个链条,把三维世界映射到二维像素。我建议你把这个链条背下来:
- 世界坐标系 (World Coordinate System) — 你说了算的坐标系
- 相机坐标系 (Camera Coordinate System) — 以相机为中心
- 图像坐标系 (Image Coordinate System) — 物理单位(毫米)
- 像素坐标系 (Pixel Coordinate System) — 像素单位
2.3.1 世界坐标系 → 相机坐标系
世界坐标系是你自己定义的。比如你放一个棋盘格在地上,棋盘格的角点就是世界坐标。相机坐标系呢?以相机光心为原点,Z轴指向镜头前方。
从世界到相机,其实就是一次刚体变换:旋转 + 平移。用数学表达就是:
X_cam = R * X_world + T
其中 R 是 3x3 旋转矩阵,T 是 3x1 平移向量。这六个参数(三个旋转角 + 三个平移量)就是传说中的外参。
避坑指南: 我曾经在标定时把世界坐标系的原点放在了棋盘格中心,结果旋转矩阵算出来总是怪怪的。后来发现,原点放在棋盘格左上角更稳定。为什么?因为角点检测时,左上角的角点最容易被准确识别。
2.3.2 相机坐标系 → 图像坐标系
这一步是透视投影。相机坐标系中的点 (X, Y, Z) 投影到成像平面上,得到图像坐标 (x, y)。公式很简单:
x = f * X / Z
y = f * Y / Z
注意这里 Z 是深度。Z 越大,物体看起来越小。这就是近大远小的数学本质。
我习惯用齐次坐标来写这个变换,因为可以统一成矩阵乘法:
[x'] [f 0 0 0] [X]
[y'] = [0 f 0 0] [Y]
[z'] [0 0 1 0] [Z]
[1]
然后 x = x'/z', y = y'/z'。嗯,齐次坐标的好处就是能把除法变成乘法,方便后续计算。
2.3.3 图像坐标系 → 像素坐标系
图像坐标是物理单位(毫米),像素坐标是像素单位。转换需要两个参数:
- dx, dy:每个像素的物理尺寸(毫米/像素)
- cx, cy:主点偏移(像素)
公式:
u = x / dx + cx
v = y / dy + cy
写成矩阵形式:
[u] [1/dx 0 cx] [x]
[v] = [0 1/dy cy] [y]
[1] [0 0 1 ] [1]
2.4 完整的投影公式
把上面三步串起来,就得到了从世界坐标到像素坐标的完整映射:
s * [u] [fx 0 cx] [R | T] [X_w]
[v] = [0 fy cy] [ ] [Y_w]
[1] [0 0 1] [ ] [Z_w]
[ ] [1 ]
其中:
- fx = f/dx, fy = f/dy — 以像素为单位的焦距
- cx, cy — 主点偏移
- R, T — 外参
- s — 缩放因子(因为齐次坐标的尺度不确定性)
一句话总结: 相机标定就是求解内参矩阵 K 和外参 [R|T] 的过程。内参是相机自己的属性,外参是相机在世界中的位置和朝向。
2.5 我的实战建议
最后分享几个我在项目中踩过的坑:
- 坐标系方向要统一: 我习惯用右手系,Z轴朝前。但有些库用左手系,不注意的话旋转矩阵会算反。
- 主点不一定是图像中心: 很多初学者以为 cx = width/2, cy = height/2。实际上因为镜头安装误差,主点往往偏离中心几个像素甚至几十个像素。
- fx 和 fy 可能不相等: 如果传感器像素不是正方形,fx 和 fy 就不一样。这在手机相机上很常见。
好了,成像几何基础就聊到这里。下一章我们开始讲畸变模型——为什么直线拍出来会变弯,以及怎么把它掰直。