PCL 用八叉树完成空间变化检测

目录

一、概述

1.1原理

1.2实现步骤

1.3应用场景

二、代码实现

2.1关键函数

2.1.1八叉树构建与变化检测

2.1.2检测变化的点云

2.2完整代码

三、实现效果


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

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


一、概述

        空间变化检测是点云处理中常见的任务之一,常用于监测不同时间点的点云数据集之间的变化。PCL 中可以通过 八叉树 来高效完成点云的空间变化检测。通过构建两组点云的八叉树,比较相同空间位置上的体素变化,快速检测出两组点云之间的空间变化。

1.1原理

        空间变化检测的核心思想是:将两组点云(例如不同时刻采集的数据)通过八叉树进行空间划分。每个八叉树节点(体素)代表空间中的一个区域。通过比较两个点云的八叉树节点,可以快速检测哪些体素中的点数或位置发生了变化,进而得出空间变化区域。

1.2实现步骤

  1. 读取两组点云数据。
  2. 使用 pcl::octree::OctreePointCloudChangeDetector 分别对两组点云进行八叉树构建。
  3. 比较两组点云的八叉树结构,检测变化的体素。
  4. 可视化检测结果,突出显示发生变化的区域。

1.3应用场景

  1. 监控变化:用于监测环境中物体的移动或消失。
  2. 场景重建:比较不同时间段的场景点云,检测物体位置变化。
  3. 质量检测:对比不同状态下的物体点云数据,发现差异。

二、代码实现

2.1关键函数

2.1.1八叉树构建与变化检测

        PCL 提供的 pcl::octree::OctreePointCloudChangeDetector 可以同时构建八叉树并完成空间变化检测。

#include <pcl/octree/octree_pointcloud_changedetector.h>// 设置八叉树分辨率
float resolution = 0.05f;
pcl::octree::OctreePointCloudChangeDetector<pcl::PointXYZ> octree(resolution);// 构建八叉树并添加第一组点云数据
octree.setInputCloud(cloud1);  // cloud1 是第一组点云
octree.addPointsFromInputCloud();  // 添加第一组点云到八叉树// 切换到第二组点云,重新构建八叉树并检测变化
octree.switchBuffers();  // 切换八叉树缓存,准备添加第二组点云
octree.setInputCloud(cloud2);  // cloud2 是第二组点云
octree.addPointsFromInputCloud();  // 添加第二组点云

2.1.2检测变化的点云

        使用 getPointIndicesFromNewVoxels 获取在两个点云之间发生变化的体素。

std::vector<int> newPointIdxVector;
octree.getPointIndicesFromNewVoxels(newPointIdxVector);  // 获取新体素中的点索引

2.2完整代码

#include <iostream>
#include <vector>
#include <pcl/io/pcd_io.h>
#include <pcl/point_types.h>
#include <pcl/octree/octree_pointcloud_changedetector.h>
#include <pcl/visualization/pcl_visualizer.h>int main(int argc, char** argv)
{// -----------------------------读取两组点云数据---------------------------------pcl::PointCloud<pcl::PointXYZ>::Ptr cloud1(new pcl::PointCloud<pcl::PointXYZ>);pcl::PointCloud<pcl::PointXYZ>::Ptr cloud2(new pcl::PointCloud<pcl::PointXYZ>);if (pcl::io::loadPCDFile<pcl::PointXYZ>("cloud1.pcd", *cloud1) == -1 || pcl::io::loadPCDFile<pcl::PointXYZ>("cloud2.pcd", *cloud2) == -1){PCL_ERROR("Couldn't read the PCD files!\n");return -1;}// -----------------------------构建八叉树并检测变化---------------------------------float resolution = 0.05f;  // 八叉树的分辨率pcl::octree::OctreePointCloudChangeDetector<pcl::PointXYZ> octree(resolution);// 添加第一组点云到八叉树octree.setInputCloud(cloud1);octree.addPointsFromInputCloud();// 切换到第二组点云并检测变化octree.switchBuffers();  // 切换缓存octree.setInputCloud(cloud2);octree.addPointsFromInputCloud();  // 添加第二组点云// 获取变化的点索引std::vector<int> newPointIdxVector;octree.getPointIndicesFromNewVoxels(newPointIdxVector);// -----------------------------可视化变化结果---------------------------------pcl::visualization::PCLVisualizer::Ptr viewer(new pcl::visualization::PCLVisualizer("Change Detection Viewer"));// 设置背景颜色为白色viewer->setBackgroundColor(1.0, 1.0, 1.0);  // 白色背景// 显示第一组点云(绿色)pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> cloud1_color_handler(cloud1, 0, 255, 0);viewer->addPointCloud(cloud1, cloud1_color_handler, "cloud1");// 显示变化的点(红色)pcl::PointCloud<pcl::PointXYZ>::Ptr changed_points(new pcl::PointCloud<pcl::PointXYZ>);pcl::copyPointCloud(*cloud2, newPointIdxVector, *changed_points);  // 将变化的点复制出来pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> changed_points_color_handler(changed_points, 255, 0, 0);viewer->addPointCloud(changed_points, changed_points_color_handler, "changed_points");// 设置点的大小viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 2, "cloud1");viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 4, "changed_points");// 添加坐标系viewer->addCoordinateSystem(1.0);viewer->initCameraParameters();// 可视化循环while (!viewer->wasStopped()){viewer->spinOnce(100);}return 0;
}

