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 知识体系总览

下面这张图,把四个坐标系和它们之间的转换关系画清楚了。我建议你把它存下来,后面做标定的时候随时对照。

相机成像模型:四坐标系转换关系 世界坐标系 (Xw, Yw, Zw) 相机坐标系 (Xc, Yc, Zc) 图像坐标系 (x, y) 单位:mm 像素坐标系 (u, v) 单位:pixel 外参 [R | t] 投影 (f) 内参 K 💡 关键理解: • 世界→相机:刚体变换(旋转+平移),由外参决定 • 相机→图像:透视投影(除以 Zc),由焦距 f 决定 • 图像→像素:离散化采样(缩放+平移),由内参决定

2.7 参数对比速查表

为了方便你后面写代码时查阅,我把内参和外参的核心区别整理成了表格:

对比项 内参矩阵 K 外参矩阵 [R | t]
维度 3×3 3×4
含义 相机内部物理结构 相机在世界中的位姿
是否随场景变化 否(固定不变) 是(每拍一张就变)
包含参数 fx, fy, u0, v0 旋转角 (roll, pitch, yaw) + 平移 (tx, ty, tz)
标定中求解方式 所有图像共用一组内参 每张图像对应一组外参
畸变校正中的作用 将归一化坐标映射回像素 将世界点投影到归一化平面

一句话总结:内参告诉你「像素和物理尺寸怎么换算」,外参告诉你「相机在哪儿、朝哪儿看」。两者合起来,才能把一个三维世界点映射到二维像素点上。