高斯曲率和平均曲率适用于粗糙表面吗?

tro*_*e00 1 python curve-fitting smoothing point-clouds structure-from-motion

对于我正在进行的一个项目,我已经成功地对道路图像数据执行了 SFM 程序,并且能够生成一个包含点云坐标(X、Y、Z)、RGB 值和法线(nx、纽约州,新西兰)。

现在,我有兴趣根据我拥有的数据计算每个点的曲率值。我在 Python 中遇到过Surface Curvature MATLAB Equivalent,但据说该实现仅在 X、Y 和 Z 是二维数组时才有效。

如果路面非常粗糙,高斯曲率和平均曲率是否适用?给定大小 NX3 的 (X,Y,Z) 坐标数据和大小 NX3 的 (nx,ny,nz) 法线数据,我应该如何找到曲率?Python 中是否有当前的实现?

Dav*_*sia 5

我实际上正在编写一个用于处理点云Python 库

使用原始点云,我知道的唯一“曲率”概念是使用从每个点的邻域获得的特征值计算的。

如果这就是你的意思,这里是一个示例代码:

from pyntcloud import PyntCloud
cloud = PyntCloud.from_file("Box.ply")
Run Code Online (Sandbox Code Playgroud)

这是里面的示例点云Box.ply

示例点云

计算曲率的步骤是:


获取每个点的 k-邻居:

k_neighbors = cloud.get_neighbors(k=10)
Run Code Online (Sandbox Code Playgroud)

使用它的k(在本例中为 10 个)邻居计算每个点的特征值:

ev = cloud.add_scalar_field("eigen_values", k_neighbors=k_neighbors)
Run Code Online (Sandbox Code Playgroud)

从这些特征值计算曲率:

cloud.add_scalar_field("curvature", ev=ev)
Run Code Online (Sandbox Code Playgroud)

使用新的标量字段保存云:

cloud.to_file("out.ply")
Run Code Online (Sandbox Code Playgroud)

这是out.ply根据分配给每个点的曲率值着色的内部点云(白色是更高的曲率值):

点云曲率


这是一个关于如何过滤点云以仅保留曲率值高于平均值的点的示例:

curvature = cloud.points["curvature(K(16))"]
cloud.points = cloud.points[curvature > curvature.mean()]
cloud.to_file("out.ply")
Run Code Online (Sandbox Code Playgroud)

以及新内容out.ply

点云过滤