三、实现效果

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何在O2OA中使用ElementUI组件进行审批流程工作表单设计

本文主要介绍如何在O2OA中进行审批流程表单或者工作流表单设计&#xff0c;O2OA主要采用拖拽可视化开发的方式完成流程表单的设计和配置&#xff0c;不需要过多的代码编写&#xff0c;业务人员可以直接进行修改操作。 在流程表单设计界面&#xff0c;可以在左边的工具栏找到Ele…

《线性代数》学渣笔记

文章目录 1 行列式1.1 克拉默法则1.2 基本性质1.3 余子式 M i j M_{ij} Mij​1.4 代数余子式 A i j ( − 1 ) i j ⋅ M i j A_{ij} (-1)^{ij} \cdot M_{ij} Aij​(−1)ij⋅Mij​1.5 具体型行列式计算&#xff08;化为基本型&#xff09;1.5.1 主对角线行列式&#xff1a;主…

Vue3 + ElementPlus 的后台菜单指引

文章目录 需求实现思路 需求 实现思路 引导页用 Drive.js 基本的使用操作这里写了一些菜单使用 ElementPlus 的组件&#xff0c;可以调用组件中暴露的这个方法&#xff0c;具体使用方法在这里说明 二者结合一下&#xff0c;就可以有这样的效果了

2024网安周 | 百度安全深度参与,探索人工智能与数字安全的融合发展之路

9月9日-15日&#xff0c;2024年国家网络安全宣传周在全国范围内统一举行&#xff0c;本届网安周继续以“网络安全为人民&#xff0c;网络安全靠人民”为主题&#xff0c;由中央宣传部、中央网信办、教育部、工业和信息化部、公安部、中国人民银行、国家广播电视总局、全国总工会…

K8s flink-operator 例子

1.参考官网&#xff1a; https://nightlies.apache.org/flink/flink-kubernetes-operator-docs-stable/docs/try-flink-kubernetes-operator/quick-start/ 2.首先环境具备 k8s、helm 我的环境 k8s 1.30 最新版本了 [rootk8s-master ~]# kubectl get no -owide NAME …

C/C++逆向:循环语句逆向分析

在逆向分析中&#xff0c;循环语句通常会以特定的汇编模式或结构体现出来。常见的循环语句包括 for 循环、while 循环和 do-while 循环。由于不同的编译器会根据代码优化的级别生成不同的汇编代码&#xff0c;分析循环的模式也可能会有所不同。以下是三种常见循环语句的汇编分析…

uni-app+vue3开发微信小程序使用本地图片渲染不出来报错[渲染层网络层错误]Failed to load local image resource

我把图片放在assets里面页面通过相对路径引入。结果一直报错。 最后我把图片放在static文件夹下面。然后修改路径指向static就可以了 或者是我们必须先import 这个图片然后在使用 import banner1 from ../../assets/images/banner/banner1.png; <image :src"banner…

【时时三省】(C语言基础)指针笔试题5

山不在高,有仙则名。水不在深,有龙则灵。 ----CSDN 时时三省 笔试题5 这个a数组代表着5行5列 如下图 a[4][2]是第5行的数组 第五行下标为2的位置 取出的是这个位置的地址

【Linux学习】1-2 新建虚拟机ubuntu环境

1.双击打开VMware软件&#xff0c;点击“创建新的虚拟机”&#xff0c;在弹出的中选择“自定义&#xff08;高级&#xff09;” 2.点击下一步&#xff0c;自动识别ubuntu光盘映像文件&#xff0c;也可以点击“浏览”手动选择&#xff0c;点击下一步 3.设置名称及密码后&#xf…

