PCL 投影滤波器

news2024/12/23 14:32:03

目录

一、概述

1.1原理

1.2实现步骤

1.3应用场景

二、代码实现

2.1关键函数

2.1.1 投影滤波

2.1.2 可视化

2.2完整代码

三、实现效果


PCL点云算法汇总及实战案例汇总的目录地址链接:

PCL点云算法与项目实战案例汇总(长期更新)


一、概述

        投影滤波器 是将点云中的点投影到指定的模型(例如平面、圆柱或其他几何模型)上。通过投影操作,我们可以将三维点云映射到指定的二维平面上,常用于点云数据的简化和预处理。本例使用一个平面模型(如 X-Y 平面)来将点云投影到该平面上。

1.1原理

  1. 投影滤波器:通过设置模型系数(如平面方程),将输入点云的点投影到该模型上。
  2. 平面投影:通过定义平面方程 ax + by + cz + d = 0,将点云的 Z 坐标投影到 X-Y 平面上(即 Z 坐标变为 0)

1.2实现步骤

  1. 读取点云数据。
  2. 定义平面模型系数,使用 pcl::ProjectInliers 将点云投影到 X-Y 平面上。
  3. 可视化原始点云与投影后的点云。

1.3应用场景

  1. 点云投影:在需要将三维点云投影到二维平面时,可以使用投影滤波器。
  2. 数据预处理:投影操作可作为其他算法的预处理步骤,简化计算和减少维度。
  3. 点云的平面拟合和平面约束:将点云数据限制在某一平面内,便于后续处理。

二、代码实现

2.1关键函数

2.1.1 投影滤波

#include <pcl/filters/project_inliers.h>  // 引入投影滤波器的头文件

// 将点云投影到指定的平面模型
void projectPointCloudToPlane(
    pcl::PointCloud<pcl::PointXYZ>::Ptr input_cloud,
    pcl::PointCloud<pcl::PointXYZ>::Ptr output_cloud,
    pcl::ModelCoefficients::Ptr coefficients)
{
    pcl::ProjectInliers<pcl::PointXYZ> proj;
    proj.setModelType(pcl::SACMODEL_PLANE);  // 设置模型类型为平面
    proj.setInputCloud(input_cloud);  // 输入点云
    proj.setModelCoefficients(coefficients);  // 设置平面模型系数
    proj.filter(*output_cloud);  // 进行投影滤波
}

2.1.2 可视化

#include <pcl/visualization/pcl_visualizer.h>  // 引入可视化库

// 可视化原始点云和投影后的点云
void visualizePointClouds(
    pcl::PointCloud<pcl::PointXYZ>::Ptr cloud,
    pcl::PointCloud<pcl::PointXYZ>::Ptr projected_cloud)
{
    pcl::visualization::PCLVisualizer::Ptr viewer(new pcl::visualization::PCLVisualizer("Point Cloud Projection Visualization"));

    // 设置视口1,显示原始点云
    int vp_1;
    viewer->createViewPort(0.0, 0.0, 0.5, 1.0, vp_1);
    viewer->setBackgroundColor(1.0, 1.0, 1.0, vp_1);  // 白色背景
    viewer->addText("Original PointCloud", 10, 10, "vp1_text", vp_1);
    pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> cloud_color(cloud, 0, 255, 0);  // 绿色点云
    viewer->addPointCloud(cloud, cloud_color, "original_cloud", vp_1);

    // 设置视口2,显示投影后的点云
    int vp_2;
    viewer->createViewPort(0.5, 0.0, 1.0, 1.0, vp_2);
    viewer->setBackgroundColor(0.98, 0.98, 0.98, vp_2);  // 浅灰色背景
    viewer->addText("Projected PointCloud", 10, 10, "vp2_text", vp_2);
    pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> projected_color(projected_cloud, 0, 0, 255);  // 蓝色点云
    viewer->addPointCloud(projected_cloud, projected_color, "projected_cloud", vp_2);

    while (!viewer->wasStopped())
    {
        viewer->spinOnce(100);
    }
}

