使用Python 3中的Marching-Cubes算法进行点云三角化

7
我正在开发一个三维重建系统,想要使用Python 3从已注册的点云数据生成三角网格。我的对象不是凸的,因此Marching Cubes算法似乎是解决方案。
我更喜欢使用现有的方法实现,所以我尝试了scikit-imageOpen3d但两个API都不接受原始点云作为输入(请注意,我不是这些库的专家)。我尝试将我的数据转换失败了,而且由于文档没有说明函数的输入格式,我也没有更多的想法。
这是我需要的pcd_to_volume代码片段。 scikit-image
import numpy as np
from skimage.measure import marching_cubes_lewiner

N = 10000
pcd = np.random.rand(N,3)

def pcd_to_volume(pcd, voxel_size):
    #TODO

volume = pcd_to_volume(pcd, voxel_size=0.05)

verts, faces, normals, values = marching_cubes_lewiner(volume, 0)

open3d

import numpy as np
import open3d

N = 10000
pcd = np.random.rand(N,3)

def pcd_to_volume(pcd, voxel_size):
    #TODO

volume = pcd_to_volume(pcd, voxel_size=0.05)

mesh = volume.extract_triangle_mesh()

我无法找到一个合适的方法来正确编写 pcd_to_volume 函数。我不偏向于某个库,因此这两种解决方案都可以。

你有什么建议可以正确地转换我的数据吗?点云是一个 Nx3 矩阵,其中 dtype=float

你知道另一种实现 [Marching Cube 算法],可以在原始点云数据上工作吗?我更喜欢像 scikit 和 open3d 这样的库,但我也会考虑 github 项目。


谢谢你的问题。实际上我现在也遇到了同样的问题。只是好奇,你找到任何解决方案了吗?谢谢! - CodingNow
1
@CodingNow 很遗憾,目前还没有。作为一种解决方法,我已经尝试了Matlab中的alphaShape,效果还不错。然而,在Python中我还没有找到任何好的替代方案。 - Marco Carletti
谢谢你提供的信息。Matlab总是最强的。 - CodingNow
要对点云进行三角化,您可以使用凸包算法。https://docs.scipy.org/doc/scipy/reference/generated/scipy.spatial.ConvexHull.html - undefined
2个回答

5

你知道另一种适用于原始点云数据的 marching cube 算法实现吗?

Hoppe 的论文 Surface reconstruction from unorganized points 可能包含您需要的信息,而且是 开源的

最新的 Open3D 似乎包含了表面重建算法,如 alphaShapeballPivotingPoissonReconstruction


据我所知,marching cubes通常用于从三维离散标量场(也就是您所说的体积)中提取等值面的多边形网格。该算法无法处理原始点云数据。
Hoppe算法通过首先生成带符号距离函数场(SDF体积),然后将其传递给Marching Cubes。这可以看作是对pcd_to_volume的一种实现,但并不是唯一的方法!
如果您只有原始点云,则情况会有些受限。正如您可能已经看到的,Poisson reconstructionScreened Poisson reconstruction算法都以自己的方式实现了pcd_to_volume(它们高度相关)。但是,它们需要额外的点法线信息,并且法线必须被一致地定向。(关于一致的定向,您可以阅读this question)。

虽然一些基于Delaunay算法的算法(它们不使用Marching Cubes算法),如alphaShape和this,可能不需要点法线作为输入,但对于具有复杂拓扑结构的曲面来说,由于方向问题很难得到令人满意的结果。而图割方法可以利用可见性信息来解决这个问题。


话虽如此,如果您的数据来自深度图像,通常会有可见性信息。您可以使用 TSDF构建一个良好的表面网格。Open3D已经实现了这一点


我一定会查看那些论文。谢谢!我不是3D重建的专家,你的答案非常有教育意义。关于我的数据,我从深度图像生成点云,因此可见性信息是可用的:我也会检查TSDF。 - Marco Carletti
如果深度数据来自于连续扫描设备,我个人建议使用tsdf(体素格子距离函数)。如果是这种情况,您可能需要查看KinectFusion以及其后续工作。详情请参考链接:https://www.microsoft.com/en-us/research/wp-content/uploads/2016/02/ismar2011.pdf - Jing Zhao
如果您的深度图像只是在离散时间的不同位置拍摄的话,那么在点云进行正常估计后,筛选泊松可能已经足够了。希望这可以帮到您! - Jing Zhao

1
对于其他遇到这篇帖子的人来说,如果你无法从你的点构建一个可以在scikit-image中与marching_cubes一起使用的numpy数组,Open3D有一些表面重建的选项,这些选项以前可能不可用。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接