ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

Matplotlib 绘制3D检测框(输入8个角点XYZ坐标)

2026/8/10 9:11:46 拓冰建站 浏览量
Matplotlib 绘制3D检测框(输入8个角点XYZ坐标) Matplotlib 绘制3D检测框输入8个角点XYZ坐标Matplotlib 绘制3D检测框输入8个角点XYZ坐标原理说明3D包围盒8个顶点只需按固定连线顺序绘制12条棱即可完成框体绘制支持批量绘制多个检测框、自定义颜色/线宽/透明度。完整可运行代码import numpy as np import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D def draw_3d_bbox(ax, corners, colorred, linewidth1.5): 绘制单个3D检测框 :param ax: 3D绘图轴对象 :param corners: 8个角点坐标shape(8,3)每行[x,y,z] :param color: 边框颜色 :param linewidth: 线条宽度 # 3D框12条棱的顶点索引对 edges [ [0, 1], [1, 2], [2, 3], [3, 0], # 底面四条边 [4, 5], [5, 6], [6, 7], [7, 4], # 顶面四条边 [0, 4], [1, 5], [2, 6], [3, 7] # 竖直四条棱 ] # 逐条绘制棱 for (p1, p2) in edges: x [corners[p1, 0], corners[p2, 0]] y [corners[p1, 1], corners[p2, 1]] z [corners[p1, 2], corners[p2, 2]] ax.plot(x, y, z, ccolor, linewidthlinewidth) if __name__ __main__: # 1. 创建3D画布 fig plt.figure(figsize(10, 7)) ax fig.add_subplot(111, projection3d) # 2. 示例单个3D框8个角点 (8,3)替换成你自己的角点数据 bbox_corners np.array([ [2, 1, 0], [2, 3, 0], [5, 3, 0], [5, 1, 0], # 底部4点 [2, 1, 2], [2, 3, 2], [5, 3, 2], [5, 1, 2] # 顶部4点 ]) draw_3d_bbox(ax, bbox_corners, colorcrimson) # 3. 批量绘制多个检测框示例 bbox2 np.array([ [-3, -2, 0], [-3, 0, 0], [-1, 0, 0], [-1, -2, 0], [-3, -2, 1.8], [-3, 0, 1.8], [-1, 0, 1.8], [-1, -2, 1.8] ]) draw_3d_bbox(ax, bbox2, colordeepblue) # 4. 坐标轴设置 ax.set_xlabel(X) ax.set_ylabel(Y) ax.set_zlabel(Z) ax.set_title(3D Detection Bounding Box) # 等比例坐标轴防止框拉伸变形 ax.set_box_aspect([1, 1, 1]) plt.show()使用方法1. 输入数据格式要求你的角点数据必须是(8, 3)的numpy数组corners np.array([ [x0,y0,z0], [x1,y1,z1], ... [x7,y7,z7] ])顺序规范自动驾驶常用前4个底部点后4个顶部点同一边依次相连。如果你的8点顺序不一样只需修改代码里edges索引对应关系即可。2. 批量绘制多个框循环调用函数即可# boxes_corners: (N, 8, 3) N个框 for box in boxes_corners: draw_3d_bbox(ax, box, colorgreen)拓展功能1. 填充3D框半透明面增加绘制面的函数在绘制边框后调用def fill_3d_bbox(ax, corners, colororange, alpha0.2): from mpl_toolkits.mplot3d.art3d import Poly3DCollection # 六个面的顶点索引 faces [ [0,1,2,3], [4,5,6,7], [0,1,5,4], [1,2,6,5], [2,3,7,6], [3,0,4,7] ] face_verts [corners[face] for face in faces] poly Poly3DCollection(face_verts, colorcolor, alphaalpha) ax.add_collection3d(poly) # 使用先画填充再画边框 fill_3d_bbox(ax, bbox_corners, alpha0.15) draw_3d_bbox(ax, bbox_corners)2. 标注框中心点def plot_bbox_center(ax, corners, colorblack, size15): center np.mean(corners, axis0) ax.scatter(center[0], center[1], center[2], ccolor, ssize)自动驾驶小提示相机坐标系下X右、Y下、Z前若点云坐标系X前、Y左、Z上坐标轴标签和视角无需修改直接传入角点即可想要俯视视角ax.view_init(elev90, azim-90)侧面视角ax.view_init(elev30, azim-60)需要我给你适配点云BEV坐标系的专用绘图版本吗