第三章:数据预处理与标定

各位同学,今天我们来聊聊感知融合里最基础、也最容易被忽视的一环——数据预处理与标定。

说实话,我见过太多团队,算法模型调得飞起,结果一上路就崩。为什么?因为传感器数据根本没对齐。你想想看,摄像头看到的是像素,激光雷达看到的是点云,这两者如果不在同一个坐标系里说话,那融合出来的结果就是「鸡同鸭讲」。

所以这一章,我们就把标定这件事彻底讲透。

3.1 相机内参标定

相机内参标定,说白了就是搞清楚「镜头是怎么把三维世界映射到二维图像上的」。这个映射关系由内参矩阵 K 和畸变系数 D 决定。

我个人习惯用棋盘格标定板,配合 OpenCV 的 calibrateCamera() 函数。流程很简单:拍个十几张不同角度的棋盘格照片,然后让算法自动提取角点,解算出内参。

这里有个坑,我踩过好几次——棋盘格一定要贴平。你想想看,如果板子本身是弯的,或者打印出来有褶皱,那提取的角点坐标就是错的,标定结果自然不准。

核心公式:
s * [u, v, 1]^T = K * [R|t] * [X, Y, Z, 1]^T
其中 K 是内参矩阵,包含 fx, fy, cx, cy。
我的经验: 标定照片最好覆盖整个视野,尤其是四个角落。我曾经只拍了中间区域,结果边缘畸变校正后图像变形严重,后来补拍了角落照片才解决。

3.2 Lidar-Camera 联合标定

联合标定要解决的核心问题只有一个:激光雷达坐标系下的点 (x, y, z),对应到图像上的哪个像素 (u, v)?

这需要求解一个外参矩阵 [R|t],把 Lidar 坐标系变换到 Camera 坐标系。常用的方法有两种:

  • 目标物法: 在场景中放置已知尺寸的标定物(比如棋盘格或立方体),同时采集 Lidar 点云和 Camera 图像,手动或自动提取对应点,然后求解 PnP 问题。
  • 互信息法: 利用 Lidar 反射强度与图像灰度之间的统计相关性,自动优化外参。这个方法不需要人工标定物,但计算量大,且对场景纹理有要求。

我在项目中更常用目标物法,因为稳定可靠。不过要注意,Lidar 点云是稀疏的,你很难精确找到棋盘格的角点。我的做法是:在棋盘格上贴一块高反射材料,这样 Lidar 打上去会返回强信号,方便在点云中定位。

注意: 联合标定对初始值非常敏感。如果外参初始值偏差太大,优化算法很容易陷入局部最优。我建议先用粗略的手动对齐给一个初值,再跑自动优化。

3.3 去畸变

相机镜头,尤其是广角镜头,会产生明显的径向畸变和切向畸变。去畸变就是把变形的图像「拉直」。

OpenCV 提供了 undistort() 和 initUndistortRectifyMap() 两个函数。前者直接处理单张图像,后者先生成映射表,然后对视频流逐帧处理,效率更高。

嗯,这里要注意:去畸变会损失一部分边缘像素,因为校正后的图像需要裁剪。如果你需要保留完整的视场角,可以考虑用 getOptimalNewCameraMatrix() 来调整内参,让裁剪量最小化。

# 去畸变示例代码
import cv2
import numpy as np

# 假设已经标定得到内参 K 和畸变系数 D
K = np.array([[fx, 0, cx],
              [0, fy, cy],
              [0,  0,  1]])
D = np.array([k1, k2, p1, p2, k3])

# 生成映射表
map1, map2 = cv2.initUndistortRectifyMap(K, D, None, K, (w, h), cv2.CV_32FC1)

# 逐帧去畸变
undistorted_img = cv2.remap(img, map1, map2, cv2.INTER_LINEAR)
避坑指南: 我曾经在去畸变后直接做特征匹配,结果发现匹配点对总是偏的。后来排查发现,是因为去畸变后的图像尺寸变了,但特征点的坐标没有重新映射。记住:去畸变后,所有像素坐标都要用映射表重新计算。

3.4 时间戳对齐

这是整个预处理环节里最「隐形」但最致命的问题。Camera 和 Lidar 的采样频率不同,触发时刻也不同。如果不做时间戳对齐,融合出来的结果就是「时空错乱」的。

常见的做法有两种:

  1. 硬件同步: 通过 PTP(精确时间协议)或 GPS 的 PPS 信号,让所有传感器共用同一个时钟。这是最理想的方式,延迟可以控制在微秒级。
  2. 软件插值: 如果硬件不支持同步,那就用软件方法。比如,Lidar 是 10Hz,Camera 是 30Hz,那就找离 Camera 帧时间最近的 Lidar 帧,或者对 Lidar 点云做线性插值。

我个人更推荐硬件同步,因为软件插值会引入额外的误差。但如果你用的是消费级传感器,没有硬件同步接口,那软件插值就是唯一的选择。

关键指标: 时间戳对齐的误差应小于传感器采样间隔的 1/10。对于 10Hz 的 Lidar,误差应小于 10ms;对于 30Hz 的 Camera,误差应小于 3.3ms。

知识体系总览

下面这张图,是我自己总结的本章知识结构。你可以把它当作一张「地图」,随时回来对照。

数据预处理与标定知识体系 相机内参标定 • 内参矩阵 K (fx, fy, cx, cy) • 畸变系数 D (k1, k2, p1, p2, k3) • 标定方法:棋盘格 + OpenCV • 输出:K, D, 重投影误差 → 用于去畸变和3D-2D映射 Lidar-Camera联合标定 • 外参矩阵 [R|t] • 方法:目标物法 / 互信息法 • 关键:点云与图像特征对应 • 输出:旋转矩阵R,平移向量t → 用于点云投影到图像 去畸变 • 径向畸变:桶形/枕形 • 切向畸变:镜头倾斜 • 工具:undistort / remap • 注意:边缘裁剪与重映射 → 校正后的图像用于特征提取 时间戳对齐 • 硬件同步:PTP / PPS • 软件插值:最近邻 / 线性 • 误差要求:< 采样间隔的1/10 • 输出:时间同步后的数据对 → 保证融合的时空一致性 标定是感知融合的基石,精度决定上限

好了,以上就是数据预处理与标定的全部核心内容。从相机内参到联合标定,从去畸变到时间戳对齐,每一步都直接影响后续融合的精度。我在实际项目中,光是标定这一步就反复迭代了不下十次,才把重投影误差压到 0.5 像素以内。

记住一句话:标定做得越细,后面调参越省心。别嫌麻烦,这是值得的。

本章核心要点:
  • 相机内参标定是基础,棋盘格要贴平,照片要覆盖全视野
  • 联合标定需要好的初始值,建议手动粗对齐后再自动优化
  • 去畸变后要重新映射坐标,否则特征点会偏移
  • 时间戳对齐优先用硬件同步,软件插值是备选方案

可可精品资料库