PCL库的点云滤波小结

 

 直通滤波器

// Create the filtering object
pcl::PassThrough<pcl::PointXYZ> pass;
pass.setInputCloud(cloud);
pass.setFilterFieldName("z");
pass.setFilterLimits(0.0, 1.0);
//pass.setFilterLimitsNegative(true);
pass.filter(*cloud_filtered);

 体素滤波器

// 创建过滤对象 
  pcl::VoxelGrid<pcl::PCLPointCloud2> sor;
  sor.setInputCloud(cloud);
  sor.setLeafSize(0.01f,0.01f,0.01f);
  sor.filter(*cloud_filtered);

 统计滤波器

  // 创建过滤对象 
  pcl::StatisticalOutlierRemoval<pcl::PointXYZ> sor;
  sor.setInputCloud(cloud);
  sor.setMeanK(50);
  sor.setStddevMulThresh(1.0);
  sor.filter(*cloud_filtered);

半径滤波器

// 构建过滤器 
pcl::RadiusOutlierRemoval<pcl::PointXYZ> outrem;
outrem.setInputCloud(cloud);
outrem.setRadiusSearch(0.8);
outrem.setMinNeighborsInRadius(2);
// apply filter 
outrem.filter(*cloud_filtered);

显然,不同的滤波器在滤波过程中,总是先创建一个对象,再设置对象参数,最后调用滤波函数对点云进行处理(点云为智能指针指向的一块区域)。

完整调用方法:

以 统计滤波器为例。将PreProcess函数里的函数体换成上面统计滤波器的内容即可。其他的照猫画虎就行。

#include <string>
#include <pcl/point_types.h>
#include <pcl/io/pcd_io.h>
#include <pcl/search/organized.h>
#include <pcl/search/kdtree.h>
#include <pcl/features/normal_3d_omp.h>
#include <pcl/filters/conditional_removal.h>
#include <pcl/segmentation/extract_clusters.h>
#include <pcl/segmentation/impl/extract_clusters.hpp>
#include <pcl/features/don.h>
#include <pcl/visualization/pcl_visualizer.h>//for visualization
#include <pcl/filters/radius_outlier_removal.h>

using namespace pcl;
using namespace std;

PointCloud<PointXYZI>::Ptr PreProcess(PointCloud<PointXYZI>::Ptr cloud, float thre0, int thre1)
{
    cout<<"thre0 = "<<thre0<<endl;
    cout<<"thre1 = "<<thre1<<endl;
    pcl::RadiusOutlierRemoval<pcl::PointXYZI> outrem;
    outrem.setInputCloud(cloud);
    outrem.setRadiusSearch(thre0);
    outrem.setMinNeighborsInRadius(thre1);
    // apply filter 
    pcl::PointCloud<pcl::PointXYZI>::Ptr cloud_filtered(new PointCloud<PointXYZI>);
    outrem.filter(*cloud_filtered);
    return cloud_filtered;
}

int main(int argc, char const *argv[])
{
    float thre2 =(float)(atoi(argv[3])) / 100;//参数
    int thre3 = atoi(argv[4]);//参数
    pcl::PointCloud<pcl::PointXYZI>::Ptr sor_cloud(new pcl::PointCloud<pcl::PointXYZI>);
    pcl::io::loadPCDFile("自己的点云路径/点云名字.pcd", *Cloud);//读入点云数据

    //滤波函数
    PointCloud<PointXYZI>::Ptr result = PreProcess(sor_cloud, thre2, thre3);

    visualization::PCLVisualizer::Ptr viewer(new visualization::PCLVisualizer("Result of RegionGrowing"));

    viewer->setBackgroundColor(0, 0, 0);
    pcl::visualization::PointCloudColorHandlerGenericField<pcl::PointXYZI> fildColor(result, "z");//按照z字段进行渲染
    viewer->addPointCloud<pcl::PointXYZI>(result, fildColor, "sample");//显示点云,其中fildColor为颜色显示
    viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 2, "sample");//设置点云大小
    viewer->spin();
    return 0;
}
上一篇:点云库PCL从入门到精通随书配套资源(源码+配套软件)


下一篇:PCL 计算两片点云的均值标准差