【发布时间】:2019-12-13 11:17:45
【问题描述】:
我有两个点云。为了匹配它们,我尝试使用 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 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 这对我来说根本没有任何意义。
更新 2:我首先在没有 ICP 的情况下将云移得很近。当做这个 ICP 工作正常。
Update3:我正在做一个 FPFH 进行第一次估计,然后是 ICP。这样做也可以。
【问题讨论】:
-
如果可能,添加两个云链接
-
两朵云的密度相似吗?
-
@MarkLoyman 我不这么认为。其中一朵云来自 3d 对象文件。另一个来自 rgbd 传感器。
-
@progNewbie 我认为添加指向两个云的链接很重要。
-
@MarkLoyman 我添加了两个云 :)
标签: point-cloud-library image-registration