首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用open3d提取底层体素?

如何使用open3d提取底层体素?
EN

Stack Overflow用户
提问于 2022-06-08 09:08:47
回答 1查看 228关注 0票数 1

我想要提取底层的体素。例如,从鲤鱼身上提取出部分。有人知道怎么做吗?

我就是这样找到最低的体素的。

代码语言:javascript
复制
#Get voxels center coordinate
def get_voxel_center_coordinate(voxel_grid):
    voxels = voxel_grid.get_voxels()
    voxel_center = []
    
    for voxel in voxels:
        voxel_center.append(voxel_grid.get_voxel_center_coordinate(voxel.grid_index))
    
    return voxel_center

#Find lowest voxels index
def find_lowest_voxel_index(voxel_grid):
    voxels = voxel_grid.get_voxels()
    voxel_center = get_voxel_center_coordinate(voxel_grid)
    
    for i in range(0, len(voxel_center)):
        if i == 0:
            min_z = voxel_center[i, 2]
        else:
            if min_z > voxel_center[i, 2]:
                min_z = voxel_center[i, 2]
    ind = 0
    lowest_voxel_index = []
    
    for center in voxel_center:
        if center[2] == min_z:
            print(center[2])
            lowest_voxel_index.append(voxels[ind].grid_index)
            ind += 1
    
    return lowest_voxel_index
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-06-09 11:33:02

你的解决方案几乎是正确的。我将指出一些您应该更改的内容,然后给出验证解决方案的方法。

解决方案

在给定的解决方案中应该更改的内容:

  1. 您不能通过voxel_center[i, 2]访问z轴,因为voxel_center是一个列表,而不是numpy数组。相反,您应该访问它们,因为voxel_center[i][2].
  2. You应该在每个循环中增加ind,而不仅仅是在条件为真时。或者,您可以使用enumerate来彻底克服这种情况.

因此,正确的实施如下:

代码语言:javascript
复制
#Get voxels center coordinate
def get_voxel_center_coordinate(voxel_grid):
    voxels = voxel_grid.get_voxels()
    voxel_center = []
    
    for voxel in voxels:
        voxel_center.append(voxel_grid.get_voxel_center_coordinate(voxel.grid_index))
    
    return voxel_center

#Find lowest voxels index
def find_lowest_voxel_index(voxel_grid):
    voxels = voxel_grid.get_voxels()
    voxel_center = get_voxel_center_coordinate(voxel_grid)
    
    for i in range(0, len(voxel_center)):
        if i == 0:
            min_z = voxel_center[i][2]
        else:
            if min_z > voxel_center[i][2]:
                min_z = voxel_center[i][2]
    ind = 0
    lowest_voxel_index = []
    
    for center in voxel_center:
        if center[2] == min_z:
            print(center[2])
            lowest_voxel_index.append(voxels[ind].grid_index)
        ind += 1
    
    return lowest_voxel_index

验证

要验证解决方案,您可能需要可视化结果。但是,VoxelGrid没有允许用户改变特定体素颜色的任何方法。因此,您可以考虑创建额外的网格来可视化过滤后的体素。由于VoxelGrid提供了get_voxel_bounding_points,所以可以使用这些点来创建AxisAlignedBoundingBox

代码语言:javascript
复制
lowest_index = find_lowest_voxel_index(voxel_grid)  # this uses your solution after modifications

bounding_box = []
for i in lowest_index:
    bb = o3d.geometry.AxisAlignedBoundingBox.create_from_points(voxel_grid.get_voxel_bounding_points(i))
    bb.color = np.array([1,0,1])  # feel free to choose any other color
    bounding_box.append(bb)


axes = o3d.geometry.TriangleMesh.create_coordinate_frame(origin=np.array([100,100,100]), size=100)  # in order to be sure of the direction

o3d.visualization.draw_geometries([voxel_grid, *bounding_box, axes])

这是如何运行这段代码上的墨迹网格。请注意,我添加了坐标框来确定方向。蓝色箭头指向+z。z值最低的体素有紫色的边。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72542991

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档