简单三维重建

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))
# 平面分割
plane_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])

猜你喜欢

转载自blog.csdn.net/qq_53545309/article/details/129430324