PCL之直通滤波--PassThrough

作用: 过滤掉指定字段上用户定义范围空间内的点集。

原理:首先,指定字段及该字段下的取值范围;其次,遍历点云中的每个点,删除取值不在值域内的点;最后,遍历结束,留下的点即构成滤波后的点云

效果: 简单高效,适用于消除背景等操作。

关键成员函数:

void setFilterFieldName (const std : :string &field_name)
设置限定字段的名称字符串 field_name ,若输入点云类型为PointXZY, 则field_name 可以为x 或 y 或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 则刚好相反 。

 

代码展示: 

#include <iostream>
#include <pcl/io/pcd_io.h>
#include <pcl/point_types.h>
#include <pcl/point_cloud.h>
#include <pcl/filters/passthrough.h>
#include <pcl/visualization/pcl_visualizer.h>

using namespace std;

int main() {
    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  = 20;
    cloud->height = 1;
    cloud->points.resize (cloud->width * cloud->height);
    for (auto& point: *cloud)
    {
        point.x = 1024 * rand () / (RAND_MAX + 1.0f);
        point.y = 1024 * rand () / (RAND_MAX + 1.0f);
        point.z = 1024 * rand () / (RAND_MAX + 1.0f);
    }
    cout << " Cloud before filtering: " << cloud->points.size() << endl;
    // 创建滤波器对象
    pcl::PassThrough<pcl::PointXYZ> pass;
    pass.setInputCloud(cloud);
    pass.setFilterFieldName("z");//设置过滤时所需要的点云Z字段
    pass.setFilterLimits(0.0, 1.0);//设置在过滤字段上的范围
    pass.setNegative(true);//设置保留范围内的还是过滤掉范围内的
    pass.filter(*cloud_filtered);

    cout << "Cloud after filtering: " << cloud_filtered->points.size() << endl;
    pcl::visualization::PCLVisualizer::Ptr view(new pcl::visualization::PCLVisualizer("ShowCloud"));
    // 创建两个视口: 第一个用于显示原始点云, 第二个用于显示滤波后的点云
    int v1(0);
    view->createViewPort(0.0, 0.0, 0.5, 1.0, v1);
    view->setBackgroundColor(0, 0, 0, v1);
    view->addText("Raw point clouds", 10, 10, "v1_text", v1);
    int v2(0);
    view->createViewPort(0.5, 0.0, 1, 1.0, v2);
    view->setBackgroundColor(0.1, 0.1, 0.1, v2);
    view->addText("filtered point clouds", 10, 10, "v2_text", v2);
    view->addPointCloud<pcl::PointXYZ>(cloud, "sample cloud", v1);
    view->addPointCloud<pcl::PointXYZ>(cloud_filtered, "cloud_filtered", v2);
    // 设置点云的渲染颜色
    view->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_COLOR, 1, 0, 0, "sample cloud", v1);
    view->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_COLOR, 0, 1, 0, "cloud_filtered", v2);
    view->addCoordinateSystem(1.0);
    view->initCameraParameters();
    while (!view->wasStopped()) {
        view->spinOnce(100);

    }
    return 0;
}

结果展示

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值