2. 相机模型与坐标系:针孔相机模型、世界坐标系、相机坐标系、图像坐标系、像素坐标系及其转换关系
做鱼眼校正,绕不开坐标系。说白了,你得先搞清楚「世界上的一个点」是怎么一步步变成「照片上的一个像素」的。这个映射关系,就是相机模型的核心。
我刚开始接触这行时,总觉得坐标系转换很枯燥。直到有一次做车载环视拼接,发现左右视图怎么都对不齐……查了两天才发现,是像素坐标系的原点定义搞反了。嗯,从那以后我再也不敢小看这些基础概念了。
2.1 针孔相机模型——最朴素的成像原理
针孔相机模型,是所有相机模型的起点。它假设光线沿直线传播,穿过一个小孔,在成像平面上形成倒立的像。
核心思想:三维世界中的点 P(X, Y, Z),通过光心 O,投影到成像平面上的点 p(x, y)。这个投影是线性的,可以用相似三角形描述。
数学上,这个关系很简单:
x = f * (X / Z)
y = f * (Y / Z)
其中 f 是焦距,也就是光心到成像平面的距离。你想想看,Z 越大,物体越远,成像越小——这就是透视效应。
我的经验:实际鱼眼镜头不是针孔模型,但针孔模型是所有校正算法的理论基础。你理解了它,才能理解鱼眼为什么「弯」。
2.2 四个坐标系——从世界到像素的完整链路
一个三维点要变成像素,需要经过四次坐标变换。我习惯把这四个坐标系串成一条流水线:
- 世界坐标系 (World Coordinate System)——你定义物体位置的参考系,单位是米或毫米。
- 相机坐标系 (Camera Coordinate System)——以相机光心为原点,Z 轴指向镜头前方。
- 图像坐标系 (Image Coordinate System)——在成像平面上,以光轴与平面的交点为原点,单位是毫米。
- 像素坐标系 (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 图,把四个坐标系和转换关系串在了一起。我建议你多看几遍,把每个箭头对应的参数记牢。
2.6 鱼眼相机的特殊性
针孔模型假设光线直线传播。但鱼眼镜头为了获得超大视场角(通常 >180°),故意引入了畸变。光线经过镜头后是弯曲的。
这就导致:
- 针孔模型的透视投影不再成立
- 需要用畸变模型(如等距投影、等立体角投影)来描述
- 校正的本质,就是把鱼眼图像「拉直」回针孔模型
我曾经踩过的坑:用普通相机的标定板去标定鱼眼相机,结果边缘角点全被畸变「吃」掉了。后来换了更大的标定板,并且让标定板尽量靠近相机,才把边缘区域覆盖住。
2.7 小结
这一章的内容,说白了就是一条线:世界 → 相机 → 图像 → 像素。每个环节都有对应的参数和变换矩阵。你只要把这条线刻在脑子里,后面学鱼眼校正就会轻松很多。