最近,要完善点云处理功能模块,主要研究下面点云处理模块。
部分函数可以直接在pcl官方文档查询到。
随机下采样,体素下采样、均匀采样、半径采样、范围过滤、条件过滤、统计过滤。
1.随机下采样
#include <pcl/filters/random_sample.h>
#include <pcl/point_types.h>
#include <pcl/point_cloud.h>
#include <pcl/io/pcd_io.h>
#include <pcl/io/ply_io.h>
#include <pcl/io/obj_io.h>
#include <pcl/visualization/pcl_visualizer.h>
//随机下采样
void random_filiter(pcl::PointCloud<pcl::PointXYZ>::Ptr cloud1){
pcl::RandomSample<pcl::PointXYZ> rf;
rf.setInputCloud(cloud1);
rf.setSample( 20000);
rf.setSeed(1);
rf.filter(*cloud1);
pcl::io::savePCDFileBinary("/home/wxw/filiter_cloud/random.pcd", *cloud1);
}
2.体素下采样
#include <pcl/filters/voxel_grid.h>
#include <pcl/point_types.h>
#include <pcl/point_cloud.h>
#include <pcl/io/pcd_io.h>
#include <pcl/io/ply_io.h>
#include <pcl/io/obj_io.h>
#include <pcl/visualization/pcl_visualizer
//体素下采样
void voxelgird_filiter(pcl::PointCloud<pcl::PointXYZ>::Ptr cloud1){
pcl::VoxelGrid<pcl::PointXYZ> voxel;
voxel.setInputCloud(cloud1);
voxel.setLeafSize( 0.01f, 0.01f, 0.01f);
voxel.filter(*cloud1);
pcl::io::savePCDFileBinary("/home/wxw/filiter_cloud/voxelgird.pcd", *cloud1);
}h>
3.均匀采样
#include <pcl/filters/uniform_sampling.h>
#include <pcl/point_types.h>
#include <pcl/point_cloud.h>
#include <pcl/io/pcd_io.h>
#include <pcl/io/ply_io.h>
#include <pcl/io/obj_io.h>
#include <pcl/visualization/pcl_visualizer.h>
//均匀采样
void uniform_filiter(pcl::PointCloud<pcl::PointXYZ>::Ptr cloud1){
pcl::UniformSampling<pcl::PointXYZ> form; // 创建均匀采样对象
form.setInputCloud(cloud1); //设置输入点云
form.setRadiusSearch( 0.02f); //设置半径大小,单位:m
form.filter(*cloud1); //执行滤波处理
pcl::io::savePCDFileBinary("/home/wxw/filiter_cloud/uniform.pcd", *cloud1);
}
4.半径采样
#include <pcl/filters/radius_outlier_removal.h>
#include <pcl/point_types.h>
#include <pcl/point_cloud.h>
#include <pcl/io/pcd_io.h>
#include <pcl/io/ply_io.h>
#include <pcl/io/obj_io.h>
#include <pcl/visualization/pcl_visualizer.h>
//半径去噪
void radius_filiter(pcl::PointCloud<pcl::PointXYZ>::Ptr cloud1){
voxelgird_filiter(cloud1);
pcl::RadiusOutlierRemoval<pcl::PointXYZ>radius;
radius.setInputCloud(cloud1);
radius.setRadiusSearch(0.5);
radius.setMinNeighborsInRadius(3);
radius.filter(*cloud1);
pcl::io::savePCDFileBinary("/home/wxw/filiter_cloud/radius.pcd", *cloud1);
}
5.范围过滤
#include <pcl/filters/passthrough.h>
#include <pcl/point_types.h>
#include <pcl/point_cloud.h>
#include <pcl/io/pcd_io.h>
#include <pcl/io/ply_io.h>
#include <pcl/io/obj_io.h>
#include <pcl/visualization/pcl_visualizer.h>
//直通过滤=范围过滤
void pass_filiter(pcl::PointCloud<pcl::PointXYZ>::Ptr cloud1){
// 创建直通滤波器对象
pcl::PassThrough<pcl::PointXYZ> pass;
pass.setInputCloud(cloud1);
pass.setFilterFieldName("z"); // 设置过滤轴为Z轴
pass.setFilterLimits(0.0, 1.0); // 设置过滤范围为[0.0, 1.0]
pass.filter(*cloud1); // 进行滤波
}
6.条件过滤
#include <pcl/filters/conditional_removal.h>
#include <pcl/point_types.h>
#include <pcl/point_cloud.h>
#include <pcl/io/pcd_io.h>
#include <pcl/io/ply_io.h>
#include <pcl/io/obj_io.h>
#include <pcl/visualization/pcl_visualizer.h>
//条件过滤
void condition_filiter(pcl::PointCloud<pcl::PointXYZ>::Ptr cloud1){
//创建条件
pcl::ConditionAnd<pcl::PointXYZ>::Ptr condition_add(new pcl::ConditionAnd<pcl::PointXYZ>());
condition_add->addComparison(pcl::FieldComparison<pcl::PointXYZ>::ConstPtr
(new pcl::FieldComparison<pcl::PointXYZ>("z", pcl::ComparisonOps::GT, 1000)));
// 创建ConditionalRemoval对象
pcl::ConditionalRemoval<pcl::PointXYZ> condition;
condition.setCondition(condition_add);// 设置条件对象
condition.setInputCloud(cloud1);
condition.setKeepOrganized(false);//如果设置为true,则保留点云中被滤掉的点,否则删除
condition.filter(*cloud1);
}
7.统计过滤
#include <pcl/filters/statistical_outlier_removal.h>
#include <pcl/point_types.h>
#include <pcl/point_cloud.h>
#include <pcl/io/pcd_io.h>
#include <pcl/io/ply_io.h>
#include <pcl/io/obj_io.h>
#include <pcl/visualization/pcl_visualizer.h>
//统计去噪
void statistic_filiter(pcl::PointCloud<pcl::PointXYZ>::Ptr cloud1){
pcl::StatisticalOutlierRemoval<pcl::PointXYZ> statistic;
statistic.setInputCloud(cloud1); // 设置输入点云
statistic.setMeanK(50); // 设置平均值估计所需的点数
statistic.setStddevMulThresh(1.0); // 设置标准差乘数阈值
statistic.filter(*cloud1); // 执行滤波操作
pcl::io::savePCDFileBinary("/home/wxw/filiter_cloud/statistic.pcd", *cloud1);
}