2 eightlog EightLog 于 2016.04.27 13:00 提问

PCL中粗配准上出现的问题

你好,我最近打算用SAC-IA+ICP一起配合对点云数据进行高效的配准,利用的是fpfh特征估计。
但是现在我在进行SAC-IA粗配准的时候遇到了一个问题:
问题报错为:
Assertion failed: point_representation_->isValid (point) && "Invalid (NaN, Inf) point coordinates given to radiusSearch!", file C:\BuildAgent\work\1cb946cef51fc766\tags\pcl-1.6.0\kdtree\include\pcl/kdtree/impl/kdtree_flann.hpp, line 119
这个问题让我很头疼,因为根本不知道错在哪里了。
下面是我的代码,请教大神我的问题出现在哪里了?

 #include <pcl/registration/ia_ransac.h>
#include <boost/make_shared.hpp>
#include <pcl/point_types.h>
#include <pcl/point_cloud.h>
#include <pcl/features/normal_3d.h>
#include <pcl/features/fpfh.h>
#include <pcl/search/kdtree.h>
#include <pcl/point_representation.h>
#include <pcl/io/pcd_io.h>
#include <pcl/filters/voxel_grid.h>
#include <pcl/filters/filter.h>
#include <pcl/features/normal_3d.h>
#include <pcl/registration/icp.h>
#include <pcl/registration/icp_nl.h>
#include <pcl/registration/transforms.h>
#include <pcl/visualization/pcl_visualizer.h>
using pcl::NormalEstimation;
using pcl::search::KdTree;
typedef pcl::PointXYZ PointT;
typedef pcl::PointCloud<PointT> PointCloud;

void visualize_pcd(PointCloud::Ptr pcd_src1, 
    PointCloud::Ptr pcd_src2,
    PointCloud::Ptr pcd_final)
{
    int vp_1, vp_2;
    // Create a PCLVisualizer object
    pcl::visualization::PCLVisualizer viewer("PCL Viewer");
    viewer.createViewPort (0.0, 0, 0.5, 1.0, vp_1);
    viewer.createViewPort (0.5, 0, 1.0, 1.0, vp_2);
    pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> src1_h (pcd_src1, 0, 255, 0);
    pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> src2_h (pcd_src2, 255, 0, 0);
    pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> final_h (pcd_final, 0, 255, 0);
    viewer.addPointCloud (pcd_src1, src1_h, "vp1_src1", vp_1);
    viewer.addPointCloud (pcd_src2, src2_h, "vp1_src2", vp_1);
    viewer.addPointCloud (pcd_final, final_h, "vp1_final", vp_2);

    viewer.spin();
}

