open3d提取每个点的法向量并可视化

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)  # 窗口高度

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_53610475/article/details/129184259