https://github.com/MNewBie/PCL-Notes/blob/master/chapter8.md

PCL中总结了集中需要进行点云滤波处理的情况,分别如下: (1) 点云数据密度不规则需要平滑。 (2) 因为遮挡等问题造成离群点需要去除。 (3) 大量数据需要进行下采样。 (4) 噪声数据需要去除。
PCL点云格式分为有序点云和无序点云

  • 针对有序点云提供了双边滤波、高斯滤波、中值滤波等
  • 针对无序点云提供了体素栅格、随机采样等。

    下边给出两个下采样类的应用实例。(VoxelGrid、UniformSampling)

  • VoxelGrid、UniformSampling

    1. #include <pcl/io/pcd_io.h>
    2. #include <pcl/point_types.h>
    3. // 包含相关头文件
    4. #include <pcl/filters/voxel_grid.h>
    5. #include <pcl/filters/uniform_sampling.h>
    6. typedef pcl::PointXYZ PointT;
    7. int main(int argc, char** argv)
    8. {
    9. // 读取点云
    10. pcl::PointCloud<PointT>::Ptr cloud(new pcl::PointCloud<PointT>);
    11. pcl::io::loadPCDFile(argv[1], *cloud);
    12. std::cout << "original cloud size : " << cloud->size() << std::endl;
    13. // 使用体素化网格(VoxelGrid)进行下采样
    14. pcl::VoxelGrid<PointT> grid; //创建滤波对象
    15. const float leaf = 0.005f;
    16. grid.setLeafSize(leaf, leaf, leaf); // 设置体素体积
    17. grid.setInputCloud(cloud); // 设置点云
    18. pcl::PointCloud<PointT>::Ptr voxelResult(new pcl::PointCloud<PointT>);
    19. grid.filter(*voxelResult); // 执行滤波,输出结果
    20. std::cout << "voxel downsample size :" << voxelResult->size() << std::endl;
    21. // 使用UniformSampling进行下采样
    22. pcl::UniformSampling<PointT> uniform_sampling;
    23. uniform_sampling.setInputCloud(cloud);
    24. double radius = 0.005f;
    25. uniform_sampling.setRadiusSearch(radius);
    26. pcl::PointCloud<PointT>::Ptr uniformResult(new pcl::PointCloud<PointT>);
    27. uniform_sampling.filter(*uniformResult);
    28. std::cout << "UniformSampling size :" << uniformResult->size() << std::endl;
    29. system("pause");
    30. return 0;
    31. }

    双边滤波PCL提供了两种方法,FastBilateralFilter 和 BilateralFilter。 FastBilateralFilter需要有序点云数据,BilateralFilter需要带强度的点云数据。

  • 双边滤波算法是通过取临近采样点和加权平均来修正当前采样点的位置,从而达到滤波效果,同时也会有选择剔除与当前采样点“差异”太大的相邻采样点,从而保持原特征的目的

  • 双边滤波

    1. #include <iostream>
    2. #include <pcl/io/pcd_io.h>
    3. #include <pcl/point_types.h>
    4. #include <pcl/filters/impl/bilateral.hpp>
    5. #include <pcl/visualization/pcl_visualizer.h>
    6. void bilateralFilter(pcl::PointCloud<pcl::PointXYZI>::Ptr &input, pcl::PointCloud<pcl::PointXYZI>::Ptr& output)
    7. {
    8. pcl::search::KdTree<pcl::PointXYZI>::Ptr tree1(new pcl::search::KdTree<pcl::PointXYZI>);
    9. // Apply the filter
    10. pcl::BilateralFilter<pcl::PointXYZI> fbf;
    11. fbf.setInputCloud(input);
    12. fbf.setSearchMethod(tree1);
    13. fbf.setStdDev(0.1);
    14. fbf.setHalfSize(0.1);
    15. fbf.filter(*output);
    16. }
    17. int main(int argc, char** argv)
    18. {
    19. pcl::PointCloud<pcl::PointXYZI>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZI>); // 需要PointXYZI
    20. pcl::PointCloud<pcl::PointXYZI>::Ptr cloud_filtered(new pcl::PointCloud<pcl::PointXYZI>);
    21. // Fill in the cloud data
    22. pcl::PCDReader reader;
    23. // Replace the path below with the path where you saved your file
    24. reader.read<pcl::PointXYZI>(argv[1], *cloud);
    25. bilateralFilter(cloud, cloud_filtered);
    26. /*pcl::visualization::PCLVisualizer viewer;
    27. viewer.addPointCloud(cloud_filtered);
    28. viewer.spin();*/
    29. return (0);
    30. }

    **

    剔除离群点

参考:http://www.pointclouds.org/documentation/tutorials/statistical_outlier.php