3. 相机模型与标定
在 Camera-LiDAR-Radar 融合感知系统中,相机负责提供高分辨率的纹理与语义信息,是目标分类、车道线识别和交通标志理解的主力传感器。但相机输出的原始像素坐标本身没有物理尺度,必须通过相机模型建立“三维世界点 ↔ 二维像素点”的映射关系,才能与 LiDAR 点云、Radar 目标进行空间对齐。本节围绕针孔模型、畸变模型、内外参标定、张正友标定法以及标定实战与误差评估展开,帮助你把“像素”真正变成“可测量的几何量”。
一、针孔模型:从三维点到像素的投影链
针孔模型是最基础也最常用的相机成像模型。它假设光线通过一个理想小孔,在像平面上形成倒立实像。工程上通常把像平面翻转到光心前方,得到更直观的“正立”投影关系。一个世界点 P_w = (X_w, Y_w, Z_w) 要变成像素 (u, v),需要经过四步变换:
- 刚体变换:用外参
[R | t]把世界坐标转到相机坐标系P_c = R·P_w + t。 - 透视投影:按焦距
f把相机坐标投影到归一化平面,得到x = X_c/Z_c、y = Y_c/Z_c。 - 像素缩放:用
f_x = f/dx、f_y = f/dy把物理尺寸换算为像素单位。 - 主点平移:加上主点
(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)是工业界最常用的相机标定方法。它使用一块已知尺寸的棋盘格标定板,在相机前变换多个姿态拍摄若干张图像,通过棋盘格角点的对应关系求解内参和外参。其核心流程如下:
- 打印棋盘格,固定于刚性平面,确保平整。
- 从不同角度、距离、姿态拍摄 15~30 张图像,覆盖画面中心和边缘。
- 提取每张图像的棋盘格角点亚像素坐标。
- 利用单应矩阵
H建立世界平面到图像平面的映射,构造约束方程。 - 通过最小二乘或极大似然估计求解内参
K和畸变系数。 - 用重投影误差评估标定质量,必要时剔除异常图像重新标定。
四、标定实战:从采集到验证
下面以 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 像素 |
复盘时建议建立标定档案:记录相机型号、镜头焦距、标定板规格、图像数量、内参矩阵、畸变系数、重投影误差、外参矩阵以及标定日期。每次更换镜头、调整相机安装位置或发生碰撞后,都应重新标定并对比历史数据,确保融合感知系统的空间基准始终可靠。