@[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设置该坐标轴的范围。