PCL学习(一):点云滤波

转载:https://blog.csdn.net/zfjBIT/article/details/91987664

PassThrough

class pcl: : PassThrough< PointT >

类 PassThrough 实现对用户给定点云某个字段的限定下,对点云进行简单的基本过滤,例如限制过滤掉点云中所有 X 字段不在某个范围内的点,该类的使用比较灵活但完全取决于用户的限定字段和对应条件 。

关键成员函数:

void setFilterFieldName (const std : :string &field_name)
设置限定字段的名称字符串 field_name ,例如”z”等。

void setFilterLimits (const double &limit_min, const double & limit_max)
设置滤波限制条件,包括最小值 limit_min 和最大值 limit_max。 该函数与 setFilterFieldName( )一起使用,点云中所有点的setFilterFieldName( )设置的字段的值未在用户所设定区间范围外的点将被删除。参数 limit_min 为允许的区间范围的最小值,默认为 DBL_ MIN , limit_ max 为允许的区间范围的最大值,默认为DB L_MAX.

void setFilterLimitsNegative (bool &!imit_negative):
设置返回滤波限制条件外的点还是内部点, limit_negative 默认值为 false,输出点云为在设定字段的设定范围内的点集,如果设置为 true 则刚好相反 。 警告:该方法将来将会被移除,用 setNegative( )函数代替。

测试示例(vs2015+ PCL1.8.1+ debug / x64)
 

#include <iostream>
#include <ctime>
#include <pcl/point_types.h>
#include <pcl/filters/passthrough.h>
 
int main (int argc, char** argv)
{ srand(time(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  = 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 = rand () / (RAND_MAX + 1.0f)-0.5;
    cloud->points[i].y = rand () / (RAND_MAX + 1.0f)-0.5;
    cloud->points[i].z = rand () / (RAND_MAX + 1.0f)-0.5;
  }
 
  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;
  
  /*
  创建直通滤器对象,设立它的参数,滤波字段名被设为 Z 轴方向,
  可接受的范围设为是(0.0, 1.0),即将点云中所有点的 Z 坐标不在该范围内的点过滤掉或保留,
  这里是过滤掉,由函数setFilterLimitsNegative设定。
  */
 
  pcl::PassThrough<pcl::PointXYZ> pass;//设置滤波器对象
  pass.setInputCloud (cloud);//设置输入点云
  pass.setFilterFieldName ("z");//设置过滤时所需要点云类型的Z字段
  pass.setFilterLimits (0.0, 1.0);//设置在过滤字段上的范围
  //pass.setFilterLimitsNegative (false);//设置保留范围内的还是过滤掉范围内的:算法内部默认false,即保留范围内的,滤掉范围外的;若设为true,则保留范围外的,滤掉范围内的;
  //pass.setNegative (true);//作用同setFilterLimitsNegative
  pass.filter (*cloud_filtered);//执行过滤,过滤结果在cloud_filtered
 
  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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值