能否直接从NumPy二进制数组创建Open3D的o3d.geometry.VoxelGrid?
Open3D中直接从二进制NumPy体素数组创建VoxelGrid的方法
现有体素可视化方式
在Open3D中,若要可视化二进制NumPy体素数组,常规做法是先将其转换为点云,再通过o3d.geometry.VoxelGrid.create_from_point_cloud生成体素网格,示例代码如下:
import open3d as o3d import numpy as np voxel = np.zeros((32, 32, 32), np.uint8) voxel[16, 16, 16] = 1 # 归一化并转换为点云 pcl = o3d.geometry.PointCloud() pc = np.stack(np.where(voxel == 1)).transpose((1, 0)) / (voxel.shape[0] - 1) pcl.points = o3d.utility.Vector3dVector(pc) # 从点云创建体素网格 voxel_grid = o3d.geometry.VoxelGrid.create_from_point_cloud(pcl, voxel_size=0.04) o3d.visualization.draw_geometries([voxel_grid])
直接创建VoxelGrid的可行方案
Open3D没有提供直接将NumPy数组赋值给VoxelGrid.voxels的API(你给出的无效代码中,voxel_grid.voxels需要的是o3d.utility.Vector[o3d.geometry.Voxel]类型,而非Vector3dVector,类型不匹配导致失败),但可以通过手动构造Voxel对象的方式直接生成VoxelGrid,示例代码如下:
import open3d as o3d import numpy as np # 定义二进制体素数组 voxel_array = np.zeros((32, 32, 32), np.uint8) voxel_array[16, 16, 16] = 1 voxel_array[17, 17, 17] = 1 # 初始化VoxelGrid实例 voxel_grid = o3d.geometry.VoxelGrid() # 设置体素大小和网格原点(根据体素数组尺寸调整) voxel_dim = voxel_array.shape[0] voxel_grid.voxel_size = 1.0 / (voxel_dim - 1) voxel_grid.origin = np.array([0.0, 0.0, 0.0]) # 遍历所有激活的体素,创建Voxel对象 active_voxel_indices = np.argwhere(voxel_array == 1) voxel_list = [] for idx in active_voxel_indices: # 构造Voxel,grid_index为体素的整数坐标,color可自定义 voxel = o3d.geometry.Voxel(grid_index=idx, color=[1.0, 0.0, 0.0]) voxel_list.append(voxel) # 将Voxel列表转换为Open3D所需的Vector类型并赋值 voxel_grid.voxels = o3d.utility.Vector[o3d.geometry.Voxel](voxel_list) # 可视化体素网格 o3d.visualization.draw_geometries([voxel_grid])
说明
- 该方法直接遍历体素数组中激活的位置,逐个创建
Voxel实例,跳过了点云转换的中间步骤,效率更高。 - 需要注意设置正确的
voxel_size和origin,确保体素的空间位置与需求匹配。
内容的提问来源于stack exchange,提问作者Qimin Chen
相关产品推荐
相关产品推荐