kibana开启访问登录认证

编辑es配置文件&#xff0c;添加以下内容开启es认证 vim /etc/elasticsearch/elasticsearch.yml http.cors.enabled: true http.cors.allow-origin: "*" http.cors.allow-headers: Authorization xpack.security.enabled: true xpack.security.transport.ssl.enable…

WPF一个控件根据另一个控件的某种状态的改变从而改变自身某种状态

WPF 一个控件根据另一个控件的某种状态的改变从而改变自身某种状态 前提&#xff0c;这里根据 Image 控件 Source 属性为 null 时&#xff0c;让 Label 控件可见&#xff0c;不为 null 时, Label 控件不可见为例子展示&#xff0c;代码如下&#xff1a; <Canvas><Ima…

Qt基础之四十七:管理员权限

在Windows系统中,以管理员身份运行的意思是,用系统管理最高权限运行程序。一般来说,只有当某些操作涉及系统保护区域时,才会需要用户授权管理员运行。如此一来,程序、命令在运行过程中,就有了足够权限,更改系统设置或注册表。 一.Qt程序加入管理员权限的几种方式 1.MS…

理解和使用语言模型的监督微调 (SFT)

大型语言模型&#xff08;LLM&#xff09;的训练通常分为几个阶段&#xff0c;包括预训练和几个微调阶段&#xff1b;见下文。 虽然预训练的成本很高&#xff08;即几十万美元的计算费用&#xff09;&#xff0c;但微调 LLM&#xff08;或执行上下文学习&#xff09;的成本却很…

开源链动 2+1 模式 S2B2C 商城小程序:社交电商团队为王的新引擎

摘要&#xff1a;本文深入探讨在社交电商领域中&#xff0c;团队的重要性以及如何借助开源链动 21 模式 S2B2C 商城小程序&#xff0c;打造具有强大竞争力的团队&#xff0c;实现个人价值与影响力的放大&#xff0c;创造被动收入&#xff0c;迈向财富自由之路&#xff0c;同时为…

职场能力强的人都在做什么---今日头条

【职场里,能力强的人都在做哪些事... - 今日头条】https://m.toutiao.com/is/ikn6kt9q/ 知识雷达 2024-09-21 16:33 目录 职场里,能力强的人都在做哪些事呢? 1、复盘; 2、多角度思考;3、记录信息; 4、永远积极主动;5、主动获取信息差; 6、明确人和人的关系;7、…

蓝桥杯备赛---引言

我是来自成都锦城学院的2021级学生&#xff0c;第一次参加第十五届蓝桥杯嵌入式赛道获得了国二的名次&#xff0c;接下来将为大家分享各个模块的代码&#xff0c;可以速成省一&#xff0c;但想要取得国一的成绩则需要补偿数据结构、基本c语言函数等相关知识&#xff0c;很遗憾没…

低代码BPA(业务流程自动化)技术探讨

一、BPA流程设计平台的特点 可视化设计工具 大多数BPA流程设计平台提供直观的拖拽式界面&#xff0c;用户可以通过图形化方式设计、修改及优化业务流程。这种可视化的方式不仅降低了门槛&#xff0c;还便于非技术人员理解和参与流程设计。集成能力 现代BPA平台通常具备与其他系…

栈的基本概念和及具体实现

今天给大家介绍一下栈的基本概念及实现&#xff01;话不多说&#xff0c;立即开始&#xff01; 1.栈的概念&#xff1a; 一种特殊的线性表&#xff0c;其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈 顶&#xff0c;另一端称为栈底。栈中的…

基于遗传优化算法的多AGV栅格地图路径规划matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 4.1 栅格地图表示 4.2 路径编码 4.3 目标函数 5.完整程序 1.程序功能描述 基于遗传优化算法的多AGV栅格地图路径规划matlab仿真&#xff0c;分别测试单个AGC的路径规划和多个AGV的路径规划…

SpringBoot Validation不生效该怎么办?

SpringBoot Validation不生效该怎么办&#xff1f; 确认maven依赖查看依赖关系并处理验证&#xff1a;校验生效&#xff0c;成功反思 能问出这个问题说明你已经使用了Null、NotEmpty等等等校验注解&#xff0c;但是没有生效&#xff0c;我也出现过这种情况&#xff0c;请看我修…