pcl点云处理-滤波器代码整合

最近,要完善点云处理功能模块,主要研究下面点云处理模块。

部分函数可以直接在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);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值