import open3d as o3d import numpy as np import copy # read PCD file pcd = o3d.io.read_point_cloud("rabbit.pcd") # Visualize the raw point cloud o3d.visualization.draw_geometries([pcd]) # downsampling pcd_down = pcd.voxel_down_sample(voxel_size=0.05) # denoising pcd_remove_noise, ind = pcd_down.remove_statistical_outlier(nb_neighbors=20, std_ratio=2.0) # extract normal vector pcd_remove_noise.estimate_normals(search_param=o3d.geometry.KDTreeSearchParamHybrid(radius=0.1, max_nn=30)) # plane split plane_model, inliers = pcd_remove_noise.segment_plane(distance_threshold=0.01, ransac_n=3, num_iterations=1000) # point cloud registration 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)) # point cloud reconstruction mesh, densities = o3d.geometry.TriangleMesh.create_from_point_cloud_poisson(pcd_remove_noise, depth=10, scale=1.1, linear_fit=True)[0:2] # Visualize reconstruction results o3d.visualization.draw_geometries([mesh])