1. 记录一些容易忘记的点云操作
----后续一定补充
1.获取轴对齐包络框
下面的get_axis_aligned_bounding_box(),get_min_bound(),get_max_bound()等函数非常好用
import open3d as o3d
import numpy as np
# 读取点云数据
pcd = o3d.io.read_point_cloud("input.pcd")
# 获得点云边界
bbox = pcd.get_axis_aligned_bounding_box()
# 获得边界最小值和最大值
min_bound = bbox.get_min_bound()
max_bound = bbox.get_max_bound()
# 生成采样点云
interpolation_distance = 0.05
interpolated_pcd = o3d.geometry.PointCloud()
for x in np.arange(min_bound[0], max_bound[0], interpolation_distance):
for y in np.arange(min_bound[1], max_bound[1], interpolation_distance):
for z in np.arange(min_bound[2], max_bound[2], interpolation_distance):
point = np.array([x, y, z])
interpolated_pcd.points.append(point)
# 显示采样点云
o3d.visualization.draw_geometries([interpolated_pcd])
2.获取非轴对齐包络框
import numpy as np
import open3d as o3d
pcd = o3d.io.read_point_cloud("xx.pcd") # 读取点云数据
print("1. 轴对齐 aabb 框 =======================================")
bbox = pcd.get_axis_aligned_bounding_box() # 获得点云边界 # 轴对齐的 aabb 框
min_bound = bbox.get_min_bound() # 获得边界最小值和最大值
max_bound = bbox.get_max_bound()
print("长度:",max_bound[0]-min_bound[0],"宽度:",max_bound[1]-min_bound[1],"高度:",max_bound[2]-min_bound[2])
print("2. 非轴对齐 aabb 框 =======================================")
# 计算点云的OBB
obb = pcd.get_oriented_bounding_box()
# 获取OBB的中心点坐标、大小和旋转矩阵
obb_center = obb.center
obb_extent = obb.extent
obb_rotation = obb.R
# 打印非轴对齐OBB的信息
# print("OBB Center:", obb_center)
# print("OBB Extent:", obb_extent)
# print("OBB Rotation Matrix:")
print(("\t{:>8}" * 3).format(obb_extent[0], obb_extent[1],obb_extent[2]))
print(obb_rotation)
# 创建一个可视化窗口
# o3d.visualization.draw_geometries([pcd, obb])
# o3d.visualization.draw_geometries([obb])