我正在尝试将两帧中的点云合并为一个更大的点云。我将使用ICP,但我知道我需要对齐点云。我正尝试使用以下代码的PCL template_alignment
代码执行此操作:
http://pointclouds.org/documentation/tutorials/template_alignment.php
程序在加载pointcloud
后计算表面法线。它适用于代码中使用的示例数据,但对于我自己的数据,第89行的“norm_est.compute(*normals_)
”语句返回NaN
值。我在PCL库文档中读到,如果函数找不到相邻点,它将返回NaN值。这是我的问题,为什么该计划无法找到邻居点,我该怎么办呢?我使用与上述链接中的代码相同的设置进行半径搜索和其他周长进行正常估计。我的左图像和点云如下所示。我已经上传了一个彩色的pointcloud以便更好地进行可视化,但为了对齐目的,我使用的是没有RGB的点云,而我的pointcloud.ply
文件只包含xyz坐标。
答案 0 :(得分:2)
简单修复:修改该行(89) 老:
norm_est.setRadiusSearch (normal_radius_);
新:
norm_est.setKSearch(5);
这样做的目的不是查看特定大小的球体(未知数量的条目),而是查找特定数量的最近邻居。
请注意,5是一个非常随意的数字。您可以通过降低到3(最低要求)或更慢来更快,但通过增加该数字可以更准确。最好不要在那里实际丢弃一个硬编码值,因此我建议你把它管理出类似于normal_radius_之前的情况,但这应该让你现在已经过了这个问题。
其他选择:
1:计算法线后从点云中移除nan(pcl :: removeNaNFromPointCloud)
2:运行重新处理步骤,执行统计异常值删除过滤器。或者是一个彻底的最小邻居半径滤波器。这将删除邻居太少的点(在正常计算中生成nan值的那些)
3:增加正常计算的半径或执行最近邻(不是基于半径)的正常计算。