2.2完整代码

#include <iostream>
#include <pcl/io/pcd_io.h>  // PCD文件读取
#include <pcl/point_types.h>  // 点云类型
#include <pcl/ModelCoefficients.h>  // 模型系数
#include <pcl/filters/project_inliers.h>  // 投影滤波器
#include <pcl/visualization/pcl_visualizer.h>  // 可视化库
#include <boost/thread/thread.hpp>  // 线程库

using namespace std;



// 投影滤波器函数
void projectPointCloudToPlane(
    pcl::PointCloud<pcl::PointXYZ>::Ptr input_cloud,
    pcl::PointCloud<pcl::PointXYZ>::Ptr output_cloud,
    pcl::ModelCoefficients::Ptr coefficients)
{
    pcl::ProjectInliers<pcl::PointXYZ> proj;
    proj.setModelType(pcl::SACMODEL_PLANE);  // 设置模型类型为平面
    proj.setInputCloud(input_cloud);  // 输入点云
    proj.setModelCoefficients(coefficients);  // 设置平面模型系数
    proj.filter(*output_cloud);  // 进行投影滤波
}

// 可视化函数
void visualizePointClouds(
    pcl::PointCloud<pcl::PointXYZ>::Ptr cloud,
    pcl::PointCloud<pcl::PointXYZ>::Ptr projected_cloud)
{
    pcl::visualization::PCLVisualizer::Ptr viewer(new pcl::visualization::PCLVisualizer("Point Cloud Projection Visualization"));

    // 设置视口1,显示原始点云
    int vp_1;
    viewer->createViewPort(0.0, 0.0, 0.5, 1.0, vp_1);
    viewer->setBackgroundColor(1.0, 1.0, 1.0, vp_1);  // 白色背景
    viewer->addText("Original PointCloud", 10, 10, "vp1_text", vp_1);
    pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> cloud_color(cloud, 0, 255, 0);  // 绿色点云
    viewer->addPointCloud(cloud, cloud_color, "original_cloud", vp_1);

    // 设置视口2,显示投影后的点云
    int vp_2;
    viewer->createViewPort(0.5, 0.0, 1.0, 1.0, vp_2);
    viewer->setBackgroundColor(0.98, 0.98, 0.98, vp_2);  // 浅灰色背景
    viewer->addText("Projected PointCloud", 10, 10, "vp2_text", vp_2);
    pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> projected_color(projected_cloud, 0, 0, 255);  // 蓝色点云
    viewer->addPointCloud(projected_cloud, projected_color, "projected_cloud", vp_2);

    while (!viewer->wasStopped())
    {
        viewer->spinOnce(100);
    }
}

int main(int argc, char** argv)
{
    // 读取点云数据
    pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);
    pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_projected(new pcl::PointCloud<pcl::PointXYZ>);
    pcl::io::loadPCDFile<pcl::PointXYZ>("bunny.pcd", *cloud);  // 加载PCD文件

    // 定义平面模型系数,ax+by+cz+d=0,其中a=b=d=0,c=1表示X-Y平面
    pcl::ModelCoefficients::Ptr coefficients(new pcl::ModelCoefficients());
    coefficients->values.resize(4);
    coefficients->values[0] = coefficients->values[1] = 0;
    coefficients->values[2] = 1.0;  // Z轴
    coefficients->values[3] = 0;  // X-Y平面

    // 将点云投影到平面上
    projectPointCloudToPlane(cloud, cloud_projected, coefficients);

    // 可视化原始点云和投影后的点云
    visualizePointClouds(cloud, cloud_projected);

    return 0;
}

三、实现效果

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2182152.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java的栈帧和动态链接是什么?

在 Java 的面试过程中&#xff0c;不可避免的一个面试题那就是 JVM&#xff0c;而 JVM 的面试题中&#xff0c;有各种&#xff0c;比如在堆中会被问到的关于垃圾回收机制的相关问题&#xff0c;在栈中会被问到入栈以及出栈的过程&#xff0c;来聊一下关于栈的相关问题&#xff…

