滤波

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;
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容