python点云下采样_Open3D三维点云读取可视化、下采样、
去除离点、地⾯提取...
import open3d as o3d
def display_inlier_outlier(cloud, ind):
inlier_cloud = cloud.select_by_index(ind)
outlier_cloud = cloud.select_by_index(ind, invert=True)
print("Showing outliers (red) and inliers (gray): ")
outlier_cloud.paint_uniform_color([1, 0, 0])
inlier_cloud.paint_uniform_color([0.8, 0.8, 0.8])
o3d.visualization.draw_geometries([inlier_cloud, outlier_cloud], window_name='Open3D Removal Outlier', width=1920,
python怎么读取桌面上的文件height=1080, left=50, top=50, point_show_normal=False, mesh_show_wireframe=False,
mesh_show_back_face=False)
# 读取:⽀持xyz、xyzn、xyzrgb、pts、ply、pcd、txt
pcd = ad_point_cloud("D:/pcd/milk_cartoon_all_small_clorox.pcd")
# pcd = ad_point_cloud("../../TestData/", format='xyz')
print(pcd)
o3d.visualization.draw_geometries([pcd], window_name='Open3D Origin', width=1920, height=1080, left=50, top=50,
point_show_normal=False, mesh_show_wireframe=False, mesh_show_back_face=False)
# 下采样
# voxel_down_sample(把点云分配在三维的⽹格中,取平均值)
# uniform_down_sample (可以通过收集每第n个点来对点云进⾏下采样)
# select_down_sample (使⽤带⼆进制掩码的select_down_sample仅输出所选点。选定的点和未选定的点并可视化。)
print("Downsample the point cloud with a voxel of 0.003")
downpcd = pcd.voxel_down_sample(voxel_size=0.003)
print(downpcd)
o3d.visualization.draw_geometries([downpcd], window_name='Open3D downSample', width=1920, height=1080, left=50, top=50,
point_show_normal=False, mesh_show_wireframe=False, mesh_show_back_face=False)
# 重新计算平⾯法线
# 顶点法线估计【Vertex normal estimation】
# 点云的另⼀个基本操作是点法线估计。按n查看法线。键-和键+可⽤于控制法线的长度。
print("Recompute the normal of the downsampled point cloud")
downpcd.estimate_normals(search_ry.KDTreeSearchParamHybrid(radius=0.1, max_nn=30))
o3d.visualization.draw_geometries([downpcd], window_name='Open3D downSample Normals', width=1920, height=1080, left=50,
top=50, point_show_normal=True, mesh_show_wireframe=False, mesh_show_back_face=False)
# 离点去除 【outlier removal】
# 点云离值去除 从扫描设备收集数据时,可能会出现点云包含要消除的噪声和伪影的情况。本教程介绍了Open3D的异常消除功能。 准备输⼊数据,使⽤降采样后的点云数据。
# statistical_outlier_removal 【统计离值移除】 删除与点云的平均值相⽐更远离其邻居的点。
# 它带有两个输⼊参数:nb_neighbors 允许指定要考虑多少个邻居,以便计算给定点的平均距离
# std_ratio 允许基于跨点云的平均距离的标准偏差来设置阈值级别。此数字越低,过滤器将越具有攻击性
#
# radius_outlier_removal 【半径离值去除】 删除在给定球体中周围⼏乎没有邻居的点。
# 两个参数可以调整以适应数据:nb_points 选择球体应包含的最⼩点数
# radius 定义将⽤于计算邻居的球体的半径
print("Statistical oulier removal")
cl, ind = ve_statistical_outlier(nb_neighbors=20, std_ratio=2.0)
display_inlier_outlier(downpcd, ind)
downpcd_inlier_cloud = downpcd.select_by_index(ind)
print(downpcd_inlier_cloud)
# 平⾯分割 【Plane Segmentation】
# Open3D还包含使⽤RANSAC从点云中分割⼏何图元的⽀持。要在点云中到具有最⼤⽀持的平⾯,我们可以使⽤segement_plane。该⽅法具有三个参数。
# distance_threshold定义⼀个点到⼀个估计平⾯的最⼤距离,该点可被视为⼀个不规则点; ransac_n定义随机采样的点数以估计⼀个平⾯; num_iterations定义对随机平⾯进⾏采样和验证的频率。
# 函数然后将平⾯返回为(a,b,c,d) 这样,对于平⾯上的每个点(x,y,z),我们都有ax + by + cz + d = 0。该功能进⼀步调整内部点的索引列表。
plane_model, inliers = downpcd_inlier_cloud.segment_plane(distance_threshold=0.01,
ransac_n=5,
num_iterations=10000)
[a, b, c, d] = plane_model
print(f"Plane equation: {a:.2f}x + {b:.2f}y + {c:.2f}z + {d:.2f} = 0")
inlier_cloud = downpcd_inlier_cloud.select_by_index(inliers)
print('----inlier_cloud: ', inlier_cloud.points)
inlier_cloud.paint_uniform_color([1.0, 0, 0])
outlier_cloud = downpcd_inlier_cloud.select_by_index(inliers, invert=True)
print('----outlier_cloud: ', outlier_cloud.points)
o3d.visualization.draw_geometries([inlier_cloud, outlier_cloud], window_name='Open3D Plane Model', width=1920,
height=1080, left=50, top=50, point_show_normal=False, mesh_show_wireframe=False, mesh_show_back_face=False)
o3d.io.write_point_cloud("D:/pcd/1001140020191217_las2pcd_cx_g.pcd", inlier_cloud) # help(o3d.visualization.draw_geometries)
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论