pcl离群点删除 方法2

来源:互联网 发布:php 执行shell命令 编辑:程序博客网 时间:2024/04/30 05:34

使用ConditionalRemoval或RadiusOutlierRemoval移除离群点
原理 http://www.pclcn.org/study/shownews.php?lang=cn&id=73

#include <iostream>#include <pcl/point_types.h>#include <pcl/filters/radius_outlier_removal.h>#include <pcl/filters/conditional_removal.h>intmain(int argc, char** argv){    if (argc != 2)    {        std::cerr << "please specify command line arg '-r' or '-c'" << std::endl;        exit(0);    }    pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);    pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_filtered(new pcl::PointCloud<pcl::PointXYZ>);    // 填入点云数据    cloud->width = 10;    cloud->height = 1;    cloud->points.resize(cloud->width * cloud->height);    for (size_t i = 0; i < cloud->points.size(); ++i)    {        cloud->points[i].x =  rand() / (RAND_MAX + 1.0f);        cloud->points[i].y =  rand() / (RAND_MAX + 1.0f);        cloud->points[i].z =  rand() / (RAND_MAX + 1.0f);    }    cloud->points[0].z = 2.0;    cloud->points[3].z = -2.0;    cloud->points[6].z = 4.0;    if (strcmp(argv[1], "-r") == 0){        pcl::RadiusOutlierRemoval<pcl::PointXYZ> outrem;        // 创建滤波器        outrem.setInputCloud(cloud);        outrem.setRadiusSearch(0.8);        outrem.setMinNeighborsInRadius(2);        // 应用滤波器        outrem.filter(*cloud_filtered);    }    else if (strcmp(argv[1], "-c") == 0){        // 创建环境        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, 0.0)));//此方法只保留z在0.8-2之间的点云        range_cond->addComparison(pcl::FieldComparison<pcl::PointXYZ>::ConstPtr(new            pcl::FieldComparison<pcl::PointXYZ>("z", pcl::ComparisonOps::LT, 0.8)));        // 创建滤波器        pcl::ConditionalRemoval<pcl::PointXYZ> condrem;        condrem.setCondition(range_cond);        condrem.setInputCloud(cloud);        condrem.setKeepOrganized(true);        // 应用滤波器        condrem.filter(*cloud_filtered);    }    else{        std::cerr << "please specify command line arg '-r' or '-c'" << std::endl;        exit(0);    }    std::cerr << "Cloud before filtering: " << std::endl;    for (size_t i = 0; i < cloud->points.size(); ++i)        std::cerr << "    " << cloud->points[i].x << " "        << cloud->points[i].y << " "        << cloud->points[i].z << std::endl;    // 显示滤波后的点云    std::cerr << "Cloud after filtering: " << std::endl;    for (size_t i = 0; i < cloud_filtered->points.size(); ++i)        std::cerr << "    " << cloud_filtered->points[i].x << " "        << cloud_filtered->points[i].y << " "        << cloud_filtered->points[i].z << std::endl;    return (0);}
0 0