You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否直接从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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 14:36:15