点云凹凸性检验(1/2)

使用open3d 计算点云法向量并根据法向量判断凹凸性

在某些点云处理场景中,我们不仅需要法向量,还需要法向量所指示的某些区域的点云的凹凸性。

法向量

先去github找个bunny.pcd的实验点云

读到python里面用open3d的法线估计可获得以下效果:

pcd.estimate_normals()

点云凹凸性检验(1/2)_第1张图片

最小生成树

使用open3d自带的api计算法向量时会出现某些法向量时,会出现某些表面法向量反向的情况,如图:

点云凹凸性检验(1/2)_第2张图片

没看过open3d的手册,不知道它算法向量为什么会出现这种反向的情况,这种结果似乎只够反映点云不需要方向的点云曲率等特征。当我们从某个方向观测点云时还有可能需要表面点云的凹凸性特征。

对于计算法向量出现反向的情况,open3d自身也给出了解法。

pcd.orient_normals_consistent_tangent_plane(100)

最小代价生成树意味着此函数是open3d应用某种贪心算法降低点云整体生成的树代价,使其最小。使用此方法能够将点云整体的法向量归到点云的同一侧。如下图:

点云凹凸性检验(1/2)_第3张图片

估计向量并记录

import open3d as o3d
import numpy as np
pcd = o3d.io.read_point_cloud(".../bunny_pcd.pcd")
pcd.paint_uniform_color([1.0, 0.0, 0.0])
pcd.estimate_normals(search_param=o3d.geometry.KDTreeSearchParamHybrid(radius=0.01, max_nn=30)) 
pcd.orient_normals_consistent_tangent_plane(100) 
print(np.asarray(pcd.normals)[:10, :]) 

o3d.visualization.draw_geometries([pcd], point_show_normal=True, window_name="最小生成树向量估计",
                                  width=1024, height=768,
                                  left=50, top=50,
                                  mesh_show_back_face=False)  # 可视化点云和法线

点云凹凸性检验(1/2)_第4张图片点云凹凸性检验(1/2)_第5张图片

处理后我们可以看到,图中所示法向量向外发散的区域即为凸起区域,而法向量向内收敛的区域即为点云的凹陷区域。

我们将曲率较大的点的临近两点连成线段,可以发现凸起点的自身法向量是背离线段的,而凹陷点的法向量是朝向线段的。记录这些单位向量矩阵,利用此特性,我们将在下一节设计分割凹凸点的逻辑。

你可能感兴趣的:(python,算法,几何学)