一、统计滤波
#include <iostream>
#include <pcl/point_cloud.h>
#include <pcl/io/pcd_io.h>
#include <pcl/point_types.h>
#include <pcl/filters/voxel_grid.h>
#include <pcl/common/common_headers.h>
#include <pcl/visualization/cloud_viewer.h>
#include <pcl/visualization/pcl_visualizer.h>
#include <pcl/filters/extract_indices.h>
#include <pcl/filters/statistical_outlier_removal.h>
#include <pcl/registration/gicp.h>
#include <pcl/registration/icp.h>
#include <pcl/features/normal_3d.h>
#include <pcl/kdtree/kdtree_flann.h>using namespace std;int main()
{// 加载源点云pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_source(new pcl::PointCloud<pcl::PointXYZ>());pcl::io::loadPCDFile<pcl::PointXYZ>("D:\\PPCL\\room_scan1.pcd", *cloud_source);cout << "点云加载完成!" << endl;// 创建统计滤波器对象pcl::StatisticalOutlierRemoval<pcl::PointXYZ> staticOR;staticOR.setInputCloud(cloud_source);staticOR.setMeanK(50); // 设置统计平均点数,增加MeanK的值会使每个点的邻域变大staticOR.setStddevMulThresh(5); // 设置标准差倍数阈值,增加StddevMulThresh的值会减少被移除的点的数量// 进行滤波pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_filtered(new pcl::PointCloud<pcl::PointXYZ>());staticOR.filter(*cloud_filtered);//cloud_filtered 将用于存储经过离群点移除处理后的点云数据。cloud_source = cloud_filtered;cout << "点云滤波完成!" << endl;//可视化pcl::visualization::CloudViewer viewer("Viewer");viewer.showCloud(cloud_source); // 直接显示点云// 保存点云到文件pcl::io::savePCDFileBinary("D:\\PPCL\\room_scan1121.pcd", *cloud_source);cout << "滤波后点云文件已经保存" << endl;system("pause");return 0;
}
二、直通滤波,滤波掉x、y、z轴上限制范围外的点云数据
#include <iostream>
#include <pcl/point_cloud.h>
#include <pcl/io/pcd_io.h>
#include <pcl/point_types.h>
#include <pcl/common/common_headers.h>
#include <pcl/visualization/cloud_viewer.h>
#include <pcl/visualization/pcl_visualizer.h>
#include <pcl/filters/extract_indices.h>
#include <pcl/filters/statistical_outlier_removal.h>
#include <pcl/filters/passthrough.h>using namespace std;int main()
{// 加载源点云pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_source(new pcl::PointCloud<pcl::PointXYZ>());pcl::io::loadPCDFile<pcl::PointXYZ>("F:\\实验数据1022\\24.10.22\\4.pcd", *cloud_source);cout << "点云加载完成!" << endl;// 显示点云中的点的数量cout << "点云中的点的数量: " << cloud_source->size() << endl;// 设置滤波器对象pcl::PassThrough<pcl::PointXYZ> pass;pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_filtered(new pcl::PointCloud<pcl::PointXYZ>);pass.setInputCloud(cloud_source); //设置输入点云pass.setFilterFieldName("z"); //设置过滤时所需要点云类型的Z字段pass.setFilterLimits(550,650); //设置在过滤字段的范围pass.filter(*cloud_filtered);//cloud_source = cloud_filtered;//可视化pcl::visualization::CloudViewer viewer("Viewer");viewer.showCloud(cloud_filtered); // 直接显示点云// 保存点云到文件pcl::io::savePCDFileBinary("F:\\实验数据1022\\24.10.22\\444.pcd", *cloud_filtered);cout << "滤波后点云文件已经保存" << endl;cout << "点云中的点的数量: " << cloud_filtered->size() << endl;system("pause");return 0;
}