我正在比较两个大小不同的点云。我不想切断较大的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)
这是一张图片以说明情况是什么:
红点是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)