1.点云读入
- 读入文件(配套点云下载链接)
# 读取点云
pcd = o3d.io.read_point_cloud("point_cloud_00000.ply")
- 配套点云颜色为白色,open3d的点云显示默认背景为白色,所以将点云颜色更改为黑色
pcd.colors = o3d.utility.Vector3dVector(np.zeros(np.array(pcd.colors).shape))
- 显示点云
o3d.visualization.draw_geometries([pcd])
2.点云预处理
- 均匀体素下采样:使用常规体素栅格从输入点云创建均匀下采样的点云。它通常用作许多点云处理任务的预处理步骤。该算法分两步操作:点被分段为体素;每个被占用的体素通过平均内部的所有点来精确生成一个点。
downpcd = pcd.voxel_down_sample(voxel_size=5e-3)
o3d.visualization.draw_geometries([downpcd])
– 关键参数voxel_size,体素大小,单位是米
3.点云法线提取与可视化
- 计算法向量(原理:查找相邻点,并使用协方差分析计算相邻点的主轴。)
downpcd.estimate_normals(
search_param=o3d.geometry.KDTreeSearchParamHybrid(radius=0.1, max_nn=30))
-
- 关键参数:一个o3d.geometry.KDTreeSearchParamHybrid的实例化对象,两个关键参数radius=0.1和max_nn=30:10厘米的搜索半径,最多只考虑30个邻居,以节省计算时间。
- 法向方向问题:协方差分析算法产生两个相反的方向作为正常候选。如果不知道几何体的全局结构,两者都可能是正确的。这就是所谓的法线方向问题。Open3D尝试将法线定向为与原始法线对齐(如果存在)。否则,Open3D会随机猜测。如果需要考虑方向,则需要调用其他方向函数,如orienta_normals_to_align_with_direction和orienta_nrmals_towards_camer_location。
- 提取估计的法相向量
N = np.array(downpcd.normals)
print(N)
[[-0.10498607 -0.08691976 0.9906679 ]
[-0.01047759 0.11685291 -0.99309396]
[ 0.20985038 0.09336236 -0.97326578]
...
[-0.30973721 -0.08777727 0.94676186]
[-0.39558671 -0.0815209 0.91480353]
[ 0.1276047 -0.09240519 0.98751117]]
- 可视化法向量(按N可以显示或隐藏法向量,按主键盘上的=、-可以调整法向量显示长短)
o3d.visualization.draw_geometries([downpcd], window_name="法线估计",
point_show_normal=True,
width=800, # 窗口宽度
height=600) # 窗口高度
版权声明:本文为weixin_53610475原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。