pcl normal.compute 返回 NaN 值

pcl normal.compute returning NaN values

我正在尝试将来自两帧的点云合并为一个更大的点云。我将为此使用 ICP,但我知道我需要对点云进行每次对齐。我正在尝试使用 PCL template_alignment 代码来做到这一点:

https://pcl.readthedocs.io/projects/tutorials/en/latest/template_alignment.html#template-alignment

程序在加载后计算表面法线 pointcloud。它适用于代码中使用的示例数据,但对于我自己的数据,第 89 行的“norm_est.compute(*normals_)”语句 returns NaN 值。我在 PCL 库文档中读到,如果函数找不到相邻点,它将 return NaN 值。这是我的问题,为什么程序无法找到邻近点,我该怎么办?我使用与上述代码中相同的设置 link 进行半径搜索,其他周长用于正常 estimation.My 左图像和点云如下所示。我已经上传了彩色点云以获得更好的可视化效果,但出于对齐目的,我使用的是不带 RGB 的点云,我的 pointcloud.ply 文件仅包含 xyz 坐标。

简单修复:修改第 (89) 行 旧:

norm_est.setRadiusSearch (normal_radius_);

新:

norm_est.setKSearch(5);

它所做的不是查看特定大小的球体(未知数量的条目),而是寻找特定数量的最近邻居。

请注意,5 是一个相当随意的数字。您可以通过降低到 3(最低要求)来加快速度,或者通过增加该数字来减慢但更准确。最好不要在此处实际删除硬编码值,因此我建议您将其输出类似于 normal_radius_ 之前的方式,但这应该可以让您暂时解决这个问题。

其他选项:

1:计算法线后从点云中移除 nan (pcl::removeNaNFromPointCloud)

2:运行 一个重新处理步骤,您在其中执行统计异常值删除过滤器。或者完全最小邻居半径过滤器。这将删除邻居太少的点(这是在您的正常计算中生成 nan 值的点)

3:增加法线计算的半径或执行最近邻(不是基于半径)法线计算。