admin管理员组文章数量:1567297
作用: 过滤掉指定字段上用户定义范围空间内的点集。
原理:首先,指定字段及该字段下的取值范围;其次,遍历点云中的每个点,删除取值不在值域内的点;最后,遍历结束,留下的点即构成滤波后的点云
效果: 简单高效,适用于消除背景等操作。
关键成员函数:
void setFilterFieldName (const std : :string &field_name)
设置限定字段的名称字符串 field_name ,若输入点云类型为PointXZY, 则field_name 可以为x 或 y 或z 但务必小写。
void setFilterLimits (const double &limit_min, const double & limit_max)
设置滤波限制条件,包括最小值 limit_min 和最大值 limit_max。 该函数与 setFilterFieldName( )一起使用,点云中所有点的setFilterFieldName( )设置的字段的值未在用户所设定区间范围外的点将被删除。参数 limit_min 为允许的区间范围的最小值,默认为 DBL_ MIN , limit_ max 为允许的区间范围的最大值,默认为DB L_MAX.
void setFilterLimitsNegative (bool &!imit_negative):
设置返回滤波限制条件外的点还是内部点, limit_negative 默认值为 false,输出点云为在设定字段的设定范围内的点集,如果设置为 true 则刚好相反 。
代码展示:
#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>
using namespace std;
int main() {
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 = 20;
cloud->height = 1;
cloud->points.resize (cloud->width * cloud->height);
for (auto& point: *cloud)
{
point.x = 1024 * rand () / (RAND_MAX + 1.0f);
point.y = 1024 * rand () / (RAND_MAX + 1.0f);
point.z = 1024 * rand () / (RAND_MAX + 1.0f);
}
cout << " Cloud before filtering: " << cloud->points.size() << endl;
// 创建滤波器对象
pcl::PassThrough<pcl::PointXYZ> pass;
pass.setInputCloud(cloud);
pass.setFilterFieldName("z");//设置过滤时所需要的点云Z字段
pass.setFilterLimits(0.0, 1.0);//设置在过滤字段上的范围
pass.setNegative(true);//设置保留范围内的还是过滤掉范围内的
pass.filter(*cloud_filtered);
cout << "Cloud after filtering: " << cloud_filtered->points.size() << endl;
pcl::visualization::PCLVisualizer::Ptr view(new pcl::visualization::PCLVisualizer("ShowCloud"));
// 创建两个视口: 第一个用于显示原始点云, 第二个用于显示滤波后的点云
int v1(0);
view->createViewPort(0.0, 0.0, 0.5, 1.0, v1);
view->setBackgroundColor(0, 0, 0, v1);
view->addText("Raw point clouds", 10, 10, "v1_text", v1);
int v2(0);
view->createViewPort(0.5, 0.0, 1, 1.0, v2);
view->setBackgroundColor(0.1, 0.1, 0.1, v2);
view->addText("filtered point clouds", 10, 10, "v2_text", v2);
view->addPointCloud<pcl::PointXYZ>(cloud, "sample cloud", v1);
view->addPointCloud<pcl::PointXYZ>(cloud_filtered, "cloud_filtered", v2);
// 设置点云的渲染颜色
view->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_COLOR, 1, 0, 0, "sample cloud", v1);
view->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_COLOR, 0, 1, 0, "cloud_filtered", v2);
view->addCoordinateSystem(1.0);
view->initCameraParameters();
while (!view->wasStopped()) {
view->spinOnce(100);
}
return 0;
}
结果展示
本文标签: PCLpassthrough
版权声明:本文标题:PCL之直通滤波--PassThrough 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://www.elefans.com/dongtai/1725805187a1043939.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论