共计 2092 个字符,预计需要花费 6 分钟才能阅读完成。
背景痛点
自动驾驶系统的训练依赖高质量的多模态标注数据,但 Camera 与 LiDAR 融合标注存在三大核心挑战:

- 传感器标定误差 :相机镜头畸变、LiDAR 与相机安装位置偏差导致的空间对齐误差
- 时间不同步 :传感器采样频率差异(如相机 30Hz vs LiDAR10Hz)造成的时序错位
- 数据规模压力 :单辆测试车每日产生约 4TB 原始数据,人工标注成本极高
技术选型
主流标注工具对比:
| 工具类型 | 代表产品 | 优点 | 缺点 |
|---|---|---|---|
| 云端 SaaS | LabelBox | 支持团队协作,版本管理完善 | 网络依赖强,定制化能力有限 |
| 本地化工具 | CVAT | 开源免费,支持 3D 点云标注 | 多模态融合标注流程繁琐 |
| 自研方案 | 基于 Open3D 开发 | 可深度适配特定传感器组合 | 需要专业开发团队维护 |
核心实现
1. 传感器标定
内参标定(Camera Intrinsics)
使用棋盘格标定法获取:
– 焦距 (fx,fy)
– 主点坐标 (cx,cy)
– 径向畸变系数 (k1,k2,k3)
外参标定(LiDAR-to-Camera)
通过标定靶球计算变换矩阵:
T_{lidar}^{cam} = \begin{bmatrix}
R_{3×3} & t_{3×1}\\
0_{1×3} & 1
\end{bmatrix}
2. 时间同步方案
- 硬件同步 :采用 PTP 协议实现 μs 级同步(需支持 GPS 授时的传感器)
- 软件同步 :基于时间戳插值对齐(适合消费级设备)
3. 多模态数据对齐
点云到图像的投影公式:
def project_pointcloud(points, T, K):
"""
将 LiDAR 点云投影到相机图像平面
:param points: (N,3) LiDAR 坐标系下的点云
:param T: (4,4) 外参矩阵
:param K: (3,3) 相机内参
:return: (N,2) 图像坐标
"""
homo_points = np.hstack([points, np.ones((len(points),1))]) # 齐次坐标
cam_points = (T @ homo_points.T).T[:,:3] # 转到相机坐标系
uv = (K @ cam_points.T).T # 投影到图像平面
uv[:,:2] /= uv[:,2:] # 归一化
return uv[:,:2]
代码示例
标定验证脚本(检查投影准确性):
import numpy as np
import cv2
# 加载标定结果
K = np.load("camera_intrinsics.npy") # 相机内参
T = np.load("extrinsic_matrix.npy") # 外参
# 生成测试点云(标定板角点世界坐标)checker_points = np.array([[0,0,0], [0.2,0,0], [0,0.2,0], [0.2,0.2,0]
])
# 执行投影
uv = project_pointcloud(checker_points, T, K)
# 可视化验证
img = cv2.imread("calib_image.jpg")
for u,v in uv:
cv2.circle(img, (int(u),int(v)), 5, (0,255,0), -1)
cv2.imwrite("projection_check.jpg", img)
性能考量
提升标注效率的三种方法:
- 半自动标注 :
- 使用预训练模型生成初始标注(如 Mask R-CNN 检测 2D 框)
-
人工仅需修正错误标注
-
智能辅助工具 :
- 基于点云密度的自动筛选(过滤远处低密度区域)
-
跨模态标签传递(2D 检测框反投影到 3D 点云)
-
流程优化 :
- 建立标注 QA 检查表(包含常见错误类型)
- 采用分级标注策略(关键帧精细标注 + 普通帧自动插值)
避坑指南
| 常见错误 | 解决方案 |
|---|---|
| 点云在图像边缘畸变严重 | 重新检查镜头畸变校正参数 |
| 动态物体出现重影 | 检查时间同步精度,建议≤10ms |
| 标注工具卡顿 | 使用 E57 格式替代 PCD 减少点云数据量 |
| 雨天点云噪声干扰 | 添加基于反射强度的点云过滤 |
| 夜间图像特征不足 | 融合红外相机数据辅助标注 |
互动实践
任务 :使用 Open3D 实现点云 - 图像投影可视化
-
安装依赖:
pip install open3d numpy opencv-python -
下载示例数据包(包含点云 + 图像 + 标定文件)
-
参考代码框架:
import open3d as o3d import cv2 # 加载数据 pcd = o3d.io.read_point_cloud("sample.pcd") img = cv2.imread("sample.jpg") # 实现投影函数(参考前文 project_pointcloud)def visualize_projection(points, image, uv): """可视化投影结果""" for u,v in uv: cv2.circle(img, (int(u),int(v)), 2, (0,0,255), -1) cv2.imshow("Projection", img) cv2.waitKey(0) # 调用示例 points = np.asarray(pcd.points) uv = project_pointcloud(points, T, K) visualize_projection(points, img, uv)
完成效果应显示点云在图像上的正确投影位置(红色点)。建议尝试调整外参矩阵观察投影变化,直观理解标定参数的影响。
正文完
