【1】直通滤波器
直通滤波器:对指定维度(X,Y,Z,BGR等)进行某一个范围滤波,可以删除这个范围内部点,也可以删除这个范围外部的点
函数:pcl::PassThroughpcl::PointXYZ pass;//实例化直通滤波器
【2】实例
// THroughPass.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#include "pch.h"
#include <iostream>
#include <iostream>
#include <ctime>
#include <pcl/point_types.h>
#include <pcl/filters/passthrough.h>
int
main222(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;
// 创建滤波器对象 直通滤波器
pcl::PassThrough<pcl::PointXYZ> pass;//实例化直通滤波器
pass.setInputCloud(cloud);//在入点云
pass.setFilterFieldName("z");//滤波的字段,即滤波的方向。可以是XYZ也可以是BGR
pass.setFilterLimits(0.0, 1.0);//滤除在z轴方向上不在0.0-0.1范围内的所有点
//pass.setFilterLimitsNegative (true);//设置保留范围内部还是范围外部 默认false为内部
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);
}