C++ 使用迭代最近点(ICP)时如何在点云库(PCL)中标记空数据

C++ 使用迭代最近点(ICP)时如何在点云库(PCL)中标记空数据,c++,3d,iteration,point-cloud-library,point-clouds,C++,3d,Iteration,Point Cloud Library,Point Clouds,我正在尝试使用集成在点云库(PCL)中的迭代最近点(ICP)算法对齐2组点云。我收到一份错误报告,说它找不到足够的通信点。我已经放宽了参数的条件:seteuclideanfitnesspsilon(-1.797e+5)、setmaximumitrations(40)和setransacitrations(2000),但仍然存在相同的问题。。(我还没有找到多少关于这些条件值应该是什么或如何正确对齐的信息,因此在这方面的任何帮助也将非常感谢) 我怀疑这个问题与我的云中有许多空数据点有关,我用空值(0

我正在尝试使用集成在点云库(PCL)中的迭代最近点(ICP)算法对齐2组点云。我收到一份错误报告,说它找不到足够的通信点。我已经放宽了参数的条件:seteuclideanfitnesspsilon(-1.797e+5)、setmaximumitrations(40)和setransacitrations(2000),但仍然存在相同的问题。。(我还没有找到多少关于这些条件值应该是什么或如何正确对齐的信息,因此在这方面的任何帮助也将非常感谢)

我怀疑这个问题与我的云中有许多空数据点有关,我用空值(0)标记了这些数据点。使用PCL时是否正确执行了该操作?PCL是否有任何空标准值?我显然不希望算法在尝试对齐数据集时考虑那些零点。


感谢您的帮助

如果您使用的是PCL,则无效数据的默认值不是NULL,而是NaN。因此,如果要将点标记为无效,应首先包含
文件,然后将位置设置为“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;
const float bad_point=std::numeric_limits::quiet_NaN();
如果(是否为无效点)
p、 x=p.y=p.z=bad_点;

但无论如何,配置ICP可能会很痛苦。根据您的数据,您可能需要进行更多的参数调整。

谢谢@Kourosh。它与pcl::visualization::CloudViewer配合使用,现在可视化时不显示空点。然而,在kdtree模块中,对齐显然崩溃了:断言失败:point_representation->isValid(point)&“指定给nearestKSearch的点坐标无效(NaN,Inf)”,文件:C:\BuildAgent\work\..\tags\pcl-1.6.0\kdtree\include\pcl/kdtreee/impl/kdtree\u flann.hpp,第83行。知道为什么吗?Kd Tree似乎并不期望您的点云具有无效点。尝试使用pcl::removeNaNFromPointCloud过滤点云,并将结果点云发送给ICP。请告诉我它是否有效。顺便说一句,如果正确,请将答案标记为正确,这样其他看到这一点的人可以使用答案。它有效了!非常感谢。它没有很好地对齐,但是模块现在可以工作了=)顺便说一句,你知道非常平坦的点云曲面对于PCL::ITC来说是否特别难以对齐吗?很高兴为你提供帮助:)我认为考虑到ICP算法,它们应该很难对齐。在这些情况下,使用颜色信息应该可以提供更好的估计。无论如何,如果您不必使用ICP,可以在上找到FOVIS算法的实现。它使用图像和深度,而不是点云,所以平坦的表面不会成为问题。