Filtre passe
// 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);
Filtre Voxel
// 创建过滤对象
pcl::VoxelGrid<pcl::PCLPointCloud2> sor;
sor.setInputCloud(cloud);
sor.setLeafSize(0.01f,0.01f,0.01f);
sor.filter(*cloud_filtered);
Filtre statistique
// 创建过滤对象
pcl::StatisticalOutlierRemoval<pcl::PointXYZ> sor;
sor.setInputCloud(cloud);
sor.setMeanK(50);
sor.setStddevMulThresh(1.0);
sor.filter(*cloud_filtered);
Filtre de rayon
// 构建过滤器
pcl::RadiusOutlierRemoval<pcl::PointXYZ> outrem;
outrem.setInputCloud(cloud);
outrem.setRadiusSearch(0.8);
outrem.setMinNeighborsInRadius(2);
// apply filter
outrem.filter(*cloud_filtered);
Évidemment, dans le processus de filtrage de différents filtres, un objet est toujours créé en premier, puis les paramètres de l'objet sont définis, et enfin la fonction de filtrage est appelée pour traiter le nuage de points (le nuage de points est une zone pointée par le pointeur intelligent) .
Méthode d'appel complet:
Prenons l'exemple du filtre statistique. Remplacez le corps de la fonction dans la fonction PreProcess par le contenu du filtre statistique ci-dessus. Les autres images sont comme des chats et des tigres.
#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;
}