import open3d as o3d import numpy as np import copy # PCD ファイルを読み取る pcd = o3d.io.read_point_cloud("rabbit.pcd") # 元の点群を視覚化する o3d.visualization.draw_geometries([pcd]) # ダウンサンプル pcd_down = pcd .voxel_down_sample (voxel_size=0.05) # ノイズ除去 pcd_remove_noise, ind = pcd_down.remove_statistical_outlier(nb_neighbors=20, std_ratio=2.0) # 法線ベクトルの抽出 pcd_remove_noise.estimate_normals(search_param=o3d.geometry. KDTreeSearchParamHybrid(radius=0.1, max_ nn=30) ) # 平面セグメンテーション plan_model, inliers = pcd_remove_noise.segment_plane( distance_threshold=0.01, ransac_n=3、 num_iterations=1000) # 点云配基準 source = copy.deepcopy(pcd_remove_noise) target = copy.deepcopy(pcd_remove_noise) source.transform(plane_model.get_rotation_matrix()) icp_output = o3d.pipelines.registration.registration_icp(source, target, 0.1 、 np.identity(4)、 o3d.pipelines.registration.TransformationEstimationPointToPoint()、 o3d.pipelines.registration.ICPConvergenceCriteria(relative_fitness=1e-6, relative_rmse=1e-6, max_iteration=50)) # 点云重建 Mesh, densities = o3d.geometry.TriangleMesh.create_from_point_cloud_poisson(pcd_remove_noise, Depth=10, scale=1.1,linear_fit=True)[0:2] # 視覚的な再構成結果 o3d.visualization.draw_geometries([mesh])