PCL对点云进行滤波处理并进行颜色可视化

介绍

和图像滤波相似,点云的滤波处理非常重要。在获取点云数据时 ,由于设备和操作者经验环境因素带来的影响,被测物体表面性质变化和数据拼接配准操作过程的影响,点云数据中讲不可避免的出现一些噪声。在点云处理流程中滤波处理作为预处理的第一步,对后续的影响比较大,只有在滤波预处理中将噪声点 ,离群点,孔洞,数据压缩等按照后续处理定制,才能够更好的进行配准,特征提取,曲面重建,可视化等后续应用处理。

源代码

#include 
#include 
#include 
#include 
#include 

int
main()
{
    pcl::PointCloud::Ptr cloud(new pcl::PointCloud);
    pcl::PointCloud::Ptr cloud_filtered(new pcl::PointCloud);

    // 定义读取对象
    pcl::PCDReader reader;
    // 读取点云文件
    reader.read("model.pcd", *cloud);

    pcl::visualization::PCLVisualizer viewer("Head Point Before Blur");
    viewer.setBackgroundColor(0, 0, 0);

    pcl::visualization::PointCloudColorHandlerGenericField fildColor(cloud, "z");//按照z字段进行渲染
    viewer.addPointCloud(cloud, fildColor, "sample");//显示点云,其中fildColor为颜色显示
    viewer.setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 3, "sample");//设置点云大小
    while (!viewer.wasStopped())
    {
        viewer.spinOnce();
    }

    std::cerr << "Cloud before filtering: " << std::endl;
    std::cerr << *cloud << std::endl;

    // 创建滤波器,对每个点分析的临近点的个数设置为50 ,并将标准差的倍数设置为1  这意味着如果一
    //个点的距离超出了平均距离一个标准差以上,则该点被标记为离群点,并将它移除,存储起来
    pcl::StatisticalOutlierRemoval sor;   //创建滤波器对象
    sor.setInputCloud(cloud);                           //设置待滤波的点云
    sor.setMeanK(50);                               //设置在进行统计时考虑查询点临近点数
    sor.setStddevMulThresh(1.0);                      //设置判断是否为离群点的阀值
    sor.filter(*cloud_filtered);                    //存储
    pcl::visualization::PCLVisualizer viewer1("Head Point Before Blur");
    viewer1.setBackgroundColor(0, 0, 0);
    viewer1.addPointCloud(cloud_filtered, fildColor, "sample");//显示点云,其中fildColor为颜色显示
    viewer1.setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 3, "sample");//设置点云大小
    while (!viewer1.wasStopped())
    {
        viewer1.spinOnce();
    }
    std::cerr << "Cloud after filtering: " << std::endl;
    std::cerr << *cloud_filtered << std::endl;

    pcl::PCDWriter writer;
    writer.write("model_inliers.pcd", *cloud_filtered, false);

    sor.setNegative(true);
    sor.filter(*cloud_filtered);
    writer.write("model_outliers.pcd", *cloud_filtered, false);

    return (0);
}

实验结果

PCL对点云进行滤波处理并进行颜色可视化_第1张图片

你可能感兴趣的:(PCL点云处理)