可以直接从numpy二进制数组创建o3d.geometry.VoxelGrid吗?

gg58donl  于 2023-08-05  发布在  其他
关注(0)|答案(1)|浏览(130)

在open3D中,我们可以通过以下方式创建点云

import open3d as o3d
import numpy as np
pcl = o3d.geometry.PointCloud()
pcl.points = o3d.utility.Vector3dVector(np.random.randn(500,3))
o3d.visualization.draw_geometries([pcl])

字符串
但是对于二进制numpy数组,例如voxel,如果我想可视化体素,我需要将其转换为点云,然后使用o3d.geometry.VoxelGrid.create_from_point_cloud将点云转换回open3D VoxelGrid

voxel = np.zeros((32, 32, 32), np.uint8)
voxel[16, 16, 16] = 1

# normalize
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])


是否有任何方法可以直接从体素创建o3d.geometry.VoxelGrid,如

### this doesn't work
voxel = np.zeros((32, 32, 32), np.uint8)
voxel[16, 16, 16] = 1

voxel_grid = o3d.geometry.VoxelGrid()
voxel_grid.voxels = o3d.utility.Vector3dVector(voxel)
o3d.visualization.draw_geometries([voxel_grid])

pgvzfuti

pgvzfuti1#

到目前为止,答案似乎是一个坚定的不,你不能。
VoxelGrid实际上并不是以你拥有的方式存储数据。底层的数据结构实际上是3d索引和Voxel对象的unordered_map。我会将其描述为稀疏表示,而您拥有数据的密集表示(将用白色和黑色像素覆盖整个域)。当你这样做时,你会引入稀疏性:np.where(voxel == 1)。它还缺少voxel_size,origin,当然还有体素颜色。
添加像create_from_dense_array这样的方法并不是不可能的,但是从我浏览代码所看到的来看,目前还没有这样的方法。
他们还可以轻松地向AddVoxel/add_voxel方法添加pybind Package 器,但这也是目前被忽视的。即使这样,它仍然需要您自己计算稀疏体素并构造o3d.geometry.Voxel对象,可能需要一些额外的实用程序辅助方法,如Vector 3dVector,但用于体素。
目前在我看来,最好的路线是通过PointCloud去像你已经做了。

相关问题