3. 相机模型与标定

在 Camera-LiDAR-Radar 融合感知系统中,相机负责提供高分辨率的纹理与语义信息,是目标分类、车道线识别和交通标志理解的主力传感器。但相机输出的原始像素坐标本身没有物理尺度,必须通过相机模型建立“三维世界点 ↔ 二维像素点”的映射关系,才能与 LiDAR 点云、Radar 目标进行空间对齐。本节围绕针孔模型、畸变模型、内外参标定、张正友标定法以及标定实战与误差评估展开,帮助你把“像素”真正变成“可测量的几何量”。

一、针孔模型:从三维点到像素的投影链

针孔模型是最基础也最常用的相机成像模型。它假设光线通过一个理想小孔,在像平面上形成倒立实像。工程上通常把像平面翻转到光心前方,得到更直观的“正立”投影关系。一个世界点 P_w = (X_w, Y_w, Z_w) 要变成像素 (u, v),需要经过四步变换:

  1. 刚体变换:用外参 [R | t] 把世界坐标转到相机坐标系 P_c = R·P_w + t。
  2. 透视投影:按焦距 f 把相机坐标投影到归一化平面,得到 x = X_c/Z_c、y = Y_c/Z_c。
  3. 像素缩放:用 f_x = f/dx、f_y = f/dy 把物理尺寸换算为像素单位。
  4. 主点平移:加上主点 (c_x, c_y),得到最终像素坐标。

把上述过程写成矩阵形式,就是经典的内参矩阵 K:

K = [ f_x   0   c_x
       0   f_y  c_y
       0    0    1  ]

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

其中 f_x、f_y、c_x、c_y 称为内参,描述相机自身的光学与传感器特性;R、t 称为外参,描述相机在世界坐标系中的位姿。融合感知中,外参决定了相机与 LiDAR/Radar 的空间对齐精度,是标定的核心输出之一。

二、畸变模型:真实镜头的“不完美”

针孔模型是理想模型,真实镜头由于制造工艺和装配误差,会引入畸变。工程上主要建模两类:

  • 径向畸变:由镜头曲率引起,表现为图像边缘向外鼓(桶形)或向内缩(枕形),用 k1、k2、k3 描述。
  • 切向畸变:由镜头与成像平面不平行引起,用 p1、p2 描述。

去畸变时,先对归一化坐标 (x, y) 计算畸变增量,再映射回像素:

r² = x² + y²
x_dist = x(1 + k1r² + k2r⁴ + k3r⁶) + 2p1xy + p2(r² + 2x²)
y_dist = y(1 + k1r² + k2r⁴ + k3r⁶) + p1(r² + 2y²) + 2p2xy

在融合系统中,畸变未校正会直接导致 LiDAR 点投影到图像时出现边缘偏移,尤其在视场角较大的广角相机上,误差可达数十像素。因此,标定必须同时估计内参和畸变系数。

三、张正友标定法:从棋盘格到参数解算

