def get_box(md_pcd, sr_pcd, st_pcd):
# 计算点云的最小外接立方体
md_obb = md_pcd.get_axis_aligned_bounding_box()
md_obb.color = (0, 0, 1)
min_xyz = md_obb.min_bound
max_xyz = md_obb.max_bound
points_s = np.asarray(st_pcd.points)
ind = np.where(
(points_s[:, 0] >= min_xyz[0]) & (points_s[:, 0] <= max_xyz[0]) & (
points_s[:, 1] >= min_xyz[1]) & (
points_s[:, 1] <= max_xyz[1]) & (
points_s[:, 2] >= min_xyz[2]) & (
points_s[:, 2] <= max_xyz[2]))[0]
sr_pcd = sr_pcd.select_by_index(ind)
sr_obb = sr_pcd.get_axis_aligned_bounding_box()
sr_obb.color = (0, 0, 1)
red_color = [1, 0, 0] # 红色
blue_color = [0, 0, 1] # 蓝色
sr_pcd.paint_uniform_color(red_color)
md_pcd.paint_uniform_color(blue_color)
# 可视化结果
# o3d.visualization.draw_geometries([md_obb,md_pcd])
combined_pcd = md_pcd + sr_pcd
# 旋转90°
angle_degrees = 90
angle_radians = np.radians(angle_degrees)
R = np.array([[np.cos(angle_radians), -np.sin(angle_radians), 0],
[np.sin(angle_radians), np.cos(angle_radians), 0],
[0, 0, 1]])
center = combined_pcd.get_center()
rotated_pcd = combined_pcd.rotate(R, center=(center[0], center[1], center[2]))
# 创建一个渲染器
vis = o3d.visualization.Visualizer()
# 添加点云到渲染器
vis.create_window()
vis.add_geometry(rotated_pcd)
# vis.add_geometry(md_obb)
# 设置初始视角
view_control = vis.get_view_control()
# 缩放调整尺寸
view_control.set_zoom(0.45)
view_control.rotate(0,700) # 以y轴旋转5度
# 获取相机参数
# params = vis.get_view_control().convert_to_pinhole_camera_parameters()
vis.poll_events()
vis.update_renderer()
# 获取当前帧的渲染图像
img = vis.capture_screen_float_buffer()
vis.destroy_window()
img = (np.array(img) * 255).astype(np.uint8)
cv2.imwrite(r"point_cloud_3d.png", img)
# vis.capture_screen_image("point_cloud_2d.png")
# 关闭渲染窗口
print("2D图片已保存为point_cloud_2d.png")
点云外接框、旋转、配色
最新推荐文章于 2024-07-12 19:06:42 发布