我正在比较两个大小不同的点云。我不想切断较大的pointcloud pc1中的最后一点。对于pc1中的点,我想找到pc2中最近的邻居。在pc1和pc2中使用这一点之后,不应再将其用于任何其他比较。计算从pc1到pc2的距离:从最小距离开始。同时获取pc1和pc2中的两个点,并将这些点标记为已使用(或删除)。获得下一个更高距离的下一个配对...直到使用了pc2中的所有点。返回距离列表。

这是我到目前为止尝试过的:

from sklearn.neighbors import NearestNeighbors
import numpy as np

pc1 = np.array([[-1, -1], [-2, -1], [1, 1], [2, 2], [3, 5]])
pc2 = np.array([[0, 0], [0, 0], [6,6]])

nbrs = NearestNeighbors(n_neighbors=1, algorithm='kd_tree', metric='euclidean').fit(pc2)
distances, indices = nbrs.kneighbors(pc1)


这是输出:

indices = [[0],[0],[0],[0],[2]]


但我想拥有:

indices_wanted = [[0],[1],[2]]


应该参考pc1中的点:[[-1,-1],[1,1],[3,5]]

有有效的方法吗?我的点云是3D的,每个云大约有8000个点。它应该非常快,因为我需要对具有200帧的某些“电影”中的每一帧重复此过程。
在3D中创建一些示例数据:

    pc1 = np.random.randn(8000,3)
    pc2 = np.random.randn(7990,3)


这是一张图片以说明情况是什么:
  python - 在sklearn NearestNeighbor中使用一次每个邻居-LMLPHP

红点是pc1,绿点是pc2。最终,我有了3D点。



编辑:

我不仅限于sklearn,我只是知道它非常有效。因此,KDTree也是一个选择。
我可能必须包括两个节点的最大距离,以加快此方法的速度。我正在使用的多维数据集大小为4m(在运行邻居搜索之前,我已经删除了距离太远的点)



问题:
@ user2874583提供的代码对于一组8000点的耗时约为0.8s。那太慢了。我需要少于0.2秒。有没有一种方法可以利用该结构来修改代码:外部没有任何点的多维数据集?也许对数组进行排序?

最佳答案

您可以使用scipy库计算到点之间的距离。

from scipy.spatial.distance import cdist

def closest_node_index(node, nodes):
    index = cdist([node], nodes).argmin()
    return index

final = []
for arr in pc2:
    i = closest_node_index(arr, pc1)
    final.append(pc1[i])
    pc1 = np.delete(pc1, i, axis=0)

10-08 16:55