第2章:摄像头成像原理——从光线到像素的旅程
做环视标定,第一件事就是搞懂摄像头怎么「看」世界的。说白了,就是把三维空间里的一个点,映射到二维图像上。这个过程,核心就是针孔相机模型。
2.1 针孔相机模型——最朴素的成像解释
你想想看,一个暗箱,前面戳个小孔,光线穿过小孔,在后面的感光面上形成倒像。这就是针孔模型。虽然真实摄像头有透镜、有复杂结构,但数学上,我们都拿针孔模型做基础。
我个人习惯,把这个模型拆成三步:
- 世界坐标系:真实世界里,一个点的位置 (X, Y, Z)。
- 相机坐标系:以摄像头光心为原点,光轴为Z轴。
- 图像坐标系:光线投影到成像平面,形成物理坐标 (x, y)。
这里有个关键参数——焦距 f。它决定了成像的大小和视野范围。焦距越长,视角越窄,看得越远;焦距越短,视角越宽,但畸变更明显。
核心公式(理想针孔模型):
x = f * (X / Z)
y = f * (Y / Z)
其中 (X, Y, Z) 是相机坐标系下的点,(x, y) 是图像物理坐标。
2.2 内参矩阵——把物理坐标变成像素坐标
物理坐标 (x, y) 是毫米单位的,但图像是像素的。怎么转换?靠内参矩阵。
内参矩阵 K 长这样:
K = [ fx 0 cx
0 fy cy
0 0 1 ]
这里面:
- fx, fy:分别是x和y方向的焦距(像素单位)。通常 fx ≈ fy,但制造误差会导致不一样。
- cx, cy:主点坐标。理论上在图像中心,但实际总有偏移。
我记得第一次做环视标定时,发现左右视图拼接总对不齐。查了半天,原来是主点标定偏了0.5个像素。嗯,这种误差在环视系统里会被放大,必须较真。
我的经验:内参矩阵是标定的第一步。如果内参不准,后面的外参、畸变校正全是白搭。我建议每次换摄像头模组,都重新标一次内参。
2.3 像素坐标系与图像坐标系——两个坐标系的关系
这两个坐标系容易搞混,我简单说一下:
| 坐标系 | 单位 | 原点 | 用途 |
|---|---|---|---|
| 图像坐标系 | 毫米 (mm) | 光轴与成像平面交点 | 物理尺寸描述 |
| 像素坐标系 | 像素 (pixel) | 图像左上角 | 数字图像存储 |
转换关系很简单:
u = x / dx + cx
v = y / dy + cy
其中 dx, dy 是每个像素的物理尺寸。说白了,就是把毫米除以每个像素的大小,再加上主点偏移。
你想想看,如果像素是方形的,dx = dy,那 fx = f / dx,fy = f / dy。但实际摄像头,像素不一定是正方形,所以 fx 和 fy 会有差异。
2.4 畸变模型——现实总是不完美的
针孔模型是理想情况。真实摄像头有透镜,透镜就会带来畸变。我做过这么多项目,畸变校正做不好,环视拼接就会出现「鬼影」和「错位」。
畸变主要分两种:
2.4.1 径向畸变——透镜形状导致的
光线经过透镜边缘时,弯曲程度和中心不一样。这就导致:
- 桶形畸变:图像向外凸出,像鱼眼镜头。环视摄像头常用广角,桶形畸变最明显。
- 枕形畸变:图像向内凹陷,长焦镜头容易出现。
数学上用泰勒级数描述:
x_corrected = x * (1 + k1*r^2 + k2*r^4 + k3*r^6)
y_corrected = y * (1 + k1*r^2 + k2*r^4 + k3*r^6)
其中 r 是像素到主点的距离,k1, k2, k3 是径向畸变系数。
避坑指南:我曾经在一个项目中,只标定了 k1 和 k2,忽略了 k3。结果在图像边缘区域,畸变校正后还有明显的残余误差。对于大广角镜头(比如鱼眼),k3 必须标定。
2.4.2 切向畸变——透镜和传感器不平行
这个好理解。透镜安装时,如果和成像平面不平行,就会产生切向畸变。表现为图像在某个方向上被拉伸或压缩。
数学模型:
x_corrected = x + [2*p1*x*y + p2*(r^2 + 2*x^2)]
y_corrected = y + [p1*(r^2 + 2*y^2) + 2*p2*x*y]
p1, p2 就是切向畸变系数。
我个人习惯,标定时把 5 个畸变系数(k1, k2, k3, p1, p2)全部标出来。虽然有些系数可能很小,但环视系统对精度要求高,不能省。
2.5 完整成像流程——从世界到像素
把上面所有步骤串起来,就是完整的成像过程:
- 世界坐标 → 相机坐标:通过外参(旋转+平移)
- 相机坐标 → 归一化平面:除以 Z,得到 (x, y)
- 畸变校正:应用径向和切向畸变模型
- 投影到像素:通过内参矩阵,得到 (u, v)
下面这张图,把整个流程画清楚了:
2.6 标定参数总览
做环视标定,最终要标定的参数就是这些:
| 参数类别 | 参数符号 | 数量 | 说明 |
|---|---|---|---|
| 内参 | fx, fy, cx, cy | 4 | 焦距和主点 |
| 径向畸变 | k1, k2, k3 | 3 | 透镜形状导致的畸变 |
| 切向畸变 | p1, p2 | 2 | 透镜安装倾斜导致的畸变 |
| 外参 | R (3x3), t (3x1) | 6 | 旋转和平移(下一章详讲) |
我的建议:标定完成后,一定要做重投影误差验证。把标定板角点投影回图像,看和实际检测到的角点差多少像素。一般要求 < 0.5 像素才算合格。