相机成像基础:针孔模型、内参外参、畸变模型、图像坐标系与相机坐标系转换
双目立体视觉的核心任务是从两幅图像中恢复三维空间信息,而这一切的起点,是理解相机如何将三维世界投影为二维像素。本章将系统梳理相机成像的数学基础:从理想针孔模型出发,建立四个坐标系之间的转换链路,引入内参与外参的物理含义,再讨论真实镜头带来的畸变及其校正方法。这些内容不仅是深度估计算法的前提,也是标定、极线校正、三角测量等后续模块的基石。
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)。实际工程中通常采用迭代法或查表法实现实时校正。
calibrateCamera() 可同时估计内参、外参和畸变系数。标定板通常使用棋盘格或圆点阵,采集 15~20 张不同位姿的图像,重投影误差控制在 0.1 像素以内为佳。
2.4 实战案例:双目相机标定与畸变校正
假设我们搭建了一套双目视觉系统,用于机器人抓取任务。系统包含两个工业相机(分辨率 1280×1024,像元尺寸 4.8μm),基线距离 120mm。初始现象:拍摄棋盘格时,图像边缘直线明显弯曲,且左右目图像对应点垂直方向存在偏差。
分析过程:
- 使用 OpenCV 采集 20 组左右目同步棋盘格图像(不同角度、距离 0.5~1.5m)。
- 对每个相机单独标定,得到内参和畸变系数。左目结果:fx=1263.2, fy=1262.8, cx=642.1, cy=511.7, k1=-0.284, k2=0.087, p1=0.0012, p2=-0.0008。
- 重投影误差:左目 0.08px,右目 0.09px,满足精度要求。
- 使用
stereoCalibrate()计算双目外参:旋转矩阵 R 接近单位阵(约 0.3° 偏差),平移向量 t = [119.8, -0.4, 2.1]mm,与设计基线 120mm 吻合。 - 应用
initUndistortRectifyMap()生成校正映射表,对实时图像进行去畸变和极线校正。
结果对比:校正后棋盘格直线度误差从 3.2px 降至 0.3px;左右目对应点垂直视差从 1.8px 降至 0.1px,满足立体匹配的极线约束要求。
风险与代价:标定板不平整会导致畸变参数偏差;温度变化可能引起镜头焦距漂移,建议每季度重新标定。校正映射表占用内存约 10MB(双目),嵌入式平台需考虑存储与查表延迟。
2.5 常见误区与总结复盘
初学者在相机建模中常犯以下错误:
- 混淆图像坐标系与像素坐标系:图像坐标以毫米为单位,原点在光轴与像面交点;像素坐标以像素为单位,原点在左上角。两者通过内参矩阵的缩放和平移关联。
- 忽略 Zc 的作用:公式中 Zc 是乘在像素坐标左侧的尺度因子,不能随意丢弃。三角测量中正是利用 Zc 的不同来恢复深度。
- 将畸变校正放在立体匹配之后:必须先对左右目图像分别去畸变,再进行极线校正和匹配,否则匹配精度严重下降。
- 认为内参是固定不变的:温度、振动、镜头松动都会改变内参,高精度应用需定期校验。
本章建立的坐标系转换框架是双目视觉的数学基石。下一阶段,我们将基于这些模型,推导双目极线几何与视差计算原理。建议读者动手完成一次完整的单目标定,用代码验证每个参数的实际影响,这将极大加深对成像模型的理解。