int 
    main (int argc, char** argv)
{

    PointCloud::Ptr cloud_final (new PointCloud);


    PointCloud::Ptr cloud_src (new PointCloud);//将长的转成短的//读取点云数据
    pcl::io::loadPCDFile ("1.pcd",*cloud_src);
    pcl::NormalEstimation<pcl::PointXYZ,pcl::Normal> ne_src;
    ne_src.setInputCloud(cloud_src);
    pcl::search::KdTree< pcl::PointXYZ>::Ptr tree_src(new pcl::search::KdTree< pcl::PointXYZ>());
    ne_src.setSearchMethod(tree_src);
    pcl::PointCloud<pcl::Normal>::Ptr cloud_src_normals(new pcl::PointCloud< pcl::Normal>);
    ne_src.setRadiusSearch(0.03);
    //ne_src.setKSearch(20);二选一
    ne_src.compute(*cloud_src_normals);

    PointCloud::Ptr cloud_tgt (new PointCloud);
    pcl::io::loadPCDFile ("2.pcd",*cloud_tgt);
    pcl::NormalEstimation<pcl::PointXYZ,pcl::Normal> ne_tgt;
    ne_tgt.setInputCloud(cloud_tgt);
    pcl::search::KdTree< pcl::PointXYZ>::Ptr tree_tgt(new pcl::search::KdTree< pcl::PointXYZ>());
    ne_tgt.setSearchMethod(tree_tgt);
    pcl::PointCloud<pcl::Normal>::Ptr cloud_tgt_normals(new pcl::PointCloud< pcl::Normal>);
    //ne_tgt.setKSearch(20);
    ne_tgt.setRadiusSearch(0.03);
    //compute normal to cloud_normals
    ne_tgt.compute(*cloud_tgt_normals);


    //fpfh estimation
    pcl::FPFHEstimation<pcl::PointXYZ,pcl::Normal,pcl::FPFHSignature33> fpfh_src;
    fpfh_src.setInputCloud(cloud_src);
    fpfh_src.setInputNormals(cloud_src_normals);
    pcl::search::KdTree<PointT>::Ptr tree_src_fpfh (new pcl::search::KdTree<PointT>);
    fpfh_src.setSearchMethod(tree_src_fpfh);
    pcl::PointCloud<pcl::FPFHSignature33>::Ptr fpfhs_src(new pcl::PointCloud<pcl::FPFHSignature33>());
    fpfh_src.setRadiusSearch(0.05);
    //fpfh_src.setKSearch(20);
    fpfh_src.compute(*fpfhs_src);

    pcl::FPFHEstimation<pcl::PointXYZ,pcl::Normal,pcl::FPFHSignature33> fpfh_tgt;
    fpfh_tgt.setInputCloud(cloud_tgt);
    fpfh_tgt.setInputNormals(cloud_tgt_normals);
    pcl::search::KdTree<PointT>::Ptr tree_tgt_fpfh (new pcl::search::KdTree<PointT>);
    fpfh_tgt.setSearchMethod(tree_tgt_fpfh);
    pcl::PointCloud<pcl::FPFHSignature33>::Ptr fpfhs_tgt(new pcl::PointCloud<pcl::FPFHSignature33>());
    fpfh_tgt.setRadiusSearch(0.05);
    //fpfh_tgt.setKSearch(20);
    fpfh_tgt.compute(*fpfhs_tgt);

    //sample consensus initial alignment
    pcl::SampleConsensusInitialAlignment<pcl::PointXYZ, pcl::PointXYZ, pcl::FPFHSignature33> scia;
    scia.setInputCloud(cloud_src);
    scia.setInputTarget(cloud_tgt);
    scia.setSourceFeatures(fpfhs_src);
    scia.setTargetFeatures(fpfhs_tgt);
    //scia.setMinSampleDistance(1);
    //scia.setNumberOfSamples(2);
    //scia.setCorrespondenceRandomness(20);
    PointCloud::Ptr cloud_result_initial (new PointCloud);
    scia.align(*cloud_result_initial);
    visualize_pcd(cloud_src,cloud_tgt,cloud_result_initial);
    std::cout  <<"totals time is:"<<clock()<<std::endl;
return (0);
}

1个回答

liujingjing669
liujingjing669   2017.06.23 21:37

