首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >点云到体积

点云到体积
EN

Stack Overflow用户
提问于 2017-07-09 21:42:41
回答 1查看 10.4K关注 0票数 6

我有一个笛卡尔坐标的点云。使用python,我想将这些点包裹在一个网格中,然后获得一个云的体积。这些点分布在整个云中,而不仅仅是表示最外面的曲面。我想包裹最外面的表面。谁能告诉我哪里有图书馆可以帮我解决这个问题?你建议我使用哪些函数来包装,然后计算体积?

提前感谢您的帮助!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-07-19 16:53:40

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

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

以下是步骤:

从文件加载点云:

代码语言:javascript
复制
from pyntcloud import PyntCloud
diamond = PyntCloud.from_file("test/data/diamond.ply")

下面是这个样例点云的外观:

计算凸包

这使用了scipy的Qhull库包装:

代码语言:javascript
复制
convex_hull_id = diamond.add_structure("convex_hull")

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

代码语言:javascript
复制
convex_hull = diamond.structures[convex_hull_id]

可视化凸面外壳

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

代码语言:javascript
复制
diamond.mesh = convex_hull.get_mesh()

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

代码语言:javascript
复制
diamond.to_file("diamond_hull.ply", also_save=["mesh"])

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

从凸包中获取体积

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

代码语言:javascript
复制
volume = convex_hull.volume

使用球体进行测试

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

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

代码语言:javascript
复制
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)

输出:

代码语言:javascript
复制
65439.21101051165

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

代码语言:javascript
复制
import numpy as np
# google: volume of sphere
print((4/3) * np.pi * (25 ** 3))

输出:

代码语言:javascript
复制
65449.84694978735

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

票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44997054

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档