2024-05-15 16:16:42 发布
网友
我有一个笛卡尔坐标系的点云。使用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()
并将点云+网格保存到文件(例如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.84694978735
惠特非常接近,考虑到我们使用的是米,我们只用100000点来近似球体
你需要做的是计算点云的Convex Hull。
您可以使用https://github.com/daavoo/pyntcloud(欢迎投稿)。
以下是步骤:
从文件加载点云:
以下是此示例点云的外观:
计算凸壳
这使用了scipy的Qhull库包装:
您可以这样访问凸面外壳:
凸面外壳可视化
可以从凸面外壳生成网格,如下所示:
并将点云+网格保存到文件(例如ply格式)中,并在任何三维网格软件(例如Meshlab)中将其可视化:
下面是在meshlab中可视化的输出:
从凸包中获取体积
最后,可以这样轻松地计算凸面外壳的体积:
用球体测试
要测试此方法的精度,可以运行以下代码。
这将生成球体的点云(半径25),并使用凸面外壳计算体积:
输出:
因为它是一个球体,我们可以计算实际体积:
输出:
惠特非常接近,考虑到我们使用的是米,我们只用100000点来近似球体
相关问题 更多 >
编程相关推荐