没有去除点云中的NaN点,需要在加载点云文件后再加两句去除点云中的NaN点的代码,即:
pcl::io::loadPCDFile ("1.pcd",*cloud_src); /*之后加*/
std::vector indices; //保存去除的点的索引
pcl::removeNaNFromPointCloud(*cloud_src,*cloud_src, indices); //去除点云中的NaN点

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
PCL中的点云配准(Registration)ICP算法
引言给定两个来自不同坐标系的三维数据点集,找到两个点集空间的变换关系,使得两个点集能统一到同一坐标系统中,即配准过程。配准的目标是在全局坐标框架中找到单独获取的视图的相对位置和方向,使得它们之间的相交区域完全重叠。对于从不同视图(views)获取的每一组点云数据,需要一个能够将它们对齐在一起的单一点云模型,从而可以应用后续处理步骤,如分割和对象重构。 这篇博文就基于PCL中的ICP算法,实现不同视
PCL经典代码赏析八:PCL 点云曲面重建与点云配准
· 说明 以下均为 Being_young 前辈所写,现转载过来,再加上自己的理解,重新写了一遍,方便自己日后使用 博客地址:http://blog.csdn.net/u013019296/article/ · 目录索引 最小二乘法对点云进行平滑处理 在平面模型上提取凸(凹)多边形 无需点云的快速三角化 PCL 点云配准 逐步匹配多幅点云(未实现) · 最小二乘法对点云
基于PCL的三维重建——点云配准(一)ICP算法实现
在逆向工程,计算机视觉,文物数字化等领域中,由于点云的不完整,旋转错位,平移错位等,使得要得到的完整的点云就需要对局部点云进行配准,为了得到被测物体的完整数据模型,需要确定一个合适的坐标系,将从各个视角得到的点集合并到统一的坐标系下形成一个完整的点云,然后就可以方便进行可视化的操作,这就是点云数据的配准。点云的配准有手动配准依赖仪器的配准,和自动配准,点云的自动配准技术是通过一定的算法或者统计学规
PCL系列——如何逐渐地配准一对点云
PCL系列 PCL系列——读入PCD格式文件操作 PCL系列——将点云数据写入PCD格式文件 PCL系列——拼接两个点云 PCL系列——从深度图像(RangeImage)中提取NARF关键点 PCL系列——如何可视化深度图像 PCL系列——如何使用迭代最近点法(ICP)配准 PCL系列——如何逐渐地配准一对点云 说明通过本教程,我们将会学会: 如何配准多个点云图。 配准的方法是:点云图两两配准,计算
PCL 3D-NDT算法点云配准
本节我们将介绍如何使用正态分布变换算法来确定两个大型点云(都超过100,000个点)之间的刚体变换。正态分布变换算法是一个配准算法,它应用于三维点的统计模型,使用标准最优化技术来确定两个点云间的最优的匹配,因为其在配准过程中不利用对应点的特征计算和匹配,所以时间比其他方法快,更多关于正态分布变换算法的详细的信息,请看Martin Magnusson博士的博士毕业论文“The Three-Dimens
PCL系列——如何使用迭代最近点法(ICP)配准
PCL系列 PCL系列——读入PCD格式文件操作 PCL系列——将点云数据写入PCD格式文件 PCL系列——拼接两个点云 PCL系列——从深度图像(RangeImage)中提取NARF关键点 PCL系列——如何可视化深度图像 PCL系列——如何使用迭代最近点法(ICP)配准 说明通过本教程,我们将会学会: 如何使用迭代最近点法(Iterative Closest Point)判断一个点云是否是另一个
基于PCL的三维重建——点云配准(二)SAC-IA+ICP算法的实践
此次尝试了用SAC-IA的粗配准加上ICP算法的精细配准,实验的数据是我们自已用深度相机采集的。 过程中进行了去除NAN点,下采用滤波,计算表面法线,计算FPFH,SAC-IA配准,ICP配准。 #include #include #include #include #include #include #include #include #include #include
PCL点云配准(2)
(1)正态分布变换进行配准(normal Distributions Transform) 介绍关于如何使用正态分布算法来确定两个大型点云之间的刚体变换,正态分布变换算法是一个配准算法,它应用于三维点的统计模型,使用标准最优化技术来确定两个点云间的最优匹配,因为其在配准的过程中不利用对应点的特征计算和匹配,所以时间比其他方法比较快, 对于代码的解析 /* 使用正态分布变换进行配准的实验 。其中r
PCL点云配准(1)
在逆向工程,计算机视觉,文物数字化等领域中,由于点云的不完整,旋转错位,平移错位等,使得要得到的完整的点云就需要对局部点云进行配准,为了得到被测物体的完整数据模型,需要确定一个合适的坐标系,将从各个视角得到的点集合并到统一的坐标系下形成一个完整的点云,然后就可以方便进行可视化的操作,这就是点云数据的配准。点云的配准有手动配准依赖仪器的配准,和自动配准,点云的自动配准技术是通过一定的算法或者统计学规
PCL特征点与配准(1)
关于输入一个具体的物体的点云,从场景中找出与该物体点云相匹配的,这种方法可以用来抓取指定的物体等等,具体的代码的解释如下,需要用到的一些基础的知识,在之前的博客中都有提及,其中用到的一些方法可以翻阅前面的博客,当然有问题可以关注公众号,与众多爱好者一起交流 具体的代码实现 #include #include //点云类型头文件 #include //对应表示两个实体之间的匹配(