Files
hivecore_robot_vision/tools/read_stl.py

50 lines
1.5 KiB
Python
Raw Normal View History

2025-11-17 13:46:10 +08:00
import logging
import numpy as np
import open3d as o3d
def read_stl(stl_path: str, save_path: str, view_pointcloud: bool = False) -> None:
mesh = o3d.io.read_triangle_mesh(stl_path)
mesh.scale(0.001, center=[0, 0, 0])
mesh.compute_vertex_normals()
pcd_model = mesh.sample_points_uniformly(number_of_points=50000)
# pcd_model = pcd_model.voxel_down_sample(voxel_size=0.01)
center = pcd_model.get_center().flatten()
R = np.eye(4)
R[0, 3], R[1, 3], R[2, 3] = -center
pcd_model.transform(R)
R = np.array(
[[0, 0, 1, 0],
[0, 1, 0, 0],
[-1, 0, 0, 0],
[0, 0, 0, 1]],
)
pcd_model.transform(R)
if view_pointcloud:
point = [
[0, 0, 0], [1, 0, 0], [0, 1, 0], [0, 0, 1]
] # 画点:原点、第一主成分、第二主成分
lines = [
[0, 1], [0, 2], [0, 3]
] # 画出三点之间两两连线
colors = [
[1, 0, 0], [0, 1, 0], [0, 0, 1]
]
# 构造open3d中的LineSet对象用于主成分显示
line_set = o3d.geometry.LineSet(points=o3d.utility.Vector3dVector(point), lines=o3d.utility.Vector2iVector(lines))
line_set.colors = o3d.utility.Vector3dVector(colors)
o3d.visualization.draw_geometries([pcd_model, line_set])
2025-11-19 16:46:40 +08:00
# success = o3d.io.write_point_cloud(save_path, pcd_model)
# logging.info(f"PCD_0, 写入结果: {success}")
2025-11-17 13:46:10 +08:00
if __name__ == "__main__":
read_stl()