2、相机成像模型:针孔相机模型、坐标系(世界、相机、图像、像素)定义与转换关系

相机成像模型是三维计算机视觉的基石。无论是立体匹配、视觉SLAM、AR/VR定位,还是工业测量与自动驾驶感知,所有几何计算的第一步,都是将三维空间中的点映射到二维图像平面上。理解这一映射过程,本质上就是理解四个坐标系之间的刚体变换与透视投影关系。本节将围绕针孔相机模型,系统梳理世界坐标系、相机坐标系、图像坐标系与像素坐标系的定义,并推导它们之间的数学转换链路,为后续的畸变校正、双目标定与三维重建打下坚实基础。

相机成像模型:四坐标系转换链路 世界坐标系 (Xw, Yw, Zw) 客观三维世界 单位:m / mm 相机坐标系 (Xc, Yc, Zc) 光心为原点 Zc指向主光轴 图像坐标系 (x, y) 物理单位:mm 光轴与像面交点 像素坐标系 (u, v) 离散整数像素 原点在左上角 R, t 刚体变换 f 透视投影 dx, dy 离散化 核心转换公式(齐次坐标形式): Zc · [u, v, 1]ᵀ = K · [R | t] · [Xw, Yw, Zw, 1]ᵀ 内参矩阵 K = [fx, 0, cx; 0, fy, cy; 0, 0, 1] 外参 [R | t]:3×3旋转矩阵 + 3×1平移向量(世界→相机) fx = f/dx, fy = f/dy(f为焦距,dx/dy为像元尺寸) | cx, cy为主点像素坐标 注:完整模型还需考虑畸变系数(k1, k2, p1, p2, k3),见后续章节

2.1 针孔相机模型:从物理光学到数学抽象

针孔相机模型(Pinhole Camera Model)是相机成像的最简近似。它假设光线沿直线传播,所有来自三维空间点的光线通过一个无限小的“针孔”(即光心)后,在后方像平面上形成倒立的实像。实际相机使用透镜代替针孔以增加进光量,但透镜的引入会带来畸变,因此针孔模型成为后续畸变校正的基准。

设三维空间点 P(Xc, Yc, Zc) 在相机坐标系下,其投影到图像平面上的物理坐标 (x, y) 满足相似三角形关系:

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

其中 f 为焦距(物理单位,通常为毫米)。该式表明:深度 Zc 越大,投影点越靠近主点;当 Zc 趋近于 0 时,投影点趋于无穷远,这解释了为什么近处物体在图像中显得更大。针孔模型是线性模型,但实际镜头存在径向畸变(桶形/枕形)和切向畸变(透镜与像面不平行),这些将在后续章节中通过畸变系数进行非线性补偿。

关键理解:针孔模型将三维到二维的映射简化为“除以深度”的透视除法。这一除法操作使得成像过程不可逆——仅凭单张图像无法恢复深度,必须依赖多视图几何或深度传感器。

2.2 四大坐标系的精确定义

在OpenCV标定流程中,四个坐标系各有明确的物理含义与数学表达。下表总结了它们的定义、原点位置、单位及用途:

坐标系 原点 单位 轴方向 典型用途
世界坐标系 人为指定(如标定板角点) m / mm 任意(通常Z轴垂直标定板) 描述物体在真实世界的位置
相机坐标系 光心(透镜中心) m / mm Zc沿主光轴向前,Xc向右,Yc向下 描述物体相对相机的空间位置
图像坐标系 光轴与像面交点(主点) mm x向右,y向下 物理成像平面上的连续坐标
像素坐标系 图像左上角 像素(pixel) u向右,v向下 数字图像中离散的像素索引

需要特别注意的是:相机坐标系的Y轴方向与图像坐标系的y轴方向一致(均向下),这与数学中常见的右手坐标系不同。OpenCV中图像原点在左上角,u轴向右,v轴向下,因此像素坐标与图像坐标之间仅存在缩放和平移关系,无翻转。

2.3 坐标系转换链路:从世界点到像素

完整的转换过程分为三步:刚体变换(世界→相机)→ 透视投影(相机→图像)→ 像素离散化(图像→像素)。以下逐一推导。

步骤一:世界坐标系 → 相机坐标系(外参)

世界坐标系中的点 Pw = (Xw, Yw, Zw, 1)ᵀ 通过旋转矩阵 R(3×3)和平移向量 t(3×1)变换到相机坐标系:

Pc = R · Pw + t

