[英]How to extract the bottom layer voxels using open3d?
我想提取底层体素。 例如,从犰狳中提取部分。 有谁知道这是怎么做到的吗?
这就是我找到最低体素的方法。
#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
您的解决方案几乎是正确的。 我会指出一些你应该改变的事情,然后是一种验证解决方案的方法。
给定解决方案中应该改变的事情:
voxel_center[i, 2]
访问 z 轴,因为voxel_center
是一个列表,而不是一个 numpy 数组。 您应该改为以voxel_center[i][2]
的形式访问它们。ind
,而不仅仅是在条件为真时。 或者,您可以使用enumerate
干净地克服了这个问题。因此,正确的实现如下:
#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
。
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 值最低的体素具有紫色边缘。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.