2. 相机模型与坐标系:针孔相机模型、世界坐标系、相机坐标系、图像坐标系、像素坐标系及其转换关系

做鱼眼校正,绕不开坐标系。说白了,你得先搞清楚「世界上的一个点」是怎么一步步变成「照片上的一个像素」的。这个映射关系,就是相机模型的核心。

我刚开始接触这行时,总觉得坐标系转换很枯燥。直到有一次做车载环视拼接,发现左右视图怎么都对不齐……查了两天才发现,是像素坐标系的原点定义搞反了。嗯,从那以后我再也不敢小看这些基础概念了。

2.1 针孔相机模型——最朴素的成像原理

针孔相机模型,是所有相机模型的起点。它假设光线沿直线传播,穿过一个小孔,在成像平面上形成倒立的像。

核心思想:三维世界中的点 P(X, Y, Z),通过光心 O,投影到成像平面上的点 p(x, y)。这个投影是线性的,可以用相似三角形描述。

数学上,这个关系很简单:

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

其中 f 是焦距,也就是光心到成像平面的距离。你想想看,Z 越大,物体越远,成像越小——这就是透视效应。

我的经验:实际鱼眼镜头不是针孔模型,但针孔模型是所有校正算法的理论基础。你理解了它,才能理解鱼眼为什么「弯」。

2.2 四个坐标系——从世界到像素的完整链路

一个三维点要变成像素,需要经过四次坐标变换。我习惯把这四个坐标系串成一条流水线:

  1. 世界坐标系 (World Coordinate System)——你定义物体位置的参考系,单位是米或毫米。
  2. 相机坐标系 (Camera Coordinate System)——以相机光心为原点,Z 轴指向镜头前方。
  3. 图像坐标系 (Image Coordinate System)——在成像平面上,以光轴与平面的交点为原点,单位是毫米。
  4. 像素坐标系 (Pixel Coordinate System)——在图像上,以左上角为原点,单位是像素。

每一步转换都有对应的矩阵或参数。我整理了一张表,方便你对照:

转换步骤 从 → 到 所需参数 变换类型
1 世界 → 相机 旋转矩阵 R、平移向量 t 刚体变换(6 自由度)
2 相机 → 图像 焦距 f 透视投影(3D→2D)
3 图像 → 像素 主点 (cx, cy)、像素尺寸 (dx, dy) 仿射变换(缩放+平移)

避坑指南:我曾经在标定一个广角相机时,把图像坐标系和像素坐标系搞混了。图像坐标系的原点在光轴中心,而像素坐标系的原点在左上角。差一个偏移量,校正结果就全偏了。

2.3 转换关系——一步步拆解

我们一步步来。假设世界坐标系中有一个点 P_w = [X_w, Y_w, Z_w, 1]^T(齐次坐标)。

步骤一:世界 → 相机

这一步是刚体变换,只有旋转和平移,没有形变。

P_c = [R | t] * P_w

其中 R 是 3×3 旋转矩阵,t 是 3×1 平移向量。合起来是一个 3×4 的外参矩阵。

我建议:写代码时,把 R 和 t 分开存,别合在一起。标定过程中经常需要单独调整旋转或平移,合在一起反而不方便。

步骤二:相机 → 图像

这一步是透视投影,把三维点映射到二维成像平面。

x = f * (X_c / Z_c)
y = f * (Y_c / Z_c)

用齐次坐标写,就是:

[x, y, 1]^T = [f, 0, 0, 0; 0, f, 0, 0; 0, 0, 1, 0] * [X_c, Y_c, Z_c, 1]^T

步骤三:图像 → 像素

这一步把物理坐标(毫米)变成像素坐标(像素)。

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

其中 dx、dy 是每个像素的物理尺寸,cx、cy 是主点坐标。写成矩阵形式:

[u, v, 1]^T = [1/dx, 0, cx; 0, 1/dy, cy; 0, 0, 1] * [x, y, 1]^T

2.4 内参矩阵——把三步合为一步

把上面三步串起来,就得到了从世界坐标到像素坐标的完整映射:

s * [u, v, 1]^T = K * [R | t] * [X_w, Y_w, Z_w, 1]^T

其中 K 是内参矩阵:

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

fx = f / dx,fy = f / dy,是焦距在像素单位下的表示。

关键点:内参矩阵 K 只跟相机本身有关,跟场景无关。你标定一次,只要不换镜头、不调焦距,就可以一直用。

2.5 知识体系结构图

下面这张 SVG 图,把四个坐标系和转换关系串在了一起。我建议你多看几遍,把每个箭头对应的参数记牢。

相机坐标系与转换关系结构图 相机坐标系与转换关系结构图 世界坐标系 (Xw, Yw, Zw) 相机坐标系 (Xc, Yc, Zc) 图像坐标系 (x, y) 单位:mm 像素坐标系 (u, v) 单位:pixel 外参 [R | t] 刚体变换(6自由度) 透视投影 焦距 f 仿射变换 (dx, dy, cx, cy) 内参矩阵 K(相机固有参数) K = [fx, 0, cx; 0, fy, cy; 0, 0, 1] fx = f/dx, fy = f/dy —— 焦距的像素表示 (cx, cy) —— 主点坐标,即光轴与成像平面的交点

2.6 鱼眼相机的特殊性

针孔模型假设光线直线传播。但鱼眼镜头为了获得超大视场角(通常 >180°),故意引入了畸变。光线经过镜头后是弯曲的。

这就导致:

  • 针孔模型的透视投影不再成立
  • 需要用畸变模型(如等距投影、等立体角投影)来描述
  • 校正的本质,就是把鱼眼图像「拉直」回针孔模型

我曾经踩过的坑:用普通相机的标定板去标定鱼眼相机,结果边缘角点全被畸变「吃」掉了。后来换了更大的标定板,并且让标定板尽量靠近相机,才把边缘区域覆盖住。

2.7 小结

这一章的内容,说白了就是一条线:世界 → 相机 → 图像 → 像素。每个环节都有对应的参数和变换矩阵。你只要把这条线刻在脑子里,后面学鱼眼校正就会轻松很多。