其中 R 是正交矩阵(满足 RᵀR = I),t 表示世界原点在相机坐标系中的位置。R 和 t 合称为相机的外参(Extrinsic Parameters),它们描述了相机在世界坐标系中的位姿。在OpenCV标定中,外参通常针对每张标定板图像单独计算。

步骤二:相机坐标系 → 图像坐标系(内参·投影)

根据针孔模型,相机坐标系下的点 (Xc, Yc, Zc) 投影到图像平面:

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

写成齐次坐标形式:

Zc · [x, y, 1]ᵀ = [f, 0, 0; 0, f, 0; 0, 0, 1] · [Xc, Yc, Zc]ᵀ

步骤三:图像坐标系 → 像素坐标系(内参·离散化)

图像物理坐标 (x, y) 转换为像素坐标 (u, v),需要引入像元尺寸 dx 和 dy(每个像素在x和y方向的物理宽度,单位mm/pixel),以及主点偏移 (cx, cy):

u = x / dx + cx
v = y / dy + cy

合并步骤二和三,得到内参矩阵 K:

K = [fx, 0, cx;
     0, fy, cy;
     0,  0,  1]

其中 fx = f/dx,fy = f/dy,单位为像素。最终完整投影方程:

Zc · [u, v, 1]ᵀ = K · [R | t] · [Xw, Yw, Zw, 1]ᵀ
工程经验:fx 和 fy 通常不相等,因为CMOS传感器像元可能不是正方形(dx ≠ dy)。在OpenCV标定结果中,如果 fx 与 fy 差异超过0.5%,应检查标定板是否倾斜或镜头是否存在异常。

2.4 案例拆解:单目相机标定中的坐标系应用

假设我们使用一张 9×6 的棋盘格标定板(内角点数为 8×5),每个方格边长为 30mm。以下是坐标系转换在标定流程中的具体体现:

  1. 世界坐标设定:以棋盘格左上角内角点为原点,Z轴垂直于标定板平面,则所有角点的世界坐标为 (i·30, j·30, 0),其中 i=0..7, j=0..4。
  2. 角点检测:在图像中通过 cv2.findChessboardCorners() 检测亚像素角点,得到对应的像素坐标 (u, v)。
  3. 外参初估:OpenCV使用张正友标定法,先忽略畸变,通过单应性矩阵 H = K·[r1, r2, t] 分解出每张图像的外参。
  4. 内参优化:多张图像联合优化,最小化重投影误差:Σ || p_measured - p_projected(K, R, t, Pw) ||²。
  5. 畸变校正:在优化中加入径向畸变 k1, k2, k3 和切向畸变 p1, p2,得到最终标定结果。

实际标定中,我们拍摄 15~20 张不同姿态的标定板图像。每张图像的外参不同,但内参 K 和畸变系数是共享的。通过最小化所有图像的总重投影误差(通常要求小于0.1像素),即可获得高精度的相机参数。

常见误区:初学者常将图像坐标系原点误认为图像左上角。实际上,图像坐标系的原点是主点(光轴与像面的交点),而像素坐标系原点在左上角。两者相差一个平移量 (cx, cy)。如果混淆,会导致标定结果中 cx, cy 出现数百像素的偏差。

2.5 常见误区与总结复盘

在理解相机成像模型时,以下误区需要特别警惕:

  • 误区一:认为 fx = fy。实际镜头中,由于传感器制造公差和镜头畸变,fx 与 fy 通常有微小差异。在精密测量中必须分别标定。
  • 误区二:忽略 Zc 的作用。投影方程中的 Zc 是深度因子,它决定了投影点的尺度。在齐次坐标中,Zc 不能随意归一化,否则会丢失深度信息。
  • 误区三:混淆内参与外参。内参描述相机自身的投影属性(焦距、主点、畸变),外参描述相机在世界中的位姿。内参是相机的固有属性,不随拍摄位置变化;外参随每张图像变化。
  • 误区四:认为标定板必须水平放置。实际上,标定板应倾斜放置以提供足够的几何约束,否则退化配置会导致标定失败。

总结:相机成像模型的核心是四个坐标系之间的三次变换。世界到相机是刚体变换(外参),相机到图像是透视投影(内参中的焦距部分),图像到像素是离散化(内参中的像元尺寸与主点)。掌握这一链路,是理解相机标定、双目立体视觉、PnP位姿估计等高级主题的前提。在OpenCV中,cv2.calibrateCamera() 函数封装了上述全部数学过程,但只有深入理解其背后的坐标系转换逻辑,才能在标定结果异常时快速定位问题根源。