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:增加法线计算的半径或执行最近邻(不是基于半径)法线计算。
我正在尝试将来自两帧的点云合并为一个更大的点云。我将为此使用 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:增加法线计算的半径或执行最近邻(不是基于半径)法线计算。