2. 基础知识

做环视标定,第一件事就是搞懂摄像头怎么「看」世界的。说白了,就是把三维空间里的一个点,映射到二维图像上。这个过程,核心就是针孔相机模型。

2.1 针孔相机模型——最朴素的成像解释

你想想看,一个暗箱,前面戳个小孔,光线穿过小孔,在后面的感光面上形成倒像。这就是针孔模型。虽然真实摄像头有透镜、有复杂结构,但数学上,我们都拿针孔模型做基础。

我个人习惯,把这个模型拆成三步:

  1. 世界坐标系:真实世界里,一个点的位置 (X, Y, Z)。
  2. 相机坐标系:以摄像头光心为原点,光轴为Z轴。
  3. 图像坐标系:光线投影到成像平面,形成物理坐标 (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 完整成像流程——从世界到像素

把上面所有步骤串起来,就是完整的成像过程:

  1. 世界坐标 → 相机坐标:通过外参(旋转+平移)
  2. 相机坐标 → 归一化平面:除以 Z,得到 (x, y)
  3. 畸变校正:应用径向和切向畸变模型
  4. 投影到像素:通过内参矩阵,得到 (u, v)

下面这张图,把整个流程画清楚了:

摄像头成像完整流程 世界坐标系 (Xw, Yw, Zw) 相机坐标系 (Xc, Yc, Zc) 归一化平面 (x, y) 畸变校正 (x', y') 像素坐标系 (u, v) 关键说明: 1. 世界→相机:外参(R, t) 2. 相机→归一化:除以 Z 3. 畸变校正:径向(k1,k2,k3) + 切向(p1,p2) 4. 归一化→像素:内参矩阵 K

2.6 标定参数总览

做环视标定,最终要标定的参数就是这些:

参数类别 参数符号 数量 说明
内参 fx, fy, cx, cy 4 焦距和主点
径向畸变 k1, k2, k3 3 透镜形状导致的畸变
切向畸变 p1, p2 2 透镜安装倾斜导致的畸变
外参 R (3x3), t (3x1) 6 旋转和平移(下一章详讲)

我的建议:标定完成后,一定要做重投影误差验证。把标定板角点投影回图像,看和实际检测到的角点差多少像素。一般要求 < 0.5 像素才算合格。