点云到体积

2024-05-15 16:16:42 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个笛卡尔坐标系的点云。使用python,我想将这些点包装在网格中,然后获取一个云的体积。这些点分布在整个云中,而不仅仅代表最外面的表面。我想把最外层包起来。有人能给我指一个能帮我解决这个问题的图书馆吗?你建议我用什么函数包装然后计算体积?

谢谢你的帮助!


Tags: 函数网格图书馆体积代表表面建议坐标系
1条回答
网友
1楼 · 发布于 2024-05-15 16:16:42

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

您可以使用https://github.com/daavoo/pyntcloud(欢迎投稿)。

以下是步骤:

从文件加载点云:

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

以下是此示例点云的外观: point cloud

计算凸壳

这使用了scipy的Qhull库包装:

convex_hull_id = diamond.add_structure("convex_hull")

您可以这样访问凸面外壳:

convex_hull = diamond.structures[convex_hull_id]

凸面外壳可视化

可以从凸面外壳生成网格,如下所示:

diamond.mesh = convex_hull.get_mesh()

并将点云+网格保存到文件(例如ply格式)中,并在任何三维网格软件(例如Meshlab)中将其可视化:

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

下面是在meshlab中可视化的输出:

mesh

从凸包中获取体积

最后,可以这样轻松地计算凸面外壳的体积:

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

惠特非常接近,考虑到我们使用的是米,我们只用100000点来近似球体

相关问题 更多 >