2. 相机成像原理:针孔相机模型、坐标系转换、相机内参与外参

做深度估计,第一个绕不开的就是相机成像原理。说白了,你得知道一张照片是怎么来的,才能从照片里反推出深度信息。

我记得刚入行那会儿,有个项目需要从单目图像里恢复三维结构。我拿着相机标定板拍了一整天,结果重建出来的点云全是扭曲的。后来才发现,是我对坐标系转换的理解出了偏差。嗯,这节课我们就把这个基础打扎实。

2.1 针孔相机模型

针孔相机模型,是所有成像模型里最基础、最经典的一个。你想想看,一个暗箱,前面戳个小孔,光线穿过小孔在后面的感光面上成像——就这么简单。

但实际相机不是这么做的。真实相机用的是透镜,透镜会引入畸变。不过没关系,针孔模型是理想化的起点,所有复杂模型都是在这个基础上加修正项。

核心公式:

三维空间点 P(X, Y, Z) 投影到成像平面上的点 p(x, y):

x = f * X / Z
y = f * Y / Z

其中 f 是焦距,Z 是物体到相机的深度。

这里有个关键点:深度 Z 在分母上。这意味着什么?意味着近处的物体在图像上大,远处的物体小。这就是透视效应的数学本质。

我的经验:在实际项目中,我习惯把针孔模型当作「第一性原理」来理解。不管后面用多复杂的网络,最终输出的深度图,本质上都是在求解这个公式里的 Z。

2.2 四大坐标系转换

做深度估计,你会在四个坐标系之间反复横跳。我刚开始学的时候,被这四个坐标系绕晕过好几次。后来我画了一张图,一下子就清楚了。

世界坐标系 (Xw, Yw, Zw) 真实世界的三维坐标 相机坐标系 (Xc, Yc, Zc) 以相机光心为原点 图像坐标系 (x, y) 物理单位(mm) 像素坐标系 (u, v) 像素单位(pixel) 外参 R, t 投影 内参 f 离散化 dx, dy, u0, v0 图:四大坐标系转换流程

这张图我建议你保存下来。每次做坐标系转换的时候,对着这张图走一遍流程,基本不会出错。

2.2.1 世界坐标系 → 相机坐标系

这一步靠的是外参。外参包括旋转矩阵 R 和平移向量 t。说白了,就是把世界坐标系下的点,挪到相机坐标系下来表示。

P_c = R * P_w + t

其中 P_w 是世界坐标,P_c 是相机坐标。R 是 3×3 的旋转矩阵,t 是 3×1 的平移向量。

注意:我曾经在项目里犯过一个低级错误——把 R 和 t 的顺序搞反了。有些库用的是 P_c = R * (P_w - t),有些用的是 P_c = R * P_w + t。一定要看清楚你用的库的约定。

2.2.2 相机坐标系 → 图像坐标系

这一步就是针孔模型的投影。从三维到二维,丢失了深度信息。

x = f * Xc / Zc
y = f * Yc / Zc

这里 f 是焦距,单位是毫米。Zc 是物体在相机坐标系下的深度。

2.2.3 图像坐标系 → 像素坐标系

图像坐标系是物理单位(毫米),像素坐标系是离散的像素点。转换公式:

u = x / dx + u0
v = y / dy + v0

其中 dx、dy 是每个像素的物理尺寸,u0、v0 是图像中心(主点)的像素坐标。

2.3 相机内参

内参矩阵 K 把上面两步合并了。它描述了从相机坐标系到像素坐标系的映射。

K = [fx  0  u0
     0  fy  v0
     0   0   1]

其中 fx = f / dx,fy = f / dy。注意,fx 和 fy 不一定相等,因为像素可能不是正方形。

内参矩阵的完整投影公式:

s * [u, v, 1]^T = K * [Xc, Yc, Zc]^T

其中 s 是尺度因子,等于 Zc。

内参是相机的固有属性。同一个相机,内参是固定的。但不同相机之间,内参差异很大。我建议你拿到一个新相机,第一件事就是标定内参。

2.4 相机外参

外参描述的是相机在世界坐标系下的位姿。说白了,就是相机在哪儿、朝哪儿看。

外参矩阵是一个 3×4 的矩阵 [R | t]。R 是旋转,t 是平移。

我的习惯:在项目中,我通常把外参理解为「相机坐标系到世界坐标系的变换」。这样想,很多公式推导会顺很多。你试试看。

2.5 完整投影公式

把上面所有步骤串起来,就是完整的投影过程:

s * [u, v, 1]^T = K * [R | t] * [Xw, Yw, Zw, 1]^T

这个公式,是深度估计的基石。你后面学到的单目深度估计、双目立体匹配、结构光三维重建,本质上都是在求解这个公式的逆过程。

参数 含义 维度 是否随相机变化
K 内参矩阵 3×3 是(不同相机不同)
R 旋转矩阵 3×3 是(不同位姿不同)
t 平移向量 3×1 是(不同位姿不同)
s 尺度因子(深度) 标量 是(每个点不同)

避坑指南:我曾经在标定相机时,把棋盘格放得太靠近图像边缘。结果标定出来的内参,边缘畸变参数完全不对。后来我学乖了:标定板要覆盖整个视野,至少拍 20 张不同角度的照片。

嗯,这一节的内容就到这里。相机成像原理是深度估计的「第一性原理」。你把这个搞懂了,后面学什么网络结构、损失函数,都会觉得有根有底。


公众号:蓝海资料掘金营,微信deep3321