点云到体积
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 个点来近似球体
我有一个笛卡尔坐标系的点云。使用 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 个点来近似球体