open3d |如何计算点云创建的网格的体积?

问题描述 投票:0回答:1

我使用“open3d.geometry.TriangleMesh.create_from_point_cloud_alpha_shape”函数创建一个网格,并想要计算它的体积。但出现运行时错误,如下所示:

[Open3D WARNING] [CreateFromPointCloudAlphaShape] invalid tetra in TetraMesh
---------------------------------------------------------------------------
RuntimeError                              Traceback (most recent call last)
Input In [27], in <cell line: 7>()
      3 point_cloud.points = open3d.utility.Vector3dVector(data_all)
      5 tri_mesh = open3d.geometry.TriangleMesh.create_from_point_cloud_alpha_shape(point_cloud, alpha=10)
----> 7 v = open3d.geometry.TriangleMesh.get_volume(tri_mesh)
      8 print(v)

RuntimeError: [Open3D Error] (double open3d::geometry::TriangleMesh::GetVolume() const) /Users/runner/work/Open3D/Open3D/cpp/open3d/geometry/TriangleMesh.cpp:1220: The mesh is not watertight, and the volume cannot be computed.

我在网上搜索了(https://github.com/isl-org/Open3D/pull/3201),发现警告消息(TetraMesh中无效的tetra)是一个常见问题,原因是有些点在里面网格中而不是表面中。因此,我通过计算每个点到表面的距离来排除所有不在表面中的点。

然后,我使用“open3d.geometry.TriangleMesh.create_from_point_cloud_alpha_shape”函数重新创建网格。出现同样的问题,网格仍然不防水。

有什么方法可以解决这个问题并计算体积吗?

谢谢!

python graphics 3d computational-geometry open3d
1个回答
1
投票

为了计算体积,您需要一个防水网格,这意味着它必须没有开口。这不是 alpha 形状算法所保证的;如果你选择一个较小的阿尔法,最终它只会创建小岛或孤立的三角形。 本教程提供了不同 alpha 发生的情况的示例: http://www.open3d.org/html/tutorial/Advanced/surface_reconstruction.html

您可以通过

tri_mesh.is_watertight()
检查是否成功。

但是这里的核心问题实际上是如何使网格不漏水,这是在这个问题中被问到并回答的

也许选择较大的

alpha

 就足以满足您的情况,或者也许您可以使用像 
create_from_point_cloud_poisson
 这样的替代算法更好(应该保证防水,如果形状大部分是凸的,体积将被低估)或 
create_from_point_cloud_ball_pivoting

您应该绘制几何图形和点云以进行目视检查,并比较每种方法的体积。

© www.soinside.com 2019 - 2024. All rights reserved.