PCL—passThrough 点云直通滤波器

摘自PCL(Point Cloud Library)学习记录(2025) · 语雀


/*
 * @Description: 在PCL 中使用直通滤波器对点云进行滤波处理  https://www.cnblogs.com/li-yao7758258/p/6445831.html
 * @Author: HCQ
 * @Company(School): UCAS
 * @Email: 1756260160@qq.com
 * @Date: 2020-10-20 10:36:02
 * @LastEditTime: 2020-10-20 10:45:57
 * @FilePath: /pcl-learning/09filters滤波/1直通滤波器进行滤波处理/passthrough.cpp
 */
#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>);

    //生成并填充点云
    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);
    }

    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, 300.0);           //设置在过滤字段的范围
    // //pass.setFilterLimitsNegative(true);         //这个版本太老报错,这个要换成下边的//
    //pass.FilterIndices::setNegative(false);   //这句代码是默认的,写不写都是保留内部点//
    //pass.FilterIndices::setNegative(true);    //-删除-内部点//
    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;

    //pass.setFilterLimitsNegative(true);   //代码默认保留内部的点//


    return (0);
}

注意:这里容易混淆的是setNegative(false);

setNegative(false);   //这句代码是默认false的,即默认保留区域内部点//

设置true,则是删除区域内的点。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值