直通滤波器
// 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;
}