ICP的保证,内部指标

Fan*_*Fox 10 c++ algorithm machine-learning nearest-neighbor

所以我有一个已经编写的迭代最近点(ICP)算法,它将模型拟合到点云.对于那些不知道ICP的人来说,快速教程是一个简单的算法,它适合模型的点,最终在模型和点之间提供均匀的变换矩阵.

这是一个快速图片教程.

步骤1.在模型集中找到与数据集最近的点:

第2步:使用一堆有趣的数学(有时基于渐变下降或SVD)将云拉得更近并重复直到形成一个姿势:

![图2] [2]

现在这一点很简单并且有效,我想要帮助的是: 我如何判断我的姿势是否合适?

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

  1. ICP算法中有多少个点.也就是说,如果我几乎没有点,我认为姿势会很糟糕:

    但如果姿势实际上好呢?它可能是,即使只有几点.我不想拒绝好姿势:

图5

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

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

图6

现在我们排除了距离太远的点,因为它们将是异常值,现在这意味着我们需要一个良好的起始位置让ICP工作,但我对此感到满意.现在在上面的例子中,保证会说NO,这是一个不好的姿势,这是正确的,因为包括点与点的比例是:

2/11 < SOME_THRESHOLD
Run Code Online (Sandbox Code Playgroud)

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

并不需要是对ICP的专家来回答这个问题,我期待的好点子.利用这些要点的知识,我们如何分类它是否是一个好的姿势解决方案?

同时使用这两种解决方案是一个很好的建议,但如果你问我这是一个非常蹩脚的解决方案,非常愚蠢到只是为了达到它的门槛.

关于如何做到这一点有什么好主意?

PS.如果你想添加一些代码,请继续.我在c ++工作.

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

And*_*rei 3

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

形状比较可以使用Hausdorff 距离达到 isometry来完成,即姿势具有相同的形状,如果

d(I(actual_pose), calculated_pose) < d_threshold
Run Code Online (Sandbox Code Playgroud)

d_threshold应该从实验中找到哪里。由于 XI 的等距修改会考虑不同角度的旋转 - 在这种情况下似乎就足够了。

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

{x_y min, x_y max, x_z min, x_z max, y_z min, y_z max}
Run Code Online (Sandbox Code Playgroud)

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

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