PCL:通过条件设置或者半径设置去除指定点云

#include 
#include 
#include 
#include 
#include 

int main(int argc, char **argv) {
//初始化点云
    pcl::PointCloud::PointXYZ>::Ptr cloud (new pcl::PointCloud::PointXYZ>);
    pcl::PointCloud::PointXYZ>::Ptr cloud_filtered  (new pcl::PointCloud::PointXYZ>);
    pcl::PCDWriter writer;
//设置点云为500个,也可以自行修改,或者直接读取PCD文件    
    cloud->width = 500;
    cloud->height = 1;
    cloud->points.resize(cloud->width * cloud->height);

    for (size_t i = 0; i < cloud->points.size(); ++i)
    {
      cloud->points[i].x = 1024 * rand() / (RAND_MAX + 1.0f);
      cloud->points[i].y = 1024 * rand() / (RAND_MAX + 1.0f);
      cloud->points[i].z = 1024 * rand() / (RAND_MAX + 1.0f);
    }
    writer.write<pcl::PointXYZ>("./original.pcd", *cloud, false);


    if (strcmp(argv[1], "-r") == 0){
    pcl::RadiusOutlierRemoval::PointXYZ> outrem;
    // build the filter
    outrem.setInputCloud(cloud);
    //设置搜索半径为0.3
    outrem.setRadiusSearch(0.3);
    //在该半径中必须最少有5个邻点,则保持在点云中
    outrem.setMinNeighborsInRadius (5);
    // apply filter
    outrem.filter (*cloud_filtered);
    writer.write<pcl::PointXYZ>("./points_outrem.pcd", *cloud_filtered, false);
  }
    else if (strcmp(argv[1], "-c") == 0)
    {
      pcl::ConditionAnd::PointXYZ>::Ptr range_cloud(new pcl::ConditionAnd::PointXYZ> ());
//设置作用域为z,取大于0且小于0.8的位置,保留在点云中,其余进行移除
      range_cloud->addComparison(pcl::FieldComparison::PointXYZ>::ConstPtr (new pcl::FieldComparison::PointXYZ>("z", pcl::ComparisonOps::GT, 0.0)));
      range_cloud->addComparison(pcl::FieldComparison::PointXYZ>::ConstPtr (new pcl::FieldComparison::PointXYZ>("z", pcl::ComparisonOps::LT, 0.8)));
      pcl::ConditionalRemoval::PointXYZ> condream;
      condream.setCondition(range_cloud);
      condream.setInputCloud(cloud);
      condream.setKeepOrganized(true);
      condream.filter(*cloud_filtered);
      writer.write<pcl::PointXYZ>("./points_condream.pcd", *cloud_filtered, false);
    }

    else{
      std::cerr << "please specify command line arg '-r' or '-c' "<< std::endl;
      exit(0);
    }
    return 0;
}

通过设置半径,蓝色点为去除的点,因为只能放平面图,立体图可以看出删除的点主要都在表面

PCL:通过条件设置或者半径设置去除指定点云_第1张图片

通过设置z的范围,绿色是保留的点云, 橙色的点云是删除的点云
PCL:通过条件设置或者半径设置去除指定点云_第2张图片

你可能感兴趣的:(SLAM)