File size: 2,071 Bytes
3217786 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 | # import open3d as o3d
# # 加载点云数据
# pcd = o3d.io.read_point_cloud("/data_160TB/2021/yangkun/gaussian-splatting-main-copy/eg3d_human/train/person_0/point_cloud/iteration_12000/point_cloud.ply")
# # 基于统计距离滤波
# # cl, ind = pcd.remove_statistical_outlier(nb_neighbors=20, std_ratio=2.0)
# # 设置体素的大小
# voxel_size = 0.01
# # 进行体素化
# voxel_grid = o3d.geometry.VoxelGrid.create_from_point_cloud(pcd, voxel_size)
# # 可视化滤波后的点云
# # inlier_cloud = pcd.select_by_index(ind)
# # o3d.visualization.draw_geometries([inlier_cloud])
# # 保存滤波后的点云为PLY格式
# o3d.io.write_point_cloud("/data_160TB/2021/yangkun/gaussian-splatting-main-copy/eg3d_human/train/person_0/point_cloud/iteration_12000/point_cloud0.ply", voxel_grid)
import open3d as o3d
# 加载点云数据
point_cloud = o3d.io.read_point_cloud("/data_160TB/2021/yangkun/gaussian-splatting-main-copy/eg3d_human/train/person_0/point_cloud/iteration_12000/point_cloud.ply")
# 将点云数据转换为 CPU 模式
point_cloud_cpu = point_cloud.to_legacy_pointcloud()
# 计算法向量
point_cloud_cpu.estimate_normals(search_param=o3d.geometry.KDTreeSearchParamHybrid(radius=0.1, max_nn=30))
# 获取法向量和曲率
normals = point_cloud_cpu.normals
curvatures = point_cloud_cpu.compute_curvature()
# 设置曲率阈值
curvature_threshold = 0.05 # 根据具体情况调整阈值
# 根据曲率进行剔除
filtered_points = []
for i in range(len(point_cloud_cpu.points)):
if curvatures[i] < curvature_threshold:
filtered_points.append(point_cloud_cpu.points[i])
# 创建剔除后的点云
filtered_point_cloud = o3d.geometry.PointCloud()
filtered_point_cloud.points = o3d.utility.Vector3dVector(filtered_points)
# 保存稠密化后的点云为PLY文件
o3d.io.write_point_cloud("/data_160TB/2021/yangkun/gaussian-splatting-main-copy/eg3d_human/train/person_0/point_cloud/iteration_12000/point_cloud0.ply", filtered_point_cloud)
print("Point cloud densification completed and saved as output_dense_point_cloud.ply") |