转载: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);
}