【EchoMimic整合包及教程】蚂蚁集团支付宝开源了数字人技术EchoMimic,可用于虚拟主播、视频编辑等

蚂蚁集团支付宝开源了数字人技术EchoMimic&#xff0c;可用于虚拟主播和视频编辑。EchoMimic是一个音频驱动的肖像动画生成工具&#xff0c;具有丰富的表情和流畅的动作。它支持音频驱动、姿势驱动和音频与姿势混合驱动动画&#xff0c;并提供了易于使用的WebUI和GradioUI界面。…

三品PLM系统如何提升企业产品研发效率?

三品PLM系统如何提升企业研发效率 在竞争日益激烈的市场环境中&#xff0c;企业研发效率的高低直接决定了其产品的上市速度、质量以及市场竞争力。为了应对这一挑战&#xff0c;越来越多的企业开始引入PLM系统&#xff0c;而三品PLM系统凭借其强大的功能和全面的解决方案&…

移动技术开发:音乐播放器

1 实验名称 音乐播放器 2 实验目的 掌握使用Service启动服务的方法&#xff0c;掌握BroadcastReceiver广播传递机制的实现&#xff0c;利用Activity、Service和BroadcastReceiver实现一个音乐播放器APP。 3 实验源代码 布局文件代码&#xff1a; <?xml version"1.…

yum无法使用解决办法

yum无法使用解决方法&#xff08;比较全&#xff0c;以后如果遇到别的问题还会添加&#xff09;yum无法使用解决方法&#xff08;比较全&#xff0c;以后如果遇到别的问题还会添加&#xff09; 如下&#xff0c;新装的linux虚拟机&#xff0c;yum安装wget报错 Cannot find a …

内存占用估算方法

优质博文&#xff1a;IT-BLOG-CN 通过掌握每种数据类型的大小&#xff0c;就可以更准确地预测对象和数据的内存消耗。 一、基础数据类型 Java基础数据类型结构&#xff0c;在64位系统开启指针压缩情况下的内存占用字节数&#xff1a; booleanbytecharshortintlongfloatdoub…

D23【 python 接口自动化学习】- python 基础之判断与循环

day23 match语句 学习日期&#xff1a;20240930 学习目标&#xff1a;判断与循环 --33 match语句&#xff1a;如何通过match关键字来处理程序的分支逻辑&#xff1f; 学习笔记&#xff1a; match语句的语法 基本写法 代码实现&#xff08;后续更新为自己写的代码&#xff…

软件测试学习笔记丨Mock的价值与实战

本文转自测试人社区&#xff0c;原文链接&#xff1a;https://ceshiren.com/t/topic/32331 一、Mock的价值与意义 1.1 简介 测试过程中&#xff0c;对于一些不容易构造或获取的对象&#xff0c;用一个虚拟的对象来替代它&#xff0c;达到相同的效果&#xff0c;这个虚拟的对象…

YOLOv11尝鲜测试五分钟极简配置

ultralytics团队在最近又推出了YOLOv11&#xff0c;不知道在有生之年能不能看到YOLOv100呢哈哈。 根据官方文档&#xff0c;在 Python>3.8并且PyTorch>1.8的环境下即可安装YOLOv11&#xff0c;因此之前YOLOv8的环境是可以直接用的。 安装YOLOv11&#xff1a; pip instal…

安宝特分享 | AR技术重塑工业:数字孪生与沉浸式培训的创新应用

在数字化转型的浪潮中&#xff0c;AR&#xff08;增强现实&#xff09;技术与工业的结合正在呈现新的趋势和应用延伸。特别是“数字孪生”概念的崛起&#xff0c;为AR技术在工业中提供了独特而创新的切入点。 本文将探索AR如何与数字孪生、沉浸式体验和实用案例相结合&#xf…

OpenHarmony(鸿蒙南向开发)——小型系统芯片移植指南(一)

