PCL 点云圆柱邻域搜索

目录

一、概述

1.1原理

1.2实现步骤

1.3应用场景

二、代码实现

2.1关键函数

2.2完整代码

三、实现效果


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

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


一、概述

        本文将介绍如何使用PCL库进行点云的圆柱邻域搜索,并将搜索到的结果进行可视化展示。圆柱邻域搜索是一种特定的邻域搜索方法,通过在点云中查找某一特定点周围的邻域,分析和处理圆柱形物体的点云数据。

1.1原理

        圆柱邻域搜索的基本思想是通过KD树(k-D Tree)进行半径搜索,但搜索时仅考虑投影到特定平面(如XY平面)上的点,形成圆柱形的搜索邻域。KD树是一种高效的空间数据结构,用于组织和查询多维数据点。在PCL中,KD树能够快速找到某点周围指定半径内的邻近点。

1.2实现步骤

  1. 读取点云数据。
  2. 对点云进行平面投影,生成圆柱形邻域搜索的基准点云。
  3. 使用KD树执行半径搜索,找到圆柱体邻域内的点。
  4. 将搜索到的邻域点和原始点云进行可视化展示。

1.3应用场景

  1. 圆柱体检测:在点云数据中,检测圆柱形物体或分析圆柱体周围的点云。
  2. 管道检测:分析管道内部或外部的点云数据,查找与管道形状相符合的邻域点。
  3. 3D重建:在三维点云中,对圆柱形状物体进行建模或重建。

二、代码实现

2.1关键函数

  • pcl::KdTreeFLANN:用于构建KD树和执行搜索操作。
  • radiusSearch:执行圆柱邻域搜索,找到指定半径内的所有邻域点。
  • pcl::visualization::PCLVisualizer:用于可视化点云数据。

2.2完整代码

#include <iostream>
#include <vector>
#include <pcl/io/pcd_io.h>  // 用于加载PCD文件的头文件
#include <pcl/point_types.h>  // PCL点类型定义的头文件
#include <pcl/kdtree/kdtree_flann.h>  // KD树近邻搜索的头文件
#include <boost/thread/thread.hpp>
#include <pcl/visualization/pcl_visualizer.h>  // PCL可视化相关定义的头文件using namespace std;int main()
{// --------------------------------读取点云------------------------------------pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);// 加载PCD文件中的点云数据if (pcl::io::loadPCDFile<pcl::PointXYZ>("person2.pcd", *cloud) == -1){PCL_ERROR("Couldn't read file!");  // 如果文件加载失败,输出错误信息return -1;  // 返回错误代码并退出程序}// -----------------------------圆柱形邻域搜索---------------------------------pcl::PointCloud<pcl::PointXYZ>::Ptr cylindCloud(new pcl::PointCloud<pcl::PointXYZ>);cylindCloud->resize(cloud->size());  // 调整圆柱点云的大小与原始点云一致// 将点云投影到XY平面上(Z坐标设置为0),生成平面投影点云for (size_t i = 0; i < cloud->size(); ++i){cylindCloud->points[i].x = cloud->points[i].x;cylindCloud->points[i].y = cloud->points[i].y;cylindCloud->points[i].z = 0.0;  // 将Z坐标设为0,投影到XY平面}// 创建KD树对象,用于快速查找邻域pcl::KdTreeFLANN<pcl::PointXYZ> kdtree;kdtree.setInputCloud(cylindCloud);  // 设置KD树的输入点云为平面投影点云// 选择一个点作为查询点,定义圆柱体的搜索中心pcl::PointXYZ searchPoint = cylindCloud->points[200];  // 设置查询点为第2920个点float radius = 0.3;  // 定义查找半径范围为0.3单位// 用于存储找到的邻域点的索引和对应的距离vector<int> pointIdxRadiusSearch;  // 保存每个邻域点的索引vector<float> pointRadiusSquaredDistance;  // 保存每个邻域点与查找点之间的距离平方值// 创建点云对象result用于存储搜索到的邻域点pcl::PointCloud<pcl::PointXYZ>::Ptr result(new pcl::PointCloud<pcl::PointXYZ>);if (kdtree.radiusSearch(searchPoint, radius, pointIdxRadiusSearch, pointRadiusSquaredDistance) > 0){// 如果搜索成功,将原始点云中对应索引的点复制到result点云中pcl::copyPointCloud(*cloud, pointIdxRadiusSearch, *result);}// -------------------------------结果可视化------------------------------------boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer(new pcl::visualization::PCLVisualizer("3D Viewer"));viewer->setWindowName("圆柱形邻域搜索");  // 设置窗口名称// 设置原始点云的颜色为绿色pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> single_color(cloud, 0, 255, 0);  // 绿色viewer->addPointCloud<pcl::PointXYZ>(cloud, single_color, "sample cloud");  // 添加原始点云到可视化窗口// 设置圆柱邻域内点云的颜色为红色pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> cylind_color(cloud, 255, 0, 0);  // 红色viewer->addPointCloud<pcl::PointXYZ>(result, cylind_color, "cylind cloud");  // 添加邻域点云到可视化窗口viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 3, "cylind cloud");  // 设置邻域点云点的大小// 进入主循环,保持窗口打开while (!viewer->wasStopped()){viewer->spinOnce(100);  // 刷新窗口boost::this_thread::sleep(boost::posix_time::microseconds(100000));  // 等待100ms}return 0;  // 程序结束
}

