点云处理——去除重采样后的无效点

对彩色点云重采样后进行快速三角化时报错
这里写图片描述
控制台显示:
Assertion failed: point_representation_->isValid (point) && “Invalid (NaN, Inf) point coordinates given to nearestKSearch!”, file F:\PCLdon\pcl-master\kdtree\include\pcl/kdtree/impl/kdtree_flann.hpp, line 136

看控制台显示的错误说明,发现是由于输入点云具有无效点造成的,排查错误发现错误出现在法线估计的compute处。

对输入点云使用removeNaNFromPointCloud函数去除无效点,发现去除前后点个数不变。

对调用输入点云的is_dense成员函数,发现输出为True(即不存在无效点)。

至此该错误很诡异,使用pcl自带的无效点去除函数和判断是否具有无效点的成员函数都显示其不具有无效点,但却因具有无效点造成了法线估计上的错误。

继续排查解决:

根据控制台显示查看kdtree_flann.hpp, line 136,对应该错误的代码为:assert (point_representation_->isValid (point) && “Invalid (NaN, Inf) point coordinates given to nearestKSearch!”);

我在程序中的输入点云为PointXYZRGB类型,没有isValid成员函数,该代码中调用isValid的point_representation为PointRepresentationConstPtr类型。

重试中断程序定位出错行,定位到point_representation.h文件,定位到行!pcl_isfinite (temp[i]),其附近代码如下:

 for (int i = 0; i < nr_dimensions_; ++i)
 {
    if (!pcl_isfinite (temp[i]))
     {
         is_valid = false;
          break;
      }
  }

考虑使用其中的pcl_isfinite检测去除无效点。

首先定义输入点云类型的迭代器,分别取出成员x,y,z,rgb,使用pcl_isfinite判断,其中任意一个无效都erase该点。

最后使用该方法成功,代码片如下:

PointCloud<PointXYZRGB>::Ptr cloud(new PointCloud<PointXYZRGB>);
PointCloud<PointXYZRGB>::iterator it = cloud->points.begin();
while (it != cloud->points.end())
{
	float x, y, z, rgb;
	x = it->x;
	y = it->y;
	z = it->z;
	rgb =it->rgb;  
	//cout << "x: " << x << "  y: " << y << "  z: " << z << "  rgb: " << rgb << endl;
	if (!pcl_isfinite(x) || !pcl_isfinite(y) || !pcl_isfinite(z) || !pcl_isfinite(rgb))
	{
		it = cloud->points.erase(it);
	}
	else
		++it;
}
  • 8
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值