往期知识点记录&#xff1a; 鸿蒙&#xff08;HarmonyOS&#xff09;应用层开发&#xff08;北向&#xff09;知识点汇总 鸿蒙&#xff08;OpenHarmony&#xff09;南向开发保姆级知识点汇总~ 持续更新中…… 移植须知 本文详细介绍如何将OpenHarmony小型系统的linux和LiteOS…

Elasticsearch学习笔记(3)

RestAPI Elasticsearch&#xff08;ES&#xff09;官方提供了多种语言的客户端库&#xff0c;用于与Elasticsearch进行交互。这些客户端库的主要功能是帮助开发者更方便地构建和发送DSL&#xff08;Domain Specific Language&#xff09;查询语句&#xff0c;并通过HTTP请求与…

全面提升MySQL性能:从硬件到配置再到代码的最佳实践

MySQL 是全球最流行的开源关系型数据库管理系统之一&#xff0c;广泛应用于各种规模的应用程序中。随着应用规模的增长&#xff0c;数据库的性能优化成为提升系统整体性能的关键因素。本文将从多个角度探讨如何对MySQL进行性能优化&#xff0c;帮助开发者和DBA解决实际问题&…

JWT 令牌生成报错

一、问题描述 我在获取JWT令牌时&#xff0c;报了一个这样的错误 error&#xff1a;io.jsonwebtoken.security.WeakKeyException: The signing keys size is 64 bits which is not secure enough for the HS256 algorithm. 二、问题原因 原因是我这里指定的签名密钥也就是si…

java实现的无头单向非循环链表

java实现的无头单向非循环链表 ArrayList的缺陷链表链表的概念及结构无头单向非循环链表的实现链表OJ题 ArrayList的缺陷 由于ArrayList底层是一段连续空间&#xff0c;当在ArrayList任意位置插入或者删除元素时&#xff0c;就需要将后序元素整体往前或者往后搬移&#xff0c;…

使用C语言获取iostat中的await值的方法和方案

使用C语言获取iostat中的await值的方法和方案 1. 准备工作2. 调用iostat命令并获取输出3. 解析iostat输出4. 完整实现和错误处理5. 注意事项在Linux系统中,iostat命令是sysstat软件包的一部分,用于监控系统的CPU、网卡、tty设备、磁盘、CD-ROM等设备的活动情况和负载信息。其…

逻辑回归(下): Sigmoid 函数的发展历史

背景 闲来无事翻了一下之前买的一个机器学习课程及之前记录的网络笔记&#xff0c;发现遇到公式都是截图&#xff0c;甚至是在纸上用笔推导的。重新整理一遍之前逻辑回归函数的学习笔记&#xff0c;主要是为了玩一下 LaTex 语法&#xff0c;写公式挺有意思的。 整理之前三篇笔…

VMware 虚拟机 下载安装 Centos7 和Windows10 镜像源

准备工作 下载 VMware链接&#xff1a;稍后发布链接 Centos7完整版链接&#xff1a;https://www.123865.com/ps/EF7OTd-mdAnH Centos7mini版链接&#xff1a;https://www.123865.com/ps/EF7OTd-1dAnH Windows10链接&#xff1a;https://www.123865.com/ps/EF7OTd-4dAnH 演示环境…

win11任务栏颜色怎么修改?透明任务栏效果可以实现吗?5套方案!

win11任务栏颜色怎么修改&#xff1f; ■ 通过系统个性化设置、任务栏设置、金舟Translucent任务栏、Glass8、注册表等方式可以快速修改Windows11电脑任务栏颜色。 在重度使用电脑办公的过程中&#xff0c;大家除了对电脑壁纸有一点的设计感外&#xff0c;小编发现不少人对电…

【Qt】Qt安装(2024-10,QT6.7.3,Windows,Qt Creator 、Visual Studio、Pycharm 示例)

文章目录 一、Qt 简介二、安装开源版本2.1 Qt 官网 与 版本选择2.2 Qt 安装程序 三、使用示例3.1 Qt Creator3.11 示例程序3.12 新建C项目3.13 新建Python项目 3.2 Visual Studio 附录附录 1&#xff1a;Additional Libraries 说明附录2 &#xff1a;老版本安装附录3&#xff1…