三、实现效果

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

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

相关文章

Snapchat API 访问:Objective-C 实现示例

Snapchat 是一个流行的社交媒体平台&#xff0c;它允许用户发送和接收短暂存在的图片和视频。对于开发者来说&#xff0c;访问 Snapchat API 可以为应用程序添加独特的社交功能。本文将介绍如何在 Objective-C 中实现对 Snapchat API 的访问&#xff0c;并提供一个详细的代码示…

spring boot启动报错:so that it conforms to the canonical names requirements

springboot 2.x的版本中对配置文件中的命名规范有了强制性的要求&#xff0c;如下图所示中的dataSource属性属于驼峰格式&#xff0c;但是在springboot 2.x中不允许使用驼峰形式。 根据错误提示可知将其使用 - 来分割即可 错误信息的含义&#xff1a;“Canonical names should…

LLM - 理解 多模态大语言模型(MLLM) 的 指令微调(Instruction-Tuning) 与相关技术 (四)

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/142237871 免责声明&#xff1a;本文来源于个人知识与公开资料&#xff0c;仅用于学术交流&#xff0c;欢迎讨论&#xff0c;不支持转载。 完备(F…

最新版本TensorFlow训练模型TinyML部署到ESP32入门实操

最新版本TensorFlow训练模型TinyML入门实操 1.概述 这篇文章介绍微型嵌入式设备的机器学习TinyML&#xff0c;它们的特点就是将训练好的模型部署到单片机上运行。 2.TensorFlow深度学习原理 TensorFlow开源项目是由google研发的一个嵌入式机器学习工具&#xff0c;通过调用…

鸿蒙媒体开发系列07——AVRecorder音频录制

如果你也对鸿蒙开发感兴趣&#xff0c;加入“Harmony自习室”吧&#xff01;扫描下方名片&#xff0c;关注公众号&#xff0c;公众号更新更快&#xff0c;同时也有更多学习资料和技术讨论群。 1、概述 在HarmonyOS系统中&#xff0c;多种API都提供了音频录制开发的支持&#x…

2024永久激活版 Studio One 6 Pro for mac 音乐创作编辑软件 完美兼容

Studio One 6是一款功能强大的音乐制作软件&#xff0c;由PreSonus公司开发。它提供了全面的音频录制、编辑、混音和母带处理工具&#xff0c;适用于音乐制作人、音频工程师和创作人员。 Studio One 6拥有直观的用户界面&#xff0c;使用户能够快速而流畅地进行音乐创作。它采…

ubuntu安装emqx

目录 1.预先下载好emqx压缩包 2.使用tar命令解压 3.进入bin目录 5.放开访问端口18083 6.从通过ip地址访问emqx后台 7.默认用户名密码为admin/public 8.登录后台 9.资源包绑定在此博文可自取 1.预先下载好emqx压缩包 2.使用tar命令解压 sudo tar -xzvf emqx-5.0.8-el8-…

莱卡相机sd内存卡格式化了怎么恢复数据

在数字化时代&#xff0c;相机已成为我们记录生活、捕捉瞬间的重要设备。而SD内存卡&#xff0c;作为相机的存储媒介&#xff0c;承载着我们的珍贵记忆和重要数据。然而&#xff0c;有时由于误操作、系统错误或其他原因&#xff0c;我们可能会不小心格式化SD内存卡&#xff0c;…

