PassThrough 实现对用户给定点云某个字段的限定下,对点云进行简单的基本过滤,例如限制过滤掉点云中所有 X 字段不在某个范围内的点,该类的使用比较灵活但完全取决于用户的限定字段和对应条件
//
// Created by wp on 20-8-4.
// 直通滤波
//#include <iostream>
#include <pcl/io/io.h>
#include <pcl/filters/passthrough.h>
#include <pcl/visualization/cloud_viewer.h>using namespace std;/*** 随机生成5个点,进行直通滤波*/
int main(int argc, char *argv[]) {srand(time(nullptr));// 0 -> 1024 | -1.0 -> 1.0pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_filterd(new pcl::PointCloud<pcl::PointXYZ>);cloud->width = 5;cloud->height = 1;cloud->points.resize(cloud->width * cloud->height);std::cout << "直通滤波之前的5个点" << std::endl;for (int i = 0; i < cloud->points.size(); ++i) {cloud->points[i].x = 1024 * rand() / (RAND_MAX + 1.0);cloud->points[i].y = 1024 * rand() / (RAND_MAX + 1.0);cloud->points[i].z = 1024 * rand() / (RAND_MAX + 1.0);printf("(%f, %f, %f)\n", cloud->points[i].x, cloud->points[i].y, cloud->points[i].z);}// 创建滤波器对象pcl::PassThrough<pcl::PointXYZ> pass;pass.setInputCloud(cloud);pass.setFilterFieldName("z"); // 要过滤的字段pass.setFilterLimits(0.0, 1.0); // 设置保留范围
// pass.setFilterLimitsNegative(true); // 默认false,如果true,保留Limits范围之外内容,取反pass.filter(*cloud_filterd); // 执行过滤,并把结果放到cloud_filterdstd::cout << "过滤后留下的点------------------------" << std::endl;for (int i = 0; i < cloud_filterd->points.size(); ++i) {printf("(%f, %f, %f)\n", cloud_filterd->points[i].x, cloud_filterd->points[i].y, cloud_filterd->points[i].z);}pcl::visualization::CloudViewer viewer("cloud_viewer");viewer.showCloud(cloud);while (!viewer.wasStopped()) {}return 0;
}
结果:
直通滤波之前的5个点
(0.493306, 0.873528, 0.286176)
(0.101162, 0.400685, -0.957464)
(-0.547003, 0.735447, -0.882646)
(0.457564, -0.168157, 0.708972)
(0.490517, -0.820627, 0.913860)
过滤后留下的点------------------------
(0.493306, 0.873528, 0.286176)
(0.457564, -0.168157, 0.708972)
(0.490517, -0.820627, 0.913860)