3. 相机成像模型

相机成像模型是3D视觉定位的数学基础。它将三维世界中的点映射到二维图像平面,同时描述了镜头畸变带来的非线性偏移。理解针孔模型、畸变模型以及内参/外参矩阵,是后续进行手眼标定与空间定位的前提。

3.1 针孔相机模型

针孔相机模型是理想化的线性成像模型。它假设光线通过一个无限小的孔(光心)在成像平面上形成倒立的实像。为简化计算,通常将成像平面对称到光心前方,形成虚拟成像平面,使图像保持正立。

核心几何关系基于相似三角形:

  • 世界点 \( P(X, Y, Z) \) 通过光心投影到像点 \( p(x, y) \)。
  • 焦距 \( f \) 是光心到成像平面的距离。
  • 投影关系:\( x = f \frac{X}{Z} \),\( y = f \frac{Y}{Z} \)。
关键理解:针孔模型是线性模型,不包含镜头畸变。实际相机因镜头制造与装配误差,必须引入畸变模型进行校正。
针孔相机成像几何(虚拟成像平面) 光心 O 成像平面 光轴 P(X,Y,Z) p(x,y) f Z 相似三角形关系:x / f = X / Z,y / f = Y / Z

3.2 畸变模型

实际镜头因制造工艺限制,会引入径向畸变和切向畸变。畸变使实际像点偏离针孔模型预测的位置,必须通过标定获得畸变系数并进行校正。

3.2.1 径向畸变

径向畸变由镜头形状引起,光线在镜头边缘弯曲程度更大。分为两种:

  • 桶形畸变:图像边缘向外膨胀,常见于广角镜头。
  • 枕形畸变:图像边缘向内收缩,常见于长焦镜头。

数学模型(使用泰勒级数展开):

x_corrected = x * (1 + k1*r² + k2*r⁴ + k3*r⁶)
y_corrected = y * (1 + k1*r² + k2*r⁴ + k3*r⁶)
其中 r² = x² + y²,k1, k2, k3 为径向畸变系数

3.2.2 切向畸变

切向畸变由镜头与成像平面不平行(装配误差)引起。数学模型:

x_corrected = x + [2*p1*x*y + p2*(r² + 2*x²)]
y_corrected = y + [p1*(r² + 2*y²) + 2*p2*x*y]
其中 p1, p2 为切向畸变系数
标定注意事项:径向畸变系数通常取 k1, k2, k3 三项,但 k3 仅在鱼眼或大畸变镜头中使用。切向畸变系数 p1, p2 一般较小,但不能忽略。
镜头畸变类型对比 理想(无畸变) 桶形畸变 枕形畸变 切向畸变 径向畸变(桶形/枕形)由镜头形状引起;切向畸变由镜头与传感器不平行引起 标定后使用畸变系数对图像进行重映射校正

3.3 内参矩阵

内参矩阵描述了相机坐标系到像素坐标系的转换关系,包含焦距、主点坐标和像素尺寸等参数。矩阵形式为:

     [ fx   0   cx ]
K =  [ 0    fy  cy ]
     [ 0    0    1 ]
参数 含义 单位
fx, fy 焦距在x、y方向上的像素度量(fx = f / dx,fy = f / dy) 像素
cx, cy 主点(光轴与成像平面交点)的像素坐标 像素
dx, dy 单个像素在x、y方向的物理尺寸 mm/像素

内参矩阵将相机坐标系下的点 \( P_c(X_c, Y_c, Z_c) \) 投影到像素坐标 \( (u, v) \):

u = fx * (X_c / Z_c) + cx
v = fy * (Y_c / Z_c) + cy
核心作用:内参矩阵是相机自身的固有属性,一旦标定完成,在相机焦距和分辨率不变的情况下保持不变。它是3D-2D映射的关键桥梁。

3.4 外参矩阵

外参矩阵描述了世界坐标系到相机坐标系的刚体变换关系,由旋转矩阵 \( R \) 和平移向量 \( t \) 组成:

     [ R   t ]
M =  [ 0   1 ]    (4×4 齐次矩阵)

其中:

  • R:3×3 旋转矩阵,表示世界坐标系相对于相机坐标系的旋转。
  • t:3×1 平移向量,表示世界坐标系原点在相机坐标系中的位置。

世界点 \( P_w \) 到相机坐标系 \( P_c \) 的转换:

P_c = R * P_w + t

3.5 完整成像流程

从世界点到像素坐标的完整映射分为三步:

  1. 世界 → 相机:使用外参矩阵 \( [R|t] \) 将世界点变换到相机坐标系。
  2. 相机 → 归一化平面:除以Z坐标,得到归一化坐标 \( (X_c/Z_c, Y_c/Z_c, 1) \)。
  3. 归一化 → 像素:使用内参矩阵 \( K \) 投影到像素坐标,并应用畸变校正。
步骤 变换 矩阵/公式 说明
1 世界→相机 \( P_c = R \cdot P_w + t \) 外参矩阵,刚体变换(6自由度)
2 相机→归一化 \( (x_n, y_n) = (X_c/Z_c, Y_c/Z_c) \) 透视投影,去尺度
3 畸变校正 \( (x_c, y_c) = f_{dist}(x_n, y_n) \) 径向+切向畸变模型
4 归一化→像素 \( (u, v) = (fx \cdot x_c + cx, fy \cdot y_c + cy) \) 内参矩阵,离散化
工程实践:在OpenCV中,使用 cv::calibrateCamera() 可同时标定内参、畸变系数和外参。标定板通常使用棋盘格或圆点阵列,采集10-20张不同位姿的图像即可获得稳定结果。