从 open3d VoxelGrid 中提取 grid_index 非常慢

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

我正在尝试对 .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 performance 3d gpu open3d
1个回答
0
投票

目前我在 python 中进行了大量网格生成工作。当使用 python 执行大量数据的 for 循环之类的任务时,我也遇到了速度缓慢的情况(我使用超过 10Mio 的顶点进行了计算,然后保存了它们)。我的解决方法是在 C++ 中实现这些瓶颈函数,然后从我的 C++ 文件编译一个 .so 文件,然后使用“ctypes”模块在 python 中调用它。现在我的计算速度至少快了 10 倍。因此,我建议您对 for 循环执行相同的操作,并实现一种方法来在 C++ 中迭代循环,然后将数据返回到您的 Python 脚本。

这是一个很好的起点,解释了在 python 中调用 C++ 代码所需的步骤:从 Python 调用 C/C++?

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