c++ - ICP的保证,内部指标

标签 c++ algorithm machine-learning nearest-neighbor

所以我有一个 iterative closest point (ICP) 算法,已编写并将模型拟合到点云。作为对那些不了解 ICP 的人的快速教程,ICP 是一种简单的算法,它将点拟合到模型,最终在模型和点之间提供一个齐次变换矩阵。

这是一个快速图片教程。

第 1 步。找到模型集中与您的数据集最近的点:

第 2 步:使用一系列有趣的数学(有时基于梯度下降或 SVD)将云拉近并重复直到形成一个姿势:

![图2][2]

现在这个位很简单并且可以工作,我想要帮助的是: 如何判断我的姿势是否合适?

所以目前我有两个想法,但它们有点老套:

  1. ICP 算法中有多少个点。即,如果我几乎没有适合任何点,我认为姿势会很糟糕:

    但如果姿势真的很好呢?可能是,即使只有几分。我不想拒绝好的姿势:

Figure 5

所以我们在这里看到的是,如果位置正确,低点实际上可以成为一个很好的位置。

因此,调查的另一个指标是提供的点数与使用的点数的比率。这是一个例子

Figure 6

现在我们排除太远的点,因为它们将是异常值,现在这意味着我们需要一个良好的起始位置才能使 ICP 工作,但我对此表示同意。现在在上面的例子中,保证会说不,这是一个糟糕的姿势,它是正确的,因为点数与包含点数的比率是:

2/11 < SOME_THRESHOLD

这很好,但在上面显示的三角形倒置的情况下,它会失败。它会说倒三角形很好,因为所有的点都被 ICP 使用。

不需要成为 ICP 专家才能回答这个问题,我正在寻找好的想法。使用这些点的知识,我们如何分类它是否是一个好的姿势解决方案?

串联使用这两种解决方案是一个很好的建议,但如果你问我,这是一个非常蹩脚的解决方案,非常愚蠢,只是设定阈值。

关于如何做到这一点有哪些好的想法?

附言。如果你想添加一些代码,请去做。我正在使用 C++。

PPS。有人帮我标记这个问题,我不确定它应该落在哪里。

最佳答案

一种可能的方法是通过形状和方向比较姿势。

可以使用 Hausdorff distance up to isometry 进行形状比较, 即如果

d(I(actual_pose), calculated_pose) < d_threshold

d_threshold 应该从实验中找到。作为 X 的等距修改,我会考虑不同角度的旋转 - 在这种情况下似乎就足够了。

如果姿势具有相同的形状,我们应该比较它们的方向。为了比较方向,我们可以使用稍微简化的 Freksa model .对于每个姿势,我们应该计算值

{x_y min, x_y max, x_z min, x_z max, y_z min, y_z max}

然后确保姿势的相应值之间的每个差异都不会破坏 another_threshold,这也是从实验中得出的。

希望这是有道理的,或者至少您可以从中得出对您的目的有用的东西。

关于c++ - ICP的保证,内部指标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13597648/

相关文章:

c++ - 范围和封装有什么区别? (C++)

c++ - 在函数中使用数组 - C

c++ - void *a = &a 如何合法?

java - Collections.binarySearch() 与 List indexOf()

tensorflow - 如何修复图像识别中的错误猜测

c++ - 在C++中使用<string,string>或<string,char>映射而不是<char,char>

最大化带约束的矩形拟合所需的算法

sql - 在邻接表模型中克隆树的数据库表示的最有效方法

R:训练数据集的 k 折交叉验证

python - 为什么我的神经网络成本不断增加?