所以我已经编写了一个iterative closest point(ICP)算法,它将模型适用于点云。对于那些不知道ICP的人来说,快速教程是一个简单的算法,它适合模型,最终在模型和点之间提供同质变换矩阵。
这是一个快速图片教程。
步骤1.在模型集中找到与数据集最近的点:
步骤2:使用一堆有趣的数学(有时基于渐变下降或SVD)将云拉得更近并重复,直到形成一个姿势:
![图2] [2]
现在这一点很简单且有效,我想要帮助的是: 如何判断我的姿势是否合适?
所以目前我有两个想法,但它们有点像hacky:
ICP算法中有多少个点。也就是说,如果我几乎没有点,我认为姿势会很糟糕:
但如果姿势真的很好怎么办?它可能是,即使只有几点。我不想拒绝好姿势:
所以我们在这里看到的是,如果他们在正确的位置,低点实际上可以成为一个非常好的位置。
因此调查的另一个指标是提供的点与使用点的比率。这是一个例子
现在我们排除距离太远的点,因为它们将是异常值,现在这意味着我们需要一个良好的起始位置让ICP工作,但我对此感到满意。现在在上面的例子中,保证会说不,这是一个糟糕的姿势,这是正确的,因为包括点与点的比率是:
2/11 < SOME_THRESHOLD
这很好,但在上面显示的三角形颠倒的情况下会失败。它会说倒三角形是好的,因为所有的点都被ICP使用。
你不需要成为ICP的专家来回答这个问题,我正在寻找好的想法。利用这些要点的知识,我们如何分类它是否是一个好的姿势解决方案?
同时使用这两种解决方案是一个很好的建议,但是如果你问我这是一个相当蹩脚的解决方案,非常愚蠢到只能达到它的门槛。
如何做到这一点有什么好主意?
PS。如果你想添加一些代码,请继续。我在c ++工作。
PPS。有人帮我标记这个问题,我不确定它应该落在哪里。
答案 0 :(得分:3)
一种可能的方法可能是根据形状和方向比较姿势。
可以使用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
,也来自实验。
希望这是有道理的,或者至少你可以从中得出一些有用的东西。
答案 1 :(得分:1)
ICP尝试最小化点云与模型之间的距离,是吗?根据执行后的实际距离来评估它是否最有意义?
我假设它试图最小化您尝试拟合的每个点与最近的模型点之间的平方距离之和。因此,如果您需要质量指标,为什么不将该总和归一化,除以它拟合的点数。是的,异常值会稍微扰乱它,但它们也会在某种程度上破坏你的适应性。
似乎你能提出的任何计算都提供了比ICP最小化的更多洞察力,它将更有用地融入算法本身,因此它也可以最小化。 =)
<强>更新强>
我想我对算法并不十分了解。它似乎迭代地选择一个点的子集,转换它们以最小化错误,然后重复这两个步骤?在这种情况下,您的理想解决方案会选择尽可能多的点,同时尽量减少误差。
你说结合这两个术语似乎是一个弱解决方案,但它听起来像是你想要的确切描述,它捕获了算法的两个主要特征(是吗?)。使用像error + B * (selected / total)
之类的东西进行评估似乎在精神上类似于使用正则化来解决梯度下降(和类似)ML算法的过拟合问题。为B选择一个好的值需要进行一些实验。
答案 2 :(得分:1)
看看你的例子,似乎确定匹配是否好的事情之一就是积分的质量。您可以在计算指标时使用/计算加权因子吗?
例如,您可以减重共线/共面或空间上接近的点,因为它们可能定义相同的特征。这可能会让你的颠倒三角形被拒绝(因为这些点在一条直线上,并不是整体姿势的一个很好的指标)但角落情况可以,因为它们大致定义了船体。
或者,也许权重应该是关于姿势围绕点的分布情况,再次尝试确保你有良好的覆盖范围,而不是匹配小的模糊特征。