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.xdnf.cn/news/146194.html

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

相关文章

【白皮书下载】分布式功能安全的创新与突破

近日&#xff0c;Imagination 推出全新性能最高且具有高等级功能安全性的汽车 GPU IP——Imagination DXS GPU&#xff0c;并且是Imagination 第一款带有“分布式安全机制”的处理器。 下载白皮书&#xff0c;获取完整分布式安全机制解决方案 根据 ISO 26262 汽车安全完整性等级…

11.1图像的腐蚀和膨胀

基本概念-图像腐蚀 图像腐蚀是一种用于去除图像中小的对象或者突出物体边缘的形态学操作。 图像腐蚀&#xff08;erosion&#xff09;的基本概念 图像腐蚀通常用于二值图像&#xff0c;其基本原理是从图像中“侵蚀”掉一些像素点&#xff0c;这些像素点通常是边界上的或者是孤…

【有啥问啥】OpenAI o1的思考之前训练扩展定律、后训练扩展定律与推理扩展定律:原理与应用详解

OpenAI o1的思考之前训练扩展定律、后训练扩展定律与推理扩展定律&#xff1a;原理与应用详解 随着深度学习技术的不断发展&#xff0c;模型的规模和复杂度也迅速提升。研究人员发现了模型训练和推理过程中性能变化的规律&#xff0c;这些规律为我们提供了优化模型设计与训练的…

BGP 路由反射器

转载&#xff1a;BGP 路由反射器 / 实验介绍: / 原理概述 缺省情况下&#xff0c;路由器从它的一个 IBGP 对等体那里接收到的路由条目不会被该路由器再传递给其他IBGP对等体&#xff0c;这个原则称为BGP水平分割 原则&#xff0c;该原则的根本作用是防止 AS 内部的 BGP 路由…

linux入门——“linux基本指令”下

1.mv指令 mv指令用于移动文件或者目录。语法是mv 源文件 目标文件。它的用法需要注意&#xff1a; 当目标文件不存在的时候&#xff0c;默认是将源文件进行重命名操作&#xff0c;名字就是目标文件的名字&#xff0c;当目标文件存在的时候才会把源文件移动到目标文件。 目标文…

微服务远程调用(nacos及OpenFeign简单使用)

问题&#xff1a;在微服务中&#xff0c;每个项目是隔离开的&#xff0c;当有一个项目请求其他项目中的数据时&#xff0c;必须发起网络请求&#xff0c;本文即对此问题展开讨论。 1.使用restTemplate发送请求 //发送请求ResponseEntity<List<ItemDTO>> response …

Microsoft 365 Copilot: Wave 2 发布,开启AI时代下的全新工作流

本周一&#xff08;9月16日&#xff09;&#xff0c;微软对 Microsoft 365 Copilot 办公辅助工具进行了重大升级&#xff0c;推出 Wave 2 版本。新版 Copilot 将为 Microsoft 365 用户带来一系列新功能和改进&#xff0c;进一步提升工作效率与用户体验&#xff0c;正式开启AI时…

【machine learning-13-线性回归的向量化】

向量化 向量化简洁并行计算 向量化 线性回归的向量化表示如下&#xff0c;其中w 和 x 都分别加了箭头表示这是个向量&#xff0c;后续不加也可以表示为向量&#xff0c;w和x点乘加上b&#xff0c;就构成了多元线性回归的表达方式&#xff0c;如下&#xff1a; 那么究竟为什么…

uniapp|微信小程序 实现输入四位数 空格隔开

<template><page-meta :page-style"cssVar"></page-meta><view class"container"><u-navbartitle"优惠券兑换"placeholderbgColor"#fff":autoBack"true":titleStyle"{fontFamily: SourceHa…

navicat无法连接远程mysql数据库1130报错的解决方法

