1.源文件
#include <iostream>
#include <pcl/console/parse.h>
#include <pcl/filters/extract_indices.h>
#include <pcl/io/pcd_io.h>
#include <pcl/point_types.h>
#include <pcl/sample_consensus/ransac.h>
#include <pcl/sample_consensus/sac_model_plane.h>
#include <pcl/sample_consensus/sac_model_sphere.h>
#include <pcl/visualization/pcl_visualizer.h>
#include <boost/thread/thread.hpp>
#include <pcl/filters/passthrough.h>
#include <pcl/segmentation/sac_segmentation.h>
#include <pcl/filters/voxel_grid.h>
#include <pcl/filters/statistical_outlier_removal.h>
#include <pcl/filters/radius_outlier_removal.h>
#include <pcl/filters/conditional_removal.h>
int main()
{
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>); // 创建POintCloud<PointXYZ>boost共享指针并进行实例化
// 打开点云文件
if (pcl::io::loadPCDFile<pcl::PointXYZ>("C:\\Users\\Administrator\\Desktop\\testHMI\\KOScanTruckServerSetup\\config\\points666.pcd", *cloud) == -1) {
return -1;
}
// 直通滤波:过滤掉不符合阈值范围的点
pcl::PointCloud<pcl::PointXYZ>::Ptr pass_cloud(new pcl::PointCloud<pcl::PointXYZ>); // 过滤后存储的点云数据
pcl::PassThrough<pcl::PointXYZ> pass; // 直通滤波器
pass.setInputCloud(cloud); // 添加原始数据
pass.setFilterFieldName("z"); // 设置过滤的名称
pass.setFilterLimits(-2964.0f, 3463.0f); // 设置过滤的最小最大值
pass.filter(*pass_cloud); // 过滤
// 体素滤波:减少点云数量,保持点云特质
pcl::PointCloud<pcl::PointXYZ>::Ptr voxel_cloud(new pcl::PointCloud<pcl::PointXYZ>); // 过滤后存储的点云数据
pcl::VoxelGrid<pcl::PointXYZ> voxel; // 体素滤波器
voxel.setInputCloud(cloud); // 添加原始数据
voxel.setLeafSize(100.0f, 100.0f, 100.0f); // 设置网格大小,网格越大点云越稀疏
voxel.filter(*voxel_cloud); // 过滤
// 统计离群滤波器:删除离群点(噪点和杂点)
pcl::PointCloud<pcl::PointXYZ>::Ptr sor_cloud(new pcl::PointCloud<pcl::PointXYZ>); // 过滤后存储的点云数据
pcl::StatisticalOutlierRemoval<pcl::PointXYZ> sor; // 统计离群滤波器
sor.setInputCloud(cloud); // 添加原始数据
sor.setMeanK(10); // 设置统计时邻近的点数
sor.setStddevMulThresh(1.0); // 设置距离阈值
sor.filter(*sor_cloud); // 过滤
// 半径滤波器:删除离群点
pcl::PointCloud<pcl::PointXYZ>::Ptr ror_cloud(new pcl::PointCloud<pcl::PointXYZ>); // 过滤后存储的点云数据
pcl::RadiusOutlierRemoval<pcl::PointXYZ> ror; // 半径滤波器
ror.setInputCloud(cloud); // 添加原始点云数据
ror.setRadiusSearch(1000); // 设置半径值
ror.setMinNeighborsInRadius(100); // 设置该半径范围内的最小点数据,小于最小点数则删除
//ror.setKeepOrganized(true); // 保持数据组织结构
ror.filter(*ror_cloud); // 过滤
// 条件滤波器:删除不符合条件的离群点
pcl::PointCloud<pcl::PointXYZ>::Ptr cr_cloud(new pcl::PointCloud<pcl::PointXYZ>); // 过滤后存储的点云数据
// 过滤条件
pcl::ConditionAnd<pcl::PointXYZ>::Ptr range_cond(new pcl::ConditionAnd<pcl::PointXYZ>);
range_cond->addComparison(pcl::FieldComparison<pcl::PointXYZ>::ConstPtr(new pcl::FieldComparison<pcl::PointXYZ>("z", pcl::ComparisonOps::GT, -2964.0f))); // z方向最小值
range_cond->addComparison(pcl::FieldComparison<pcl::PointXYZ>::ConstPtr(new pcl::FieldComparison<pcl::PointXYZ>("z", pcl::ComparisonOps::LT, 3463.0f))); // z方向最大值
range_cond->addComparison(pcl::FieldComparison<pcl::PointXYZ>::ConstPtr(new pcl::FieldComparison<pcl::PointXYZ>("x", pcl::ComparisonOps::GT, -9574.0f))); // x方向最小值
range_cond->addComparison(pcl::FieldComparison<pcl::PointXYZ>::ConstPtr(new pcl::FieldComparison<pcl::PointXYZ>("x", pcl::ComparisonOps::LT, 7805.0f))); // x方向最大值
range_cond->addComparison(pcl::FieldComparison<pcl::PointXYZ>::ConstPtr(new pcl::FieldComparison<pcl::PointXYZ>("y", pcl::ComparisonOps::GT, 11635.0f))); // y方向最小值
range_cond->addComparison(pcl::FieldComparison<pcl::PointXYZ>::ConstPtr(new pcl::FieldComparison<pcl::PointXYZ>("y", pcl::ComparisonOps::LT, 13135.0f))); // y方向最大值
pcl::ConditionalRemoval<pcl::PointXYZ> cr; // 条件滤波器
cr.setInputCloud(cloud); // 添加原始点云数据
cr.setCondition(range_cond); // 设置条件
//cr.setKeepOrganized(true); // 保持数据组织结构
cr.filter(*cr_cloud); // 过滤
pcl::io::savePCDFileASCII("result.pcd", *cr_cloud); // 写文件
// 显示
boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer(new pcl::visualization::PCLVisualizer("3D viewer"));
viewer->setBackgroundColor(0, 0, 0); // 显示的背景颜色
viewer->addPointCloud<pcl::PointXYZ>(cr_cloud, "sample cloud"); // 添加要显示的点云数据和设置标题
viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 3, "sample cloud");
viewer->addCoordinateSystem (1.0); // 添加坐标轴
viewer->initCameraParameters();
while (!viewer->wasStopped()) {
viewer->spinOnce(100);
}
return 0;
}