zoukankan      html  css  js  c++  java
  • pcl之filtering

    pcl之filtering

    PassThrough filter

    In this tutorial we will learn how to perform a simple filtering along a specified dimension – that is, cut off values that are either inside or outside a given user range.

    #include <iostream>
    
    #include <pcl/point_types.h>
    #include <pcl/filters/passthrough.h>
    
    int main (int argc, char** argv)
    {
      pcl::PointCloud<pcl::PointXYZ>::Ptr cloud (new pcl::PointCloud<pcl::PointXYZ>);
      pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_filtered (new pcl::PointCloud<pcl::PointXYZ>);
    
      // Fill in the cloud data
      cloud->width  = 5;
      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);
      }
    
      // Create the filtering object
      pcl::PassThrough<pcl::PointXYZ> pass;
      pass.setInputCloud (cloud);
      pass.setFilterFieldName ("z");
      pass.setFilterLimits (0.0, 1.0);
      //pass.setFilterLimitsNegative (true);
      pass.filter (*cloud_filtered);
    
      return (0);
    }
    

    注:pass.setFilterLimitsNegative (true);是对范围取反

    VoxelGrid filter

    The VoxelGrid class that we’re about to present creates a 3D voxel grid (think about a voxel grid as a set of tiny 3D boxes in space) over the input point cloud data. Then, in each voxel (i.e., 3D box), all the points present will be approximated (i.e., downsampled) with their centroid. This approach is a bit slower than approximating them with the center of the voxel, but it represents the underlying surface more accurately.

    #include <iostream>
    #include <pcl/io/pcd_io.h>
    #include <pcl/point_types.h>
    #include <pcl/filters/voxel_grid.h>
    
    int main (int argc, char** argv)
    {
      pcl::PCLPointCloud2::Ptr cloud (new pcl::PCLPointCloud2 ());
      pcl::PCLPointCloud2::Ptr cloud_filtered (new pcl::PCLPointCloud2 ());
    
      // Fill in the cloud data
      pcl::PCDReader reader;
      // Replace the path below with the path where you saved your file
      reader.read ("table_scene_lms400.pcd", *cloud); // Remember to download the file first!
    
      // Create the filtering object
      pcl::VoxelGrid<pcl::PCLPointCloud2> sor;
      sor.setInputCloud (cloud);
      sor.setLeafSize (0.01f, 0.01f, 0.01f);
      sor.filter (*cloud_filtered);
    
      pcl::PCDWriter writer;
      writer.write ("table_scene_lms400_downsampled.pcd", *cloud_filtered, 
             Eigen::Vector4f::Zero (), Eigen::Quaternionf::Identity (), false);
    
      return (0);
    }
    

    StatisticalOutlierRemoval filter

    StatisticalOutlierRemoval filter is based on the computation of the distribution of point to neighbors distances in the input dataset. For each point, we compute the mean distance from it to all its neighbors. By assuming that the resulted distribution is Gaussian with a mean and a standard deviation, all points whose mean distances are outside an interval defined by the global distances mean and standard deviation can be considered as outliers and trimmed from the dataset.

    #include <iostream>
    
    #include <pcl/io/pcd_io.h>
    #include <pcl/point_types.h>
    #include <pcl/filters/statistical_outlier_removal.h>
    
    int main (int argc, char** argv)
    {
      pcl::PointCloud<pcl::PointXYZ>::Ptr cloud (new pcl::PointCloud<pcl::PointXYZ>);
      pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_filtered (new pcl::PointCloud<pcl::PointXYZ>);
    
      // Fill in the cloud data
      pcl::PCDReader reader;
      // Replace the path below with the path where you saved your file
      reader.read<pcl::PointXYZ> ("table_scene_lms400.pcd", *cloud);
    
      std::cerr << "Cloud before filtering: " << std::endl;
      std::cerr << *cloud << std::endl;
    
      // Create the filtering object
      pcl::StatisticalOutlierRemoval<pcl::PointXYZ> sor;
      sor.setInputCloud (cloud);
      sor.setMeanK (50);
      sor.setStddevMulThresh (1.0);
      sor.filter (*cloud_filtered);
    
      std::cerr << "Cloud after filtering: " << std::endl;
      std::cerr << *cloud_filtered << std::endl;
    
      pcl::PCDWriter writer;
      writer.write<pcl::PointXYZ> ("table_scene_lms400_inliers.pcd", *cloud_filtered, false);
    
      //sor.setNegative (true);
      //sor.filter (*cloud_filtered);
      //writer.write<pcl::PointXYZ> ("table_scene_lms400_outliers.pcd", *cloud_filtered, false);
    
      return (0);
    }
    

    注:sor.setMeanK (50); 参数为临近点的个数
    注:sor.setStddevMulThresh (1.0);为平均差系数distance_thres = means + std * StddevMulThresh;
    注:sor.setNegative (true);输出被滤掉的点云

    RadiusOutlier removal

    The user specifies a number of neighbors which every index must have within a specified radius to remain in the PointCloud.

    #include <iostream>
    #include <pcl/point_types.h>
    #include <pcl/filters/radius_outlier_removal.h>
    
    int main (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>);
    
      // Fill in the cloud data
      cloud->width  = 5;
      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);
      }
      
      pcl::RadiusOutlierRemoval<pcl::PointXYZ> outrem;
      // build the filter
      outrem.setInputCloud(cloud);
      outrem.setRadiusSearch(0.8);
      outrem.setMinNeighborsInRadius (2);
      // apply filter
      outrem.filter (*cloud_filtered);
      
      return (0);
    
  • 相关阅读:
    mysql中如何根据id,一次查询对应id的数据
    DataFrame中merge、concat、join,以及用一个data更新另一个data的方法
    pandas中drop_duplicates用法
    DataFrame中根据某字段选取重复字段数据
    金融数据处理过程中的一些小tip
    pandas中某一列的值满足一定条件就改变
    MIKE指标
    python 数据处理中的记录
    python绘制主次坐标图
    python学习笔记之四-多进程&多线程&异步非阻塞
  • 原文地址:https://www.cnblogs.com/ChrisCoder/p/9986349.html
Copyright © 2011-2022 走看看