open3D 点索引与返回点的顺序不对应

open3D point indexes do not correspond to the order of the points returned

这就是我遇到的问题。我有一些点的索引,首先,我 return 第一组 5 个点,然后,我检索第二个索引的点,但是当我使用第二个索引不是 5 个点集合中的第二个点。

此代码是我使用 open3d.geometry.KDTreeFlann.search_radius_vector_3d 方法创建索引的方式。

pcd = o3d.io.read_point_cloud('/home/antonis/Desktop/1210/cloud_no_color.ply')
pcd_tree = pcd_tree = o3d.geometry.KDTreeFlann(pcd)
[k, idx, _] = pcd_tree.search_radius_vector_3d(np.array([0, 0, 0]), 5)

现在我有了索引,我select其中的前5个做测试并检索它们对应的点:(open3d.geometry.PointCloud.select_by_index)

part_of_indexes = idx[0:5]

points = np.asarray(pcd.select_by_index(part_of_indexes).points)
print('Set of point: \n {}'.format(points))

这 return 是以下一组点:

Set of point: 
 [[-2.55539846 -1.85320044 -0.84582067]
 [-2.64479446 -1.7267524  -0.84633833]
 [-2.64432073 -1.71330798 -0.84426773]
 [-2.74227309 -1.56733859 -0.84633833]
 [-2.75684834 -1.53759551 -0.84582067]]

而当我 select 具有 part_of_indexes

第二个索引的点
second_point= np.asarray(pcd.select_by_index([part_of_indexes[1]]).points)
print('The point returned by the second index is the following: {}'.format(second_point))

我找回了一个点,它不是上一组点的第二个点,但实际上是最后一个点。

The point returned by the second index is the following: [[-2.75684834 -1.53759551 -0.84582067]]

有什么想法吗?

我将提供 2 个答案,第一个是用户 yuecideng 在 github 上给我的,所以我会在这里传递它:

select_by_index方法不会按照给定索引列表的顺序输出点,而是输出点的原始顺序。

如果你想保持输出点与索引的顺序,你可以使用 numpy 数组来做到这一点

origin_points = np.asarray(pcd.points)
points = origin_points[idx]

上面的答案按原样工作,但为了避免创建一个巨大的数组,您可以对 search_radius_vector_3d 方法返回的索引进行排序。

[k, idx, _] = pcd_tree.search_radius_vector_3d(pose, 20)
list_of_indexes = list(idx)
list_of_indexes.sort()
points = np.asarray(pcd.select_by_index(list_of_indexes).points)