【编程实践】利用open3d生成物体的最长边方向并可视化
1 利用3d软件生成一个长方体
边长随意,长度随意
2 导出为模型文件并采样为点云数据
从mesh表面进行采样,点数根据自己需求进行设置,此处设置为100000。
采样结果:
3 识别OBB外接框并可视化长边方向
import numpy as np
import open3d as o3d
def get_obb_longest_edge_direction(obb):"""计算长边方向"""# 获取OBB的旋转矩阵R = obb.R# 获取OBB的扩展长度extent = obb.extent# 计算长边索引longest_edge_index = np.argmax(extent)# 计算长边方向向量longest_edge_direction = R[:, longest_edge_index]return longest_edge_directiondef create_line_set_of_OBBLongdir(start_point, end_point):# 创建两个点points = [start_point, end_point]# 创建一条线段lines = [[0, 1]]# 创建lineset对象line_set = o3d.geometry.LineSet(points = o3d.utility.Vector3dVector(points), lines = o3d.utility.Vector2iVector(lines))# 设置线段颜色line_set.colors = o3d.utility.Vector3dVector([[0, 1, 0]])return line_setdef main():# 1. 读取点云数据file_path = "cahngfangti-Mesh-sample.pcd" # 替换为你的点云文件路径pcd = o3d.io.read_point_cloud(file_path)# 2. 计算OBB外接框obb = pcd.get_oriented_bounding_box()obb.color = (1, 0, 0) # 设置OBB颜色# 3. 获取OBB的最长边方向longest_edge_direction = get_obb_longest_edge_direction(obb)print(f"OBB的最长边方向为 {longest_edge_direction}")# 4. 获取OBB的中心点center_point = obb.get_center()end_point = center_point + longest_edge_direction * 20.0# 5. 创建直线line_set = create_line_set_of_OBBLongdir(center_point, end_point)o3d.visualization.draw_geometries([pcd, obb, line_set])if __name__ == "__main__":main()