Ubuntu 18.04.06 PCL C++学习记录(九)

本文详细介绍了如何在PCL1.8.1版本中使用直通滤波器对点云数据进行Z轴范围筛选,通过CMake配置并展示了相应的C++代码实例。
摘要由CSDN通过智能技术生成

@[TOC]PCL中滤波模块的学习

学习背景

参考书籍:《点云库PCL从入门到精通》以及官方代码PCL官方代码链接,PCL版本为1.8.1,CMake版本为3.10.2

学习内容

使用直通滤波器对点云进行滤波处理

源代码及所用函数

源代码

#include<iostream>//标准输入输出头文件
#include<pcl/point_types.h>//点类型定义头文件
#include<pcl/filters/passthrough.h>//滤波头文件,提供PassThrough滤波器的功能

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.0f*rand()/(RAND_MAX+1.0f);
        cloud->points[i].y = 1024.0f*rand()/(RAND_MAX+1.0f);
        cloud->points[i].z = 1024.0f*rand()/(RAND_MAX+1.0f);

    }
    std::cout<<"滤波之前的点云"<<std::endl;
    for (size_t i = 0; i < cloud->points.size(); i++)
    {
        std::cout<<" "<<cloud->points[i].x<<" "
                      <<cloud->points[i].y<<" "
                      <<cloud->points[i].z<<" "<<std::endl;
    }
    /* -------------------------------------------------------------------------- */
    /*               创建直通滤波器的对象,设立参数,滤波字段名被设置为Z轴方向,可接受的范围为(0.0,1.0)将z轴进行滤波     */
    /* ----- 即将点云中所有点的Z轴坐标不在该范围内的点过滤掉或保留,这里是过滤掉,由函数setFilterLimitsNegative设定 ---- */
    /* -------------------------------------------------------------------------- */
    //设置滤波器对象
    pcl::PassThrough<pcl::PointXYZ> pass;
    pass.setInputCloud(cloud);//设置输入点云
    pass.setFilterFieldName("z");//设置过滤时所需点云类型的z字段
    pass.setFilterLimits(0.0,1.0);//设置在过滤字段的范围
   // pass.setFilterLimitsNegative (true);   //设置保留范围内还是过滤掉范围内
    pass.filter(*cloud_filtered);//滤波并将结果保存

    std::cout<<"滤波之后的点云"<<std::endl;
    for (size_t i = 0; i < cloud_filtered->points.size(); i++)
    {
        std::cout<<" "<<cloud_filtered->points[i].x<<" "
                      <<cloud_filtered->points[i].y<<" "
                      <<cloud_filtered->points[i].z<<" "<<std::endl;
    }
    return 0;
   
    
}

CMakeLists.txt

cmake_minimum_required(VERSION 3.1 FATAL_ERROR)#指定CMake的最低版本要求为3.1
project(passthrough)#设置项目名称
#set(CMAKE_CXX_STANDARD 11)#设置C++编译器版本为C++11
find_package(PCL 1.8 REQUIRED)#查找PCL库,要求版本为1.7或更高。
include_directories(${PCL_INCLUDE_DIRS})#将PCL库的头文件目录添加到包含路径中
link_directories(${PCL_LIBRARY_DIRS})#将PCL库的库文件目录添加到链接器搜索路径中。
add_definitions(${PCL_DEFINITIONS})#添加PCL库的编译器定义
add_executable (passthrough passthrough.cpp)#需要修改
target_link_libraries (passthrough ${PCL_LIBRARIES})#将PCL库链接到可执行文件目标。

运行结果

保存Z轴范围在0到1的点,每次生成的点都是随机的。
在这里插入图片描述

函数

pass.setFilterLimitsNegative(true)是对PassThroughFilter滤波器的一个设置,它决定了滤波器保留或移除点云数据的方式,在这个例子中,setFilterLimitsNegative(true) 表示移除z坐标在0.0到1.0范围内的点。如果设为 false,则表示只保留z坐标在0.0到1.0范围内的点,移除范围外的点。

void setFilterLimitsNegative (const bool negative);
negative: 如果设为 true,则表示移除与滤波条件匹配的索引;如果设为 false,则表示保留与滤波条件匹配的索引。
需要注意的是,在调用setFilterLimitsNegative(true)之前,你需要先使用setFilterFieldName设置要过滤的坐标轴,并使用setFilterLimits设置该坐标轴的范围。

补充内容

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值