在一定距离内找到最近邻居并使用cKDTree取这些邻居的平均值

时间:2016-10-24 22:00:18

标签: python nearest-neighbor point-clouds

我使用python脚本来读取两个大的(数百万个点)点云作为数组(" A"和#34; B")。

我需要找到最近的" B" " A"中的点的邻居,但在" A"中的每个点的5厘米内。我还希望平均在#34; A中的点的半径5厘米内的邻居。"

有没有办法一次性使用cKTree,包括平均值?

2 个答案:

答案 0 :(得分:2)

我不确定你想做什么,但如果我理解正确,你可以按照以下步骤操作:

# this are just random arrays for test
A = 20 * np.random.rand(1000, 3)
B = 20 * np.random.rand(1000, 3)

为每个点云计算cKDTree

tree_A = cKDTree(a)
tree_B = cKDTree(b)

在A中找到距离B中每个点最多5个单位的点:

# faster than loop + query_ball_point
neighbourhood = tree_B.query_ball_tree(tree_A, 5)

计算所有这些点组的平均值:

means = np.zeros_like(a)
for i in range(len(neighbourhood)):
    means[i] = A[neighbourhood[i]].mean(0)

答案 1 :(得分:0)

cKDTree没有任何单位;我希望您的测量值都以单位(cm)为您所需的操作。

你是什么意思,你希望"平均邻居"?这只是5个单位球内所有邻居的平均位置吗?

根据您发布的内容,我相信您的关键操作是

for A_point in A:
    hood = B.query_ball_point(A_point, 5)

现在,只是"平均" 引擎盖中的要点。我假设你知道怎么做那部分; cKDTree没有这样的操作,因为SciPy和Python提供基类型的那些。

您可以使用 A 作为 query_ball_point 的第一个参数来执行此操作,但随后您将获得一个巨大的社区列表,也许会打破你的记忆限制。

这会让你感动吗?