相机成像基础:针孔模型、内参外参、畸变模型、图像坐标系与相机坐标系转换

双目立体视觉的核心任务是从两幅图像中恢复三维空间信息,而这一切的起点,是理解相机如何将三维世界投影为二维像素。本章将系统梳理相机成像的数学基础:从理想针孔模型出发,建立四个坐标系之间的转换链路,引入内参与外参的物理含义,再讨论真实镜头带来的畸变及其校正方法。这些内容不仅是深度估计算法的前提,也是标定、极线校正、三角测量等后续模块的基石。

相机成像链路:坐标系转换与畸变校正 世界坐标系 (Xw, Yw, Zw) 三维空间真实点 外参 R, t 相机坐标系 (Xc, Yc, Zc) 光心为原点 针孔投影 f, 透视除法 图像坐标系 (x, y) 物理单位(mm) 内参 fx, fy, cx, cy 像素坐标系 (u, v) 离散像素索引 畸变模型(真实镜头) 径向畸变:k1, k2, k3 | 切向畸变:p1, p2 校正后得到理想针孔投影坐标 核心公式: Zc · [u, v, 1]ᵀ = K · [R | t] · [Xw, Yw, Zw, 1]ᵀ K = [[fx, 0, cx], [0, fy, cy], [0, 0, 1]] — 内参矩阵 [R | t] — 外参矩阵(世界→相机)

2.1 针孔模型:理想投影的数学描述

针孔模型是相机成像的最简近似。它假设光线沿直线传播,穿过一个无限小的光心(投影中心),在成像平面上形成倒立的实像。实际工程中,我们常将成像平面虚拟到光心前方,使图像保持正立,便于数学处理。设空间点 P(Xc, Yc, Zc) 在相机坐标系下,其理想投影点 p(x, y) 满足:

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

其中 f 为焦距(物理单位,通常为毫米)。这一透视投影关系将三维点映射到二维平面,但丢失了深度信息——这正是双目视觉需要两个相机的原因:通过视差恢复 Zc。

针孔模型的本质是透视除法:将三维坐标除以 Zc 分量,实现从三维到二维的降维。该模型在 Zc 较大时近似准确,但在近距或广角场景下,必须考虑畸变修正。

2.2 四个坐标系与转换链路

相机成像涉及四个坐标系,理解它们之间的转换关系是标定与深度估计的基础。下表总结了各坐标系的定义与转换关系:

坐标系符号原点/单位转换到下一坐标系
世界坐标系(Xw, Yw, Zw)任意定义,米外参 R, t → 相机坐标系
相机坐标系(Xc, Yc, Zc)光心,米针孔投影 → 图像坐标系
图像坐标系(x, y)光轴与像面交点,毫米内参缩放平移 → 像素坐标系
像素坐标系(u, v)图像左上角,像素—(最终输出)

外参(Extrinsic)描述世界坐标系到相机坐标系的刚体变换,包含旋转矩阵 R(3×3)和平移向量 t(3×1)。R 由三个欧拉角(roll, pitch, yaw)或四元数表示,t 表示相机在世界坐标系中的位置。外参是每个相机独立的,双目系统中两个相机的外参差异即为其相对位姿。

内参(Intrinsic)描述相机坐标系到像素坐标系的映射,核心是内参矩阵 K:

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

其中 fx = f/dx,fy = f/dy(dx, dy 为单个像素的物理尺寸),(cx, cy) 为主点坐标(光轴与像面的交点,通常接近图像中心)。内参是相机的固有属性,不随相机移动而改变。

完整的像素坐标转换公式为:

Zc · [u, v, 1]ᵀ = K · [R | t] · [Xw, Yw, Zw, 1]ᵀ

这一公式将世界点直接映射到像素,是标定、重投影、三角测量的核心方程。

2.3 畸变模型:真实镜头的修正

实际镜头并非理想针孔,光线通过透镜时会发生折射偏差,导致投影点偏离理想位置。畸变主要分为两类:

  • 径向畸变:由透镜形状引起,光线在边缘弯曲更严重。表现为图像边缘的直线变弯,分为桶形畸变(负向)和枕形畸变(正向)。用多项式参数 k1, k2, k3 描述:
x_dist = x · (1 + k1·r² + k2·r⁴ + k3·r⁶)
y_dist = y · (1 + k1·r² + k2·r⁴ + k3·r⁶)

其中 r² = x² + y² 为点到主点的距离平方。通常 k1, k2 足够,鱼眼镜头才需要 k3。

  • 切向畸变:由透镜与成像平面不平行引起,表现为图像在某个方向被拉伸。用参数 p1, p2 描述:
x_dist = x + [2·p1·x·y + p2·(r² + 2·x²)]
y_dist = y + [p1·(r² + 2·y²) + 2·p2·x·y]

畸变校正的目标是:给定畸变坐标 (x_dist, y_dist),反求理想坐标 (x, y)。实际工程中通常采用迭代法或查表法实现实时校正。

工程要点:畸变参数与内参一起通过标定获得。OpenCV 的 calibrateCamera() 可同时估计内参、外参和畸变系数。标定板通常使用棋盘格或圆点阵,采集 15~20 张不同位姿的图像,重投影误差控制在 0.1 像素以内为佳。

2.4 实战案例:双目相机标定与畸变校正

假设我们搭建了一套双目视觉系统,用于机器人抓取任务。系统包含两个工业相机(分辨率 1280×1024,像元尺寸 4.8μm),基线距离 120mm。初始现象:拍摄棋盘格时,图像边缘直线明显弯曲,且左右目图像对应点垂直方向存在偏差。

分析过程:

  1. 使用 OpenCV 采集 20 组左右目同步棋盘格图像(不同角度、距离 0.5~1.5m)。
  2. 对每个相机单独标定,得到内参和畸变系数。左目结果:fx=1263.2, fy=1262.8, cx=642.1, cy=511.7, k1=-0.284, k2=0.087, p1=0.0012, p2=-0.0008。
  3. 重投影误差:左目 0.08px,右目 0.09px,满足精度要求。
  4. 使用 stereoCalibrate() 计算双目外参:旋转矩阵 R 接近单位阵(约 0.3° 偏差),平移向量 t = [119.8, -0.4, 2.1]mm,与设计基线 120mm 吻合。
  5. 应用 initUndistortRectifyMap() 生成校正映射表,对实时图像进行去畸变和极线校正。

结果对比:校正后棋盘格直线度误差从 3.2px 降至 0.3px;左右目对应点垂直视差从 1.8px 降至 0.1px,满足立体匹配的极线约束要求。

风险与代价:标定板不平整会导致畸变参数偏差;温度变化可能引起镜头焦距漂移,建议每季度重新标定。校正映射表占用内存约 10MB(双目),嵌入式平台需考虑存储与查表延迟。

经验提醒:标定时务必固定镜头光圈和焦距,变焦镜头需在每次变焦后重新标定。采集图像时,棋盘格应覆盖视场各个区域,尤其是边缘和角落,否则畸变参数外推不可靠。

2.5 常见误区与总结复盘

初学者在相机建模中常犯以下错误:

  • 混淆图像坐标系与像素坐标系:图像坐标以毫米为单位,原点在光轴与像面交点;像素坐标以像素为单位,原点在左上角。两者通过内参矩阵的缩放和平移关联。
  • 忽略 Zc 的作用:公式中 Zc 是乘在像素坐标左侧的尺度因子,不能随意丢弃。三角测量中正是利用 Zc 的不同来恢复深度。
  • 将畸变校正放在立体匹配之后:必须先对左右目图像分别去畸变,再进行极线校正和匹配,否则匹配精度严重下降。
  • 认为内参是固定不变的:温度、振动、镜头松动都会改变内参,高精度应用需定期校验。

本章建立的坐标系转换框架是双目视觉的数学基石。下一阶段,我们将基于这些模型,推导双目极线几何与视差计算原理。建议读者动手完成一次完整的单目标定,用代码验证每个参数的实际影响,这将极大加深对成像模型的理解。