一个基于VB的期刊信息管理系统

一个基本的期刊信息管理系统的示例&#xff0c;使用 Visual Basic (VB.NET) 编写。这个示例将展示如何创建一个简单的期刊信息管理系统&#xff0c;其中包括添加、查看、编辑和删除期刊的功能。 系统需求 添加期刊&#xff1a;允许用户输入期刊的信息&#xff08;如标题、作者…

OpenAI GPT o1技术报告阅读(3)-英文阅读及理解

✨继续阅读报告&#xff1a;使用大模型来学习推理(Reason) 原文链接&#xff1a;https://openai.com/index/learning-to-reason-with-llms/ 这次我们继续看一个英文阅读理解的案例。 原问题&#xff1a; The following passage is the draft of an excerpt from a contempora…

条件编译代码记录

#include <iostream>// 基类模板 template<typename T> class Base { public:void func() {std::cout << "Base function" << std::endl;} };// 特化的子类 template<typename T> class Derived : public Base<T> { public:void…

MYSQL数据库——MYSQL管理

MYSQL数据库安装完成后&#xff0c;自带四个数据库&#xff0c;具体作用如下&#xff1a; 常用工具 1.mysql 不是指mysql服务&#xff0c;而是指mysql的客户端工具 例如&#xff1a; 2.mysqladmin 这是一个执行管理操作的客户端程序&#xff0c;可以用它来检查服务器的配置和…

多线程篇六

多线程篇六 如笔者理解有误欢迎交流指正~⭐ 什么是单例模式&#xff1f; 单例模式是最常见的 设计模式. 顾名思义&#xff0c;单例模式指的就是单个实例的模式.&#xff08;针对某些类只能使用一个对象的场景【如MySQL、JDBC、DataSource】&#xff09; 设计模式 设计模式是…

数据结构之二叉树(1)

数据结构之二叉树&#xff08;1&#xff09; 一、树 1、树的概念与结构 &#xff08;1&#xff09;树是一种非线性的数据结构&#xff0c;由n(n>0)个有限结点组成一个具有层次关系的集合。 &#xff08;2&#xff09;树有一个特殊的结点&#xff0c;叫做根结点&#xff…

Linux:Bash中的文件描述符

相关阅读 Linuxhttps://blog.csdn.net/weixin_45791458/category_12234591.html?spm1001.2014.3001.5482 Linux中的所有进程&#xff0c;都拥有自己的文件描述符(File Descriptor, FD)&#xff0c;它是操作系统在管理进程和文件时的一种抽象概念。每个文件描述符由一个非负整…

【Mac】系统环境配置

常用工具 Navicat PJ版本&#xff1a;this 提取密码&#xff1a;v31p Host切换器 SwitchHosts termius 一款好用的Linux服务器连接工具&#xff1a; termius 小飞机 dddd&#xff1a;&#x1fa9c; Git mac安装git有好多种方式&#xff0c;自带的xcode或者通过Homebr…

[数据集][目标检测]智慧交通铁路异物入侵检测数据集VOC+YOLO格式802张7类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;802 标注数量(xml文件个数)&#xff1a;802 标注数量(txt文件个数)&#xff1a;802 标注类别…

pytorch快速入门(一)—— 基本工具及平台介绍

前言 该pytorch学习笔记应该配合b站小土堆的《pytorch深度学习快速入门教程》使用 环境配置&#xff1a;Anaconda Python编译器&#xff1a;pycharm、jupyter 两大法宝函数 dir&#xff08;&#xff09;&#xff1a;知道包中有什么东西&#xff08;函数 / 属性..…

C++的封装

手动封装一个顺序表&#xff08;SeqList&#xff09;,分文件编译实现 有私有成员&#xff1a;顺序表数组的起始地址 ptr、 顺序表的总长度&#xff1a;size、顺序表的实际长度&#xff1a;len 成员函数&#xff1a;初始化 init(int n) 判空&#xff1a;empty 判满&#xff1a;f…

【计算机网络 - 基础问题】每日 3 题(一)

✍个人博客&#xff1a;Pandaconda-CSDN博客 &#x1f4e3;专栏地址&#xff1a;http://t.csdnimg.cn/fYaBd &#x1f4da;专栏简介&#xff1a;在这个专栏中&#xff0c;我将会分享 C 面试中常见的面试题给大家~ ❤️如果有收获的话&#xff0c;欢迎点赞&#x1f44d;收藏&…