张正友标定法(Zhang's Method)是工业界最常用的相机标定方法。它使用一块已知尺寸的棋盘格标定板,在相机前变换多个姿态拍摄若干张图像,通过棋盘格角点的对应关系求解内参和外参。其核心流程如下:

  1. 打印棋盘格,固定于刚性平面,确保平整。
  2. 从不同角度、距离、姿态拍摄 15~30 张图像,覆盖画面中心和边缘。
  3. 提取每张图像的棋盘格角点亚像素坐标。
  4. 利用单应矩阵 H 建立世界平面到图像平面的映射,构造约束方程。
  5. 通过最小二乘或极大似然估计求解内参 K 和畸变系数。
  6. 用重投影误差评估标定质量,必要时剔除异常图像重新标定。
张正友标定法的优势在于:不需要高精度三维标定物,只需一块平面棋盘格;同时能同时求解内参和畸变,适合量产相机快速标定。

四、标定实战:从采集到验证

下面以 OpenCV 为例,给出一个典型的标定流程。实际工程中,标定板规格、图像数量、角点提取精度都会影响最终结果。

# 1. 定义棋盘格内角点数量与物理尺寸
pattern_size = (9, 6)      # 内角点数
square_size = 0.025        # 每格 25 mm

# 2. 生成世界坐标
objp = np.zeros((9*6, 3), np.float32)
objp[:, :2] = np.mgrid[0:9, 0:6].T.reshape(-1, 2) * square_size

# 3. 对每张图像提取角点
ret, corners = cv2.findChessboardCorners(gray, pattern_size, None)
if ret:
    corners = cv2.cornerSubPix(gray, corners, (11,11), (-1,-1), criteria)

# 4. 标定
ret, K, dist, rvecs, tvecs = cv2.calibrateCamera(
    objpoints, imgpoints, gray.shape[::-1], None, None)

# 5. 重投影误差
mean_error = 0
for i in range(len(objpoints)):
    imgpoints2, _ = cv2.projectPoints(
        objpoints[i], rvecs[i], tvecs[i], K, dist)
    error = cv2.norm(imgpoints[i], imgpoints2, cv2.NORM_L2) / len(imgpoints2)
    mean_error += error
print("平均重投影误差: {:.4f} 像素".format(mean_error / len(objpoints)))

在 Camera-LiDAR 融合标定中,相机内参标定完成后,还需要标定相机与 LiDAR 的外参。常见做法是:在棋盘格上同时采集图像和点云,利用棋盘格平面在 LiDAR 中的点云拟合平面,再通过平面约束求解 R、t。最终用点云投影到图像的重合度来验证外参精度。

五、误差评估与常见误区

标定不是“跑一次就完事”,误差评估决定了融合系统的可信度。常用指标包括:

指标 含义 典型阈值
重投影误差 角点检测值与投影值之间的平均像素距离 < 0.5 像素
外参重投影误差 LiDAR 点投影到图像后与目标边缘的偏差 < 2 像素
去畸变残差 校正后直线在图像中的弯曲程度 目视无明显弯曲
多视角一致性 不同距离、角度下投影误差的稳定性 边缘与中心差异 < 1 像素
常见误区:① 标定板不平整或打印尺寸不准,导致世界坐标错误;② 图像数量太少或姿态单一,内参解算不稳定;③ 只关注平均误差,忽略边缘区域的大误差;④ 外参标定后未做温度、振动等工况验证,装车后精度下降。

复盘时建议建立标定档案:记录相机型号、镜头焦距、标定板规格、图像数量、内参矩阵、畸变系数、重投影误差、外参矩阵以及标定日期。每次更换镜头、调整相机安装位置或发生碰撞后,都应重新标定并对比历史数据,确保融合感知系统的空间基准始终可靠。

相机成像链路与标定参数关系 世界坐标系 P_w = (X_w, Y_w, Z_w) 外参 [R | t] 相机位姿 相机坐标系 P_c = R·P_w + t 归一化平面 x = X_c/Z_c, y = Y_c/Z_c 畸变模型 径向 k1, k2, k3 | 切向 p1, p2 x_dist = x(1+k1r²+k2r⁴+k3r⁶) + 2p1xy + p2(r²+2x²) 内参矩阵 K f_x, f_y, c_x, c_y [u, v, 1]^T = K · [x_dist, y_dist, 1]^T 像素坐标 (u, v) 图像平面 张正友标定法 棋盘格多姿态拍摄 角点亚像素提取 单应矩阵求解 最小二乘优化 重投影误差评估 输出:K, dist, R, t 误差评估:重投影误差 < 0.5 px | 外参投影误差 < 2 px | 多视角一致性 < 1 px 标定档案:相机型号 · 镜头焦距 · 标定板规格 · 图像数量 · 内参 · 畸变 · 外参 · 日期