PCL对点云进行滤波处理并进行颜色可视化
介绍
和图像滤波相似,点云的滤波处理非常重要。在获取点云数据时 ,由于设备和操作者经验环境因素带来的影响,被测物体表面性质变化和数据拼接配准操作过程的影响,点云数据中讲不可避免的出现一些噪声。在点云处理流程中滤波处理作为预处理的第一步,对后续的影响比较大,只有在滤波预处理中将噪声点 ,离群点,孔洞,数据压缩等按照后续处理定制,才能够更好的进行配准,特征提取,曲面重建,可视化等后续应用处理。
源代码
#include <iostream>
#include <pcl/io/pcd_io.h>
#include <pcl/point_types.h>
#include <pcl/filters/statistical_outlier_removal.h>
#include <pcl/visualization/cloud_viewer.h>int
main()
{pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_filtered(new pcl::PointCloud<pcl::PointXYZ>);// 定义读取对象pcl::PCDReader reader;// 读取点云文件reader.read<pcl::PointXYZ>("model.pcd", *cloud);pcl::visualization::PCLVisualizer viewer("Head Point Before Blur");viewer.setBackgroundColor(0, 0, 0);pcl::visualization::PointCloudColorHandlerGenericField<pcl::PointXYZ> fildColor(cloud, "z");//按照z字段进行渲染viewer.addPointCloud<pcl::PointXYZ>(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<pcl::PointXYZ> 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<pcl::PointXYZ>(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<pcl::PointXYZ>("model_inliers.pcd", *cloud_filtered, false);sor.setNegative(true);sor.filter(*cloud_filtered);writer.write<pcl::PointXYZ>("model_outliers.pcd", *cloud_filtered, false);return (0);
}