点云到体积

Point Cloud to Volume

我有一个笛卡尔坐标系的点云。使用 python 我想将这些点包裹在网格中,然后获取云的体积。这些点分布在整个云中,而不仅仅是代表最外层的表面。我想包裹最外层的表面。任何人都可以指出可以帮助我解决这个问题的图书馆吗?你推荐我使用什么函数来包装然后计算体积?

提前感谢您的帮助!

您需要做的是计算点云的 Convex Hull

您可以使用 https://github.com/daavoo/pyntcloud 来做到这一点(欢迎贡献)。

步骤如下:

从文件加载点云:

from pyntcloud import PyntCloud
diamond = PyntCloud.from_file("test/data/diamond.ply")

这是这个示例点云的样子:

计算凸包

这使用了 scipy 的 Qhull 库包装:

convex_hull_id = diamond.add_structure("convex_hull")

您可以像这样访问凸包:

convex_hull = diamond.structures[convex_hull_id]

可视化凸包

您可以按如下方式从凸包生成网格:

diamond.mesh = convex_hull.get_mesh()

并将点云 + 网格保存到文件(例如层格式)并在任何 3D 网格软件中可视化(例如 Meshlab):

diamond.to_file("diamond_hull.ply", also_save=["mesh"])

这是在 meshlab 中可视化的输出:

从凸包获取体积

最后,您可以像这样轻松地访问凸包的体积:

volume = convex_hull.volume

用球体测试

要测试此方法的精度,您可以 运行 以下代码。

这将生成球体(半径 25)的点云并使用凸包计算体积:

from pyntcloud import PyntCloud
from pyntcloud.geometry.models.sphere import create_sphere
cloud = PyntCloud(create_sphere(center=[0, 0, 0], radius=25, n_points=100000))
convex_hull_id = cloud.add_structure("convex_hull")
convex_hull = cloud.structures[convex_hull_id]
print(convex_hull.volume)

输出:

65439.21101051165

因为它是一个球体,我们实际上可以计算出实际体积:

import numpy as np
# google: volume of sphere
print((4/3) * np.pi * (25 ** 3))

输出:

65449.84694978735

Whit 非常接近,因为我们使用的是米,而且我们只使用 100000 个点来近似球体