连续帧点云目标检测结果展示,python实现
在用centerpoint目标检测模型对连续帧点云进行预测,将结果保存为同名txt文件
txt里每一行的内容是x y z l w h angle class conf;xyz是3Dbox的中心坐标,lwh对应长宽高,angle是航向角,class是目标类别,conf是目标检测置信度。
下面的代码是实现连续帧点云目标检测结果的可视化
import open3d
import os, time
import numpy as np
import glob text_labels = {'Car':0, 'Pedestrian':1, 'Cyclist':2}box_colormap = [(1, 1, 1),(0, 1, 0),(0, 1, 1),(1, 1, 0),
]def translate_boxes_to_open3d_instance(gt_boxes):"""4-------- 6/| /|5 -------- 3 .| | | |. 7 -------- 1|/ |/2 -------- 0"""center = gt_boxes[0:3]lwh = gt_boxes[3:6]axis_angles = np.array([0, 0, gt_boxes[6] + 1e-10])rot = open3d.geometry.get_rotation_matrix_from_axis_angle(axis_angles)box3d = open3d.geometry.OrientedBoundingBox(center, rot, lwh)line_set = open3d.geometry.LineSet.create_from_oriented_bounding_box(box3d)lines = np.asarray(line_set.lines)lines = np.concatenate([lines, np.array([[1, 4], [7, 6]])], axis=0)line_set.lines = open3d.utility.Vector2iVector(lines)return line_set, box3dvis = open3d.visualization.Visualizer()
vis.create_window()
pointcloud = open3d.geometry.PointCloud()
to_reset = True
vis.add_geometry(pointcloud)#将点云先添加到窗口pcd_fifles = glob.glob('pcd/*.pcd')
bin_files = glob.glob('velodyne/*.bin')
res_txt_files = glob.glob('result_txt/*.txt') # 预测结果while True:for i in range(len(pcd_fifles)):# for i in range(len(bin_files)):# 点云文件是pcdpcd = open3d.io.read_point_cloud(pcd_fifles[i]) points = np.asarray(pcd.points)# 点云文件是bin# bin = np.fromfile(bin_files[i], dtype=np.float32).reshape(-1, 4)# points = np.asarray(bin)pointcloud.points = open3d.utility.Vector3dVector(points[:, :3])# # #设置点的颜色为白色# pointcloud.paint_uniform_color([1,1,1])base_filename = os.path.basename(res_txt_files[i])results = np.loadtxt(res_txt_files[i])ref_boxes = results[:,0:7]ref_labels = results[:,7]ref_scores = results[:,8]#设置颜色背景为黑色opt = vis.get_render_option()opt.background_color = np.asarray([0,0,0])line_sets = []for i in range(ref_boxes.shape[0]):line_set, box3d = translate_boxes_to_open3d_instance(ref_boxes[i])if ref_labels is None:line_set.paint_uniform_color((1, 0, 0))elif ref_scores[i]>=0.5:line_set.paint_uniform_color(box_colormap[int(ref_labels[i])])line_sets.append(line_set) for geom in line_sets: vis.add_geometry(geom)# 设置初始视角ctr = vis.get_view_control()ctr.set_front([0, 0, 1]) # 面向z轴ctr.set_up([-1, 0, 0]) # x轴向下ctr.set_lookat([0.5,0.5,0.5]) # 焦点中心ctr.set_zoom(0.15) # 缩小倍数,需要自己多次尝试ctr.translate(x=0, y=600, xo=0.0, yo=0.0) # 点云在像素坐标上的平移,需要自己多次尝试vis.update_geometry(pointcloud)if to_reset:vis.reset_view_point(True)to_reset = Falsevis.poll_events()vis.update_renderer()for geom in line_sets:# reset_bounding_box = False, 是为了保持视图的视角和大小vis.remove_geometry(geom,reset_bounding_box = False)del geom # 删除引用以允许垃圾回收time.sleep(0.1)# break
vis.destroy_window()
效果如下
连续帧点云目标检测可视化展示