simple 3D reconstruction

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])

 

Guess you like

Origin blog.csdn.net/qq_53545309/article/details/129430324