如何在使用迭代最近点(ICP)算法时,标记点云库(PCL)中的空数据?

4
我正在尝试使用Point Cloud Library(PCL)内置的迭代最近点(ICP)算法对两组点云进行对齐。但是,我收到了一个错误报告,说它找不到足够的对应点。我已经放宽了参数条件:setEuclideanFitnessEpsilon(-1.797e+5),setMaximumIterations(40)和setRANSACIterations(2000),但仍然遇到同样的问题。(我没有找到有关这些条件值应该如何设置才能正确对齐的信息,所以在这方面的任何帮助都将不胜感激)。
我怀疑这个问题与我的云中有许多空数据点有关,我已经用值NULL(0)标记了它们。在使用PCL时,是否正确执行此操作?是否有PCL的NULL标准值?当尝试对齐数据集时,我显然不希望算法考虑那些NULL点。
谢谢你的帮助。
1个回答

8

如果你正在使用PCL,无效数据的默认值不是NULL,而是NaN。因此,如果你想标记一个点为无效,你应该首先包含<limits>文件,然后将位置设置为'std::numeric_limits::quiet_NaN()'。通常是这样做的。

const float bad_point = std::numeric_limits<float>::quiet_NaN();
if( is_invalid_point )
    p.x = p.y = p.z = bad_point;

但是,配置ICP可能很麻烦。根据您的数据,您可能需要进行更多的参数调整。


2
谢谢@Kourosh。使用pcl :: visualization :: CloudViewer可以解决问题,当可视化时,现在不会显示NULL点。然而,对齐显然在kdtree模块中崩溃:Assertion failed: point_representation_ -> isValid(point)&&“给定NaN,Inf的无效点坐标最近搜索!”,file:C:\ BuildAgent \ work \ .... \ tags \ pcl-1.6.0 \ kdtree \ include \ pcl / kdtreee / impl / kdtree_flann.hpp,line 83. 你有什么想法? - Nicolai
2
看起来Kd-Tree不希望您的点云存在无效点。请尝试使用pcl :: removeNaNFromPointCloud过滤点云,并将结果点云发送给ICP。告诉我这是否有效。 - Kourosh
顺便说一下,如果答案正确,请将其标记为正确答案,以便其他看到这个问题的人可以使用该答案。 - Kourosh
它奏效了Kourosh!谢谢你!虽然它没有完全对齐,但模块现在可以工作了=)顺便问一下,你知道对于PCL::ITC来说,非常平坦的点云表面是否特别难以对准? - Nicolai
我也尝试了这种方法,但我得出结论:变换矩阵无法正常工作。 - Martijn van Wezel
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接