我有一个笛卡尔坐标的点云。使用python,我想将这些点包裹在一个网格中,然后获得一个云的体积。这些点分布在整个云中,而不仅仅是表示最外面的曲面。我想包裹最外面的表面。谁能告诉我哪里有图书馆可以帮我解决这个问题?你建议我使用哪些函数来包装,然后计算体积?
提前感谢您的帮助!
发布于 2017-07-19 16:53:40
您需要做的是计算点云的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()并将点云+网格保存为文件(例如ply格式)并在任何三维网格软件(例如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.84694978735Whit非常接近,因为我们使用的是米,并且我们只使用100000个点来近似球体
https://stackoverflow.com/questions/44997054
复制相似问题