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);
    
  • 相关阅读:
    Linux开机自动启动ORACLE设置
    Linux Oracle服务启动&停止脚本与开机自启动
    日志挖掘(logminer)
    通过Oracle补充日志,找到锁阻塞源头的SQL
    Oracle Supplemental 补全日志介绍
    修改oracle系统参数spfile导致数据库无法启动解决
    ORA-10997:another startup/shutdown operation of this instance in progress解决方法
    Oracle DataBase单实例使用ASM案例(1)--ASM基本概念
    误删除数据文件,数据库还没有关闭
    2013全国电子设计竞赛进入国赛的项目总结
  • 原文地址:https://www.cnblogs.com/ChrisCoder/p/9986349.html
Copyright © 2011-2022 走看看