PCL专栏目录及须知-CSDN博客
1.原理
即对pcl::PointT中的某个维度(如X/Y/Z)来进行滤波,该维度中超过用户设定阈值范围的点云点删除,在用户设定阈值范围点云点保留。
(1)设置需要滤波的点云属性值。
(2)判断是否在用户设定的阈值范围内,在其中的保留,不在其中的删除。
2.使用场景
需要对某一个维度滤波的场景。例如删除地面点。
如下图:
通过直通滤波器过滤掉红框内z值范围的点云。
3.注意事项
直通滤波和条件滤波类似,只是条件滤波功能比直通滤波多些。工作中能用直通滤波就用直通滤波,别老用条件滤波,直通滤波代码简单易看。
4.关键函数
(1)设置滤波的维度;注意参数为string类型的。
setFilterFieldName("z");
(2)设置阈值范围
setFilterLimits()
(3)设置是否保留过滤点;true不保留范围内的点,false保留范围内的点;
setNegative()
5.代码
#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>
#include <boost/thread/thread.hpp>
using namespace std;
int main()
{
/****************直通滤波器********************/
// 原始点云
pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZRGB>);
pcl::io::loadPCDFile("D:/code/csdn/data/bunny.pcd", *cloud); // 加载原始点云数据
// 结果点云
pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloud_filtered(new pcl::PointCloud<pcl::PointXYZRGB>);
// 直通滤波
pcl::PassThrough<pcl::PointXYZRGB> passTh; // 直通滤波器
passTh.setInputCloud(cloud); // 输入原始点云
passTh.setFilterFieldName("z"); // 直通滤波将过滤的维度,可以是pcl::PointXYZRGB中任意维度
passTh.setFilterLimits(0.0, 0.1); // 阈值范围
passTh.setNegative(true); // true不保留范围内的点,false保留范围内的点
passTh.filter(*cloud_filtered); // 结果存入新点云对象中
/****************展示********************/
boost::shared_ptr<pcl::visualization::PCLVisualizer> view_raw(new pcl::visualization::PCLVisualizer("raw"));
view_raw->addPointCloud<pcl::PointXYZRGB>(cloud, "raw cloud");
view_raw->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 1, "raw cloud");
boost::shared_ptr<pcl::visualization::PCLVisualizer> view_filtered(new pcl::visualization::PCLVisualizer("filter"));
view_filtered->addPointCloud<pcl::PointXYZRGB>(cloud_filtered, "filtered cloud");
view_filtered->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 1, "filtered cloud");
while (!view_raw->wasStopped())
{
view_raw->spinOnce(100);
boost::this_thread::sleep(boost::posix_time::microseconds(100000));
}
while (!view_filtered->wasStopped())
{
view_filtered->spinOnce(100);
boost::this_thread::sleep(boost::posix_time::microseconds(100000));
}
return 0;
}