【问题标题】:Find a distance between point clouds efficiently有效地查找点云之间的距离
【发布时间】:2017-06-07 21:09:40
【问题描述】:

我有 2 个点云(3D 空间中的一组点)和一个迭代算法。其中一个云(我们称之为A)在每次迭代中是恒定的,而另一个(称之为B(i))在每次迭代中略有不同(这意味着B(i+1) 与 B(i) 的区别仅在于几点)。对于来自 A 的每个点的每次迭代 i,我的算法应该找到距离 B(i) 最接近的点。

我的问题是:如何以最快的方式计算这些距离?

这是我已经尝试过的:

  • 蛮力计算(计算每对点到 AB(i) 的所有距离) - 绝对低效。
  • 在每次迭代中,为 B(i) 构建一个 KD 树,然后从 A 中找到每个点的最近点 - 比蛮力更快,但计算量仍然很大(因为我应该在每次迭代时重建 KD-tree)。

似乎我应该利用一个事实,即 B(i)B(i+1) 彼此之间仅略有不同,但我仍然不能想出一个好的解决方案。提前谢谢你。

【问题讨论】:

  • 1.云是否代表两个不相交的实体?如果是这样,您应该能够将 A 减少到其凸包上的点集。 2. 为什么不为 A 建立 k-d 树?然后,不是遍历 A 中的点并找到 B 中的最近点,而是遍历 B 中的点并找到 A 中的最近点。在 A 中找到最近点将被 k-d 树加速,并且你有只构建一次。
  • 不幸的是,这些云不是固体,它们确实相交。我不能像你建议的那样切换 A 和 B(i),因为我需要知道从 A 的每个点到 B(i) 的距离,但是在这个解决方案中,对于 A 的点,我不会得到远离 B(i)。

标签: algorithm 3d point-clouds kdtree


【解决方案1】:

对于 A 中的每个点,记录上一次迭代 B(i) 中哪个点最近。

在迭代 i+1 时,列出 B 中在 i 和 i+1 之间删除或更改的每个点,以及 B 中的每个新点。

对于 A 中的每个点:

  • 如果 B 中的前一个最近点没有被更改或删除,那么您只需要计算从 A 到 B 中最近的新点的距离(i+1),并与 B 中的前一个最近的点(i )。
  • 如果 B(i) 中之前的最近点已更改或删除,则需要计算从 A 到 B(i+1) 中任何点的最近距离

您可以使用 KD 树或任何您喜欢的空间数据结构来加快速度,但优化来自第一种情况。请注意,KD-tree 允许删除,因此您无需每次迭代都从头开始重建整个事物。

【讨论】:

  • 非常感谢这个想法,我会努力实现的!
【解决方案2】:

您还可以使用 Wasserstein 距离来测量两组点云之间的距离。在这种情况下,您认为每个点云都是从概率分布中提取的。

【讨论】:

    猜你喜欢
    • 2019-09-16
    • 2012-06-20
    • 2013-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-05
    • 2012-09-01
    相关资源
    最近更新 更多