📌 测试用例
PythonAPI/examples/bounding_boxes.py
这是一个 2D/3D 边界框(Bounding Box)生成与可视化系统,用于:
- 在仿真中生成大量 NPC 车辆
- 通过 RGB 摄像头 + 实例分割摄像头 获取场景数据
- 实时计算并绘制 2D/3D 边界框
- 将边界框、速度、灯光状态等结构化数据保存为 JSON
适用于 自动驾驶感知算法训练、数据集生成、传感器融合验证。
carla_bounding+boxes
3D box 有些异常,使用时请检查、增加后处理等;
🔑 主要模块解析
1. 数据结构定义
EDGES:定义 3D 边界框的 12 条边连接顺序(8 个顶点 → 12 条边)SEMANTIC_MAP:CARLA 语义标签 ID 到类别名和颜色的映射(如14: ('car', (0,0,142)))
✅ 支持 28 类语义标签,覆盖道路、车辆、行人、交通设施等。
2. 坐标变换与投影
build_projection_matrix():构建相机内参矩阵(K 矩阵)get_image_point():将 3D 世界坐标 → 相机坐标 → 2D 图像坐标- 处理 CARLA 特有的坐标系转换:
(x,y,z) → (y,-z,x)
- 处理 CARLA 特有的坐标系转换:
point_in_canvas():判断 2D 点是否在图像范围内
💡 这是 3D→2D 投影的核心数学工具。
3. 实例分割解码
python
def decode_instance_segmentation(img_rgba):
semantic_labels = img_rgba[..., 2] # R 通道存语义标签
actor_ids = ... # G+B 通道组合为 Actor ID
- 利用
sensor.camera.instance_segmentation输出的 RGBA 图像 - R 通道:语义类别 ID
- G+B 通道:Actor 唯一 ID(16 位)
✅ 实现 像素级实例识别,为每个物体生成独立掩码。
4. 2D 边界框生成
python
def bbox_2d_for_actor(actor, actor_ids, semantic_labels):
mask = (actor_ids == actor.id)
ys, xs = np.where(mask)
return (xmin, ymin, xmax, ymax)
- 基于实例分割掩码,计算 轴对齐 2D 边界框(AABB)
5. 3D 边界框生成
python
def bbox_3d_for_actor(actor, ego, camera_bp, camera):
# 1. 获取 8 个 3D 顶点的世界坐标
verts = actor.bounding_box.get_world_vertices(...)
# 2. 投影到 2D 图像(处理相机后方的点)
for edge in EDGES:
p1 = get_image_point(verts[edge[0]], K, world_2_camera)
...
projection.append((p1x, p1y, p2x, p2y))
# 3. 计算相对 ego 的 3D 信息
return {
'center': {x,y,z}, # 相对位置
'dimensions': {l,w,h}, # 尺寸
'rotation_yaw': ..., # 相对偏航角
'projection': [...] # 12 条边的 2D 投影
}
✅ 输出 完整的 3D 检测所需参数,支持后续 3D 目标检测训练。
6. 可视化系统
visualize_2d_bboxes():在 RGB 图像上绘制矩形框 + 类别标签visualize_3d_bboxes():绘制 3D 边界框的 12 条边 + 标签
🎮 通过
2/3键 实时切换 2D/3D 可视化模式。
7. 结构化数据导出
每帧保存 JSON 文件,包含:
json
{
"frame_id": 123,
"objects": [
{
"id": 456,
"class": "car",
"velocity": {"x": 2.1, "y": -0.3, ...},
"bbox_3d": { "center": {...}, "dimensions": {...}, "rotation_yaw": 1.2 },
"bbox_2d": { "xmin": 100, "ymin": 200, ... },
"light_state": { "brake": true, "left_blinker": false, ... }
}
]
}
💾 按
R键 启动录制,生成_out/目录下的 PNG + JSON 对。
8. 仿真环境配置
- 同步模式:确保传感器数据与时序严格对齐
- 双摄像头 :
sensor.camera.rgb:获取原始图像sensor.camera.instance_segmentation:获取实例 ID 图
- 100 辆 NPC:创建密集交通场景
- 距离过滤:仅处理 50 米内的车辆(可配置)
🎯 核心应用场景
| 应用 | 如何使用本脚本输出 |
|---|---|
| 2D 目标检测训练 | 使用 bbox_2d + RGB 图像 |
| 3D 目标检测训练 | 使用 bbox_3d 参数(中心、尺寸、朝向) |
| 多目标跟踪(MOT) | 利用 actor.id 实现跨帧关联 |
| 行为预测 | 结合 velocity 和 light_state(转向灯、刹车灯) |
| 合成数据集 | 生成带精确标注的 PNG+JSON 对 |
⚠️ 技术点
-
3D 边界框正确投影
- 处理 相机后方的顶点 (使用
is_behind_camera=True的投影矩阵) - 避免 3D 框在图像边缘出现断裂
- 处理 相机后方的顶点 (使用
-
相对坐标系
- 所有 3D 信息(位置、速度、朝向)均 相对于 ego 车辆
- 符合自动驾驶感知系统的输入要求
-
灯光状态编码
- 解析
VehicleLightState为结构化字典 - 提供 意图线索(如左转灯亮 → 可能左转)
- 解析
✅ 总结
该脚本是 CARLA 感知数据生成的工业级范例,展示了:
- 如何融合 RGB + 实例分割 获取像素级物体 ID
- 如何从仿真中提取 精确的 2D/3D 边界框
- 如何导出 结构化、可直接用于训练的标注数据
它是构建 自动驾驶感知 pipeline 的关键工具,特别适合生成 带 3D 标注的合成数据集。