PCL入门系列 —— PassThrough 直通滤波、点云裁剪

PCL入门系列 —— PassThrough 直通滤波、点云裁剪


前言

随着工业自动化、智能化的不断推进,机器视觉(2D/3D)在工业领域的应用和重要程度也同步激增(识别、定位、抓取、测量,缺陷检测等),而针对不同作业场景进行解决方案设计时,通常会借助PCL、OpenCV、Eigen等简单方便的开源算法库进行方案的快速验证和迭代以满足作业场景下的目标需求。

为了让对工业机器视觉方向感兴趣的同学能够少走一些弯路,故推出了此一系列简易入门教程示例,让初次使用者能够最简单直观地感受到当前所用算法模块的执行效果。

后续会逐步扩增与工业机器视觉相关的一些其它内容,如:

项目案例剖析场景数据分析基础算法模块相机评测 等;

如有兴趣可加入群聊(若入群二维码被屏蔽,则可以通过Q群(1032861997)或评论、私信博主“群聊”,邀请入群),与同道同学及圈内同行一起交流讨论。

在这里插入图片描述


程序说明

展示 PassThrough 直通滤波器效果;

输出结果

在这里插入图片描述

代码示例

/*
 * @File: pass_through.cpp
 * @Brief: pcl course
 * @Description: 展示PassThrough直通滤波器效果
 * @Version: 0.0.1
 * @Author: MuYv
 */
#include <iostream>
#include <string>
#include <pcl/point_types.h>
#include <pcl/point_cloud.h>
#include <pcl/io/pcd_io.h>
#include <pcl/filters/passthrough.h>
#include <pcl/visualization/pcl_visualizer.h>



int main(int argc, char** argv){
    if(argc != 2){
        std::cout<<"Usage: exec cloud_file_path"<<std::endl;
        return -1;
    }

    // ../clouds/cabinet/cabinet_color_cloud.pcd
    const std::string kCloudFilePath = argv[1]; 

    // 定义变量
    pcl::PointCloud<pcl::PointXYZRGB>::Ptr \
                cloud_src(new pcl::PointCloud<pcl::PointXYZRGB>());
    pcl::PointCloud<pcl::PointXYZRGB>::Ptr \
                cloud_filtered(new pcl::PointCloud<pcl::PointXYZRGB>());

    // 成功返回0,失败返回-1
    if(-1 == pcl::io::loadPCDFile(kCloudFilePath,*cloud_src)){
        std::cout<<"load pcd file failed. please check it."<<std::endl;
        return -2;
    }

    // 创建直通滤波(模板)类对象,点数据类型为 pcl::PointXYZRGB
    pcl::PassThrough<pcl::PointXYZRGB> pt;
    // 设置输入点云,注意:此处传入的是点云类对象的智能指针
    pt.setInputCloud(cloud_src);
    // 设置通道名称 x/y/z
    pt.setFilterFieldName("z");
    // 设置当前裁剪通道的最值区间,默认保留区间内的数据
    pt.setFilterLimits(0.0f,2.5f);
    // 是否对区间范围取反,即保留区间外的数据
    pt.setFilterLimitsNegative(false);
    // 执行过滤,并带出处理后的点云数据,注意:此处传入的是点云类对象
    pt.filter(*cloud_filtered);

    // 创建可视化对象
    pcl::visualization::PCLVisualizer viewer("viewer");

    // 将当前窗口,拆分成横向的2个可视化窗口,以viewport区分(v1/v2)
    int v1; 
    int v2;
    //窗口参数分别对应 x_min, y_min, x_max, y_max, viewport
    viewer.createViewPort(0.0, 0.0, 0.5, 1.0, v1);  
    viewer.createViewPort(0.5, 0.0, 1.0, 1.0, v2);

    // 添加2d文字标签
    viewer.addText("v1", 10,10, 20, 1,0,0, "viewport_v1", v1);
    viewer.addText("v2", 10,10, 20, 0,1,0, "viewport_v2", v2);

    // 添加坐标系
    viewer.addCoordinateSystem(0.5);    // 单位:m

    // 设置可视化窗口背景色
    viewer.setBackgroundColor(0.2,0.2,0.2);     // r,g,b  0~1之间

    // 向v1窗口中添加点云
    viewer.addPointCloud(cloud_src,"cloud_src",v1);
    // 根据点云id,设置点云可视化属性,此处将可视化窗口中的点大小调整为2级
    viewer.setPointCloudRenderingProperties \
            (pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 2, "cloud_src");

    // 向v2窗口中添加点云
    viewer.addPointCloud(cloud_filtered,"cloud_filtered",v2);
    // 根据点云id,设置点云可视化属性,此处将可视化窗口中的点大小调整为2级
    viewer.setPointCloudRenderingProperties \ 
        (pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 2, "cloud_filtered");

    // 关闭窗口则退出
    while(!viewer.wasStopped()){
        viewer.spinOnce(100);
        boost::this_thread::sleep(boost::posix_time::microseconds(100000));
    }

    return 0;
}

