带pcl的IterativeClosestPoint无法给出预期的结果

时间:2019-12-13 11:17:45

标签: point-cloud-library image-registration

我有两点云。为了匹配他们,我尝试向ICP注册。点云不是超级相似,但我至少要使它们非常接近。

当使用pcl库中的IterativeClosestPoint时,当我将pointCloud A用作源并将pointCloud B用作目标时,此方法有效。但是当我使用B作为源并将A作为目标时,它不起作用。在后一种情况下,它甚至增加了我两朵云之间的距离。

有人知道我在做什么错吗?更改源/目标时,为什么性能会有差异?

这是我的代码:

pcl::IterativeClosestPoint<pcl::PointXYZ, pcl::PointXYZ> icp;  
icp.setInputSource(A);
icp.setInputTarget(B);
icp.setMaximumIterations(50);
icp.setTransformationEpsilon(1e-8);
icp.setEuclideanFitnessEpsilon(1);
icp.setMaxCorrespondenceDistance(0.5); // 50cm
icp.setRANSACOutlierRejectionThreshold(0.03);
icp.align(aligned_model_cloud);

我很高兴有任何想法和建议。

编辑:这是两朵乌云 Cloud A Cloud B

更新: 我尝试使用Cloud A作为源并将Cloud A *作为目标的代码。其中Cloud A *是Cloud A的副本,在x轴上只有一个平移。我对Cloud B做了相同的实验,并且都能够成功地在icp中收敛。

但是,一旦我将Cloud B用作源并将Cloud A用作目标,它仅在移动了一点点云(甚至错误的方向)之后就不再起作用,并且会收敛。我检查了收敛准则,发现它是CONVERGENCE_CRITERIA_REL_MSE(当transfromationEpslion几乎为零时)。我尝试减少相对MSE icp.getConvergeCriteria()->setRelativeMSE(1e-15),但没有成功。在收敛后检查relativeMSE的值时,我得到的是这样的内容:-124034642对我来说毫无意义。

Update2 :我首先在没有ICP的情况下将云移动的距离非常近。这样做时,ICP可以正常工作。

更新3:我正在做FPFH,以便进行首次估算,然后进行ICP。这样做也可以。

1 个答案:

答案 0 :(得分:1)

这个问题很旧,OP已经找到了解决方案,但是我只是在万一OP有人觉得有用的情况下进行解释。

首先,ICP的工作原理是迭代估算两朵云之间的对应关系,然后最小化它们之间的总距离。 ICP使用最接近点数据关联(因此称为“迭代最接近点”)来估计对应关系。

您可能已经知道,最接近的neigbor图是有向的。就是说,如果点A以B为最接近的邻居,则点B可能没有A为最接近的邻居,因为C比A更靠近B!

enter image description here
现在ICP使用最近点数据关联来估计两个云之间的对应关系, 将A指定为源将得到与指定B 不同的对应集。这就解释了您观察到的差异。

通常,两者之间的差异很小,因此在ICP之后您可能不会注意到。但是在您的情况下,我发现您提供的两个云太不同了(一个云很大而另一个云很小),并且关系变得太不对称。

如果要确保结果对称,则只需更改数据关联步骤(PCL可能提供这样做的选项),以使最接近的点对应关系来自两个云(这只是经典方法的一种变体) ICP。有关更多信息,请参见我的other answer)。