1

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

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

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

4

1 回答 1

5

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

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

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

from pyntcloud import PyntCloud
cloud = PyntCloud.from_file("Box.ply")

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

示例点云

计算曲率的步骤是:


获取每个点的 k 邻域:

k_neighbors = cloud.get_neighbors(k=10)

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

ev = cloud.add_scalar_field("eigen_values", k_neighbors=k_neighbors)

根据这些特征值计算曲率:

cloud.add_scalar_field("curvature", ev=ev)

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

cloud.to_file("out.ply")

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

点云曲率


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

curvature = cloud.points["curvature(K(16))"]
cloud.points = cloud.points[curvature > curvature.mean()]
cloud.to_file("out.ply")

以及新的内容out.ply

点云过滤

于 2017-02-27T15:46:14.957 回答