总结

通过直通滤波可以将点云数据按照轴向的范围尺度进行裁剪,剔除无关区域,常用于离线点云处理或场景变动较小的在线流程中;


注:部分测试所用点云数据来源于网络,如有侵权,请联系博主删除,谢谢。

### PCL库中直通滤波的使用方法及实现方式 #### 1. 直通滤波简介 直通滤波PCL(Point Cloud Library)中的一种点云处理方法,用于裁剪点云数据的特定范围。通过设置某一坐标轴(如X、Y或Z轴)上的过滤范围,直通滤波器可以保留或去除指定范围内的点云数据[^2]。 #### 2. 直通滤波的作用 直通滤波的主要作用是对点云数据进行裁剪和过滤,从而聚焦于感兴趣的区域。例如,在三维空间中,用户可以通过设置X、Y或Z轴的范围来保留或去除特定区域的点云数据[^1]。 #### 3. 直通滤波的实现方式 以下是基于C++语言的直通滤波实现示例,展示了如何对点云数据进行范围筛选: ```cpp #include <pcl/io/pcd_io.h> #include <pcl/filters/passthrough.h> #include <pcl/point_types.h> // 定义直通滤波函数 pcl::PointCloud<pcl::PointXYZ>::Ptr passThroughFilter( pcl::PointCloud<pcl::PointXYZ>::Ptr cloud, const std::string& axis, float min_limit, float max_limit) { pcl::PassThrough<pcl::PointXYZ> pass; // 创建直通滤波器对象 pass.setInputCloud(cloud); // 设置输入点云 pass.setFilterFieldName(axis); // 设置要过滤的坐标轴("x"、"y" 或 "z") pass.setFilterLimits(min_limit, max_limit); // 设置过滤范围 pcl::PointCloud<pcl::PointXYZ>::Ptr filtered_cloud(new pcl::PointCloud<pcl::PointXYZ>); pass.filter(*filtered_cloud); // 应用滤波器 return filtered_cloud; // 返回过滤后的点云 } ``` #### 4. 参数说明 - **`setInputCloud(cloud)`**:设置输入点云数据。 - **`setFilterFieldName(axis)`**:指定过滤的坐标轴("x"、"y"或"z")[^3]。 - **`setFilterLimits(min_limit, max_limit)`**:定义过滤范围,保留范围内的点云数据[^4]。 - **`setFilterLimitsNegative(bool)`**:决定是否反转过滤结果(默认为`false`,即保留范围内点;设置为`true`时,保留范围外点)[^3]。 #### 5. 示例代码 以下是一个完整的直通滤波应用示例,展示如何从输入点云中提取Z轴在0.5到1.5范围内的点云数据: ```cpp #include <pcl/io/pcd_io.h> #include <pcl/filters/passthrough.h> #include <pcl/point_types.h> int main() { pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>); pcl::io::loadPCDFile<pcl::PointXYZ>("input_cloud.pcd", *cloud); // 加载点云文件 pcl::PassThrough<pcl::PointXYZ> pass; pass.setInputCloud(cloud); pass.setFilterFieldName("z"); // 设置过滤轴为Z轴 pass.setFilterLimits(0.5, 1.5); // 设置Z轴范围 [0.5, 1.5] pcl::PointCloud<pcl::PointXYZ>::Ptr filtered_cloud(new pcl::PointCloud<pcl::PointXYZ>); pass.filter(*filtered_cloud); // 执行滤波 pcl::io::savePCDFile("filtered_cloud.pcd", *filtered_cloud); // 保存过滤后的点云 return 0; } ``` #### 6. 注意事项 - 确保点云数据的单位与过滤范围一致(通常为米)。 - 如果需要对多个轴进行过滤,可以串联多个直通滤波器[^2]。 - 对于彩色点云,需使用`pcl::PointXYZRGB`类型替代`pcl::PointXYZ`[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值