我正在尝试对 .obj 网格进行体素化(来自搅拌机)并将其转换为 numpy 数组(将其另存为 .npy 或 nii.gz 作为 CT-3D 图像)。
import open3d as o3d
import numpy as np
mesh = o3d.io.read_triangle_mesh('path/to/file.obj')
voxel_grid = o3d.geometry.VoxelGrid.create_from_triangle_mesh(mesh, voxel_size=0.01)
voxels = np.array([voxel.grid_index for voxel in voxel_grid.get_voxels()])
grid_size = voxels.max(axis=0) + 1
voxel_array = np.zeros(grid_size, dtype=np.uint16)
voxel_array[voxels[:, 0], voxels[:, 1], voxels[:, 2]] = 1
np.save('path/to/file_open3d.npy', voxel_array)
我有一个很好的 GPU,所以 open3d 与 cuda 配合得很好,体素化工作得很快,但我找不到一种方法来提取所有 grid_indexes 而不使用 for 循环:
voxels = np.array([voxel.grid_index for voxel in voxel_grid.get_voxels()])
与体素化相比,这需要很多时间。
有人有过这样的经历吗?有什么意见欢迎留言。
目前我在 python 中进行了大量网格生成工作。当使用 python 执行大量数据的 for 循环之类的任务时,我也遇到了速度缓慢的情况(我使用超过 10Mio 的顶点进行了计算,然后保存了它们)。我的解决方法是在 C++ 中实现这些瓶颈函数,然后从我的 C++ 文件编译一个 .so 文件,然后使用“ctypes”模块在 python 中调用它。现在我的计算速度至少快了 10 倍。因此,我建议您对 for 循环执行相同的操作,并实现一种方法来在 C++ 中迭代循环,然后将数据返回到您的 Python 脚本。
这是一个很好的起点,解释了在 python 中调用 C++ 代码所需的步骤:从 Python 调用 C/C++?