出现报错&#xff1a;1130 - Host ipaddress is not allowed to connect to this MySQL serve navicat&#xff0c;当前ip不允许连接到这个MySQL服务 解决当前ip无法连接远程mysql的方法 1. 查看mysql端口&#xff0c;并在服务器安全组中放开相应入方向端口后重启服务器 sud…

MySQL篇(存储引擎 - InnoDB存储引擎架构)(持续更新迭代)

目录 一、逻辑存储结构 1. 表空间 2. 段 3. 区 4. 页 5. 行 二、架构 1. 简介 2. 内存结构&#xff08;四部分&#xff09; Buffer Pool Change Buffer Adaptive Hash Index Log Buffer 3. 磁盘结构&#xff08;七部分&#xff09; System Tablespace File-Per-…

【工具变量】科技金融试点城市DID数据集(2000-2023年)

时间跨度&#xff1a;2000-2023年数据范围&#xff1a;286个地级市包含指标&#xff1a; year city treat post DID&#xff08;treat*post&#xff09; 样例数据&#xff1a; 包含内容&#xff1a; 全部内容下载链接&#xff1a; 参考文献-pdf格式&#xff1a;https://…

大觅网之环境部署(Environment Deployment of Da Mi Network)

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:Linux运维老纪的首页…

World of Warcraft [CLASSIC] International translation bug

internationalization i18n_getinternationalizationjs-CSDN博客 1&#xff09;国际化翻译不完整 Chance on melee and ranged critical strike to increase your attack power by 1262 for 10s. 2&#xff09;更新美酒节&#xff0c;服务器并发太高&#xff0c;被提出副本 Wo…

[Redis][String][下]详细讲解

目录 1.其他命令1.APPEND2.GETRANGE3.SETRANGE4.STRLEN 2.内部编码3.典型使用场景1.缓存(Cache)功能2.计数(Counter)功能3.共享会话(Session) 1.其他命令 1.APPEND 功能&#xff1a; 如果key已经存在并且是⼀个string&#xff0c;命令会将value追加到原有string的后边如果key…

第二十节:学习Redis缓存数据库实现增删改查(自学Spring boot 3.x的第五天)

这节记录下如何使用redis缓存数据库。 第一步&#xff1a; 先在服务器端安装redis&#xff0c; 下载地址&#xff1a;Releases tporadowski/redis GitHub。 第二步&#xff1a; 安装redis客户端可视化管理软件redisDesktopmanager Redis Desktop Manager - Download 第…

11. DPO 微调示例:根据人类偏好优化LLM大语言模型

在部署大模型之后&#xff0c;我们必然要和微调打交道。现在大模型的微调有非常多的方法&#xff0c;过去的文章中提到的微调方法通常依赖于问题和答案对&#xff0c;标注成本较高。 2023 年所提出的 Direct Preference Optimization&#xff08;DPO&#xff09;为我们提供了一…

C++——map和set的使用以及map系列

目录 map和set的使用 1. 序列式容器和关联式容器 2. set系列的使⽤ 2.1 set和multiset参考⽂档 2.2 set类的介绍 2.3 set的构造和迭代器 2.4 set的增删查 set的增删查关注以下⼏个接⼝即可&#xff1a; 2.6 find和erase使⽤样例&#xff1a; lower_bound(); upper_bo…

Python 从入门到实战23(属性property)

我们的目标是&#xff1a;通过这一套资料学习下来&#xff0c;通过熟练掌握python基础&#xff0c;然后结合经典实例、实践相结合&#xff0c;使我们完全掌握python&#xff0c;并做到独立完成项目开发的能力。 上篇文章我们讨论了类的定义、使用方法的相关知识。今天我们将学…

uboot:源码分析-启动第一阶段-start.S解析

start.S引入 进入start.S文件中&#xff0c;发现57行中就是_start标号的定义处 SourceInsight中添加行号 在SI中&#xff0c;如果我们知道我们要找的文件的名字&#xff0c;但是我们又不知道他在哪个目录下&#xff0c;我们要怎样找到并打开这个文件&#xff1f;方法是在SI中先…