2、相机成像模型:针孔相机模型详解
说到相机标定,咱们得先搞清楚一件事——相机到底是怎么看到世界的?
你可能会说:「不就是镜头把光聚到传感器上吗?」嗯,道理是这个道理。但要做畸变校正,就得把这件事用数学语言讲清楚。我刚开始接触这个领域时,也觉得这些坐标系转换太抽象了。直到有一次,我在做双目视觉项目时,发现左右图像怎么都对不齐……折腾了两天,最后发现是坐标系搞反了。从那以后,我再也不敢跳过这部分了。
2.1 针孔相机模型——最朴素的成像原理
针孔相机模型,说白了就是一个小黑盒,前面扎个针眼,后面放块感光板。光线从针孔穿过,在感光板上形成倒立的像。虽然真实相机有复杂的镜头组,但数学上我们仍然用这个模型来近似。
核心假设:所有光线都通过一个点——光心(投影中心)。物体上的点与像点之间满足中心投影关系。
这个模型有三个关键参数:
- 焦距 f:光心到成像平面的距离
- 光心位置:投影中心,通常记为 O
- 成像平面:传感器所在的平面
实际中,我们通常把成像平面「虚拟」地放到光心前方(正像平面),这样数学推导更方便,图像也是正立的。
2.2 四个坐标系,一次讲清楚
要做畸变校正,你得在四个坐标系之间来回穿梭。我习惯把它们分成两组来理解:
- 三维组:世界坐标系、相机坐标系
- 二维组:图像坐标系、像素坐标系
下面逐个拆解。
2.2.1 世界坐标系 (World Coordinate System)
这是你定义场景的「坐标系」。单位是米、毫米等真实物理单位。你可以把原点放在任何方便的位置——比如棋盘格标定板的角点、房间的墙角、或者机器人的基座。
一个点在世界坐标系中的坐标记为:Pw = (Xw, Yw, Zw)T
2.2.2 相机坐标系 (Camera Coordinate System)
原点在相机的光心 O 上。Z 轴指向相机的前方(沿着光轴方向),X 轴向右,Y 轴向下(符合图像坐标系习惯)。
同一个点,在相机坐标系中记为:Pc = (Xc, Yc, Zc)T
我的经验:世界坐标系到相机坐标系的转换,本质上就是一个旋转加一个平移。旋转矩阵 R 是 3×3 的正交矩阵,平移向量 t 是 3×1。合起来就是外参矩阵。
2.2.3 图像坐标系 (Image Coordinate System)
这是成像平面上的二维坐标系。原点在光轴与成像平面的交点(主点),单位是毫米。x 轴与相机坐标系的 X 轴平行,y 轴与 Y 轴平行。
点坐标记为:p = (x, y)T
根据相似三角形,从相机坐标系到图像坐标系的投影关系是:
x = f * Xc / Zc
y = f * Yc / Zc
这里 f 是焦距。你看,Zc 在分母上——这就是为什么远处的物体看起来小。
2.2.4 像素坐标系 (Pixel Coordinate System)
这是你最终看到的图像坐标系。原点在图像的左上角,u 轴向右,v 轴向下。单位是像素。
点坐标记为:(u, v)T
从图像坐标系到像素坐标系,需要做两件事:
- 缩放:把毫米变成像素,用 dx 和 dy 表示每个像素的物理尺寸
- 平移:把原点从主点移到左上角,用 u0、v0 表示主点的像素坐标
u = x / dx + u0
v = y / dy + v0
2.3 内参矩阵——相机的「身份证」
把上面两步合并,用齐次坐标写出来,就是内参矩阵 K:
[ fx 0 u0 ]
K = [ 0 fy v0 ]
[ 0 0 1 ]
其中:
- fx = f / dx:以像素为单位的 x 方向焦距
- fy = f / dy:以像素为单位的 y 方向焦距
- (u0, v0):主点的像素坐标
我曾经踩过的坑:很多初学者以为 fx 和 fy 应该相等。实际上,由于传感器像素不是完美的正方形,或者镜头有轻微变形,这两个值往往不一样。标定出来的结果如果 fx 和 fy 差太多,那就要检查标定板是否平整了。
内参矩阵只与相机本身的物理结构有关。你换了个场景,内参不变。所以它叫「内参」。
2.4 外参矩阵——相机在哪儿?朝哪儿看?
外参矩阵描述的是世界坐标系到相机坐标系的刚体变换。它由两部分组成:
- 旋转矩阵 R:3×3,描述相机的朝向
- 平移向量 t:3×1,描述相机在世界坐标系中的位置
用齐次坐标表示:
[ Xc ] [ R t ] [ Xw ]
[ Yc ] = [ ] [ Yw ]
[ Zc ] [ 0 1 ] [ Zw ]
[ 1 ] [ 1 ]
外参矩阵 [R | t] 是 3×4 的矩阵。每换一个拍摄位置,外参就变了。所以它叫「外参」。
我的习惯:在做标定时,我会把世界坐标系固定在标定板上。这样标定板上的角点 Zw = 0,计算起来方便很多。你想想看,少一个维度,求解的稳定性会好不少。
2.5 完整的投影公式
把内参和外参串起来,一个世界点 Pw 到像素点 p 的完整投影过程就是:
p = K * [R | t] * Pw
用齐次坐标展开:
[ u ] [ fx 0 u0 ] [ r11 r12 r13 t1 ] [ Xw ]
[ v ] = [ 0 fy v0 ] [ r21 r22 r23 t2 ] [ Yw ]
[ 1 ] [ 0 0 1 ] [ r31 r32 r33 t3 ] [ Zw ]
[ 0 0 0 1 ] [ 1 ]
这个公式,就是整个相机标定和畸变校正的数学基础。你后面看到的张正友标定法、畸变参数求解,本质上都是在反推这个公式里的参数。
2.6 知识体系总览
下面这张图,把四个坐标系和它们之间的转换关系画清楚了。我建议你把它存下来,后面做标定的时候随时对照。
2.7 参数对比速查表
为了方便你后面写代码时查阅,我把内参和外参的核心区别整理成了表格:
| 对比项 | 内参矩阵 K | 外参矩阵 [R | t] |
|---|---|---|
| 维度 | 3×3 | 3×4 |
| 含义 | 相机内部物理结构 | 相机在世界中的位姿 |
| 是否随场景变化 | 否(固定不变) | 是(每拍一张就变) |
| 包含参数 | fx, fy, u0, v0 | 旋转角 (roll, pitch, yaw) + 平移 (tx, ty, tz) |
| 标定中求解方式 | 所有图像共用一组内参 | 每张图像对应一组外参 |
| 畸变校正中的作用 | 将归一化坐标映射回像素 | 将世界点投影到归一化平面 |
一句话总结:内参告诉你「像素和物理尺寸怎么换算」,外参告诉你「相机在哪儿、朝哪儿看」。两者合起来,才能把一个三维世界点映射到二维像素点上。