PCL 点云圆柱邻域搜索

news2024/11/15 22:19:41

目录

一、概述

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.coloradmin.cn/o/2151219.html

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

相关文章

L3 逻辑回归

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 在周将使用 LogisticRegression 函数对经典的鸢尾花 (Iris) 数据集进行分类。将详细介绍逻辑回归的数学原理。 1. 逻辑回归的数学原理 逻辑回归是一种线性分…

海外大带宽服务器连接失败怎么办?

在全球化日益加深的今天&#xff0c;海外大带宽服务器已成为企业拓展国际市场、提升业务效率的重要工具。然而&#xff0c;面对复杂多变的网络环境和技术挑战&#xff0c;服务器连接失败的问题时有发生&#xff0c;这不仅影响了企业的正常运营&#xff0c;还可能带来经济损失和…

R语言机器学习算法实战系列(二) SVM算法(Support Vector Machine)

文章目录 介绍原理应用方向下载数据加载R包导入数据数据预处理数据描述数据切割标准化数据设置参数训练模型预测测试数据评估模型模型准确性混淆矩阵模型评估指标ROC CurvePRC Curve特征的重要性保存模型总结系统信息介绍 支持向量机(Support Vector Machine,简称SVM)是一种…

JavaScript发送邮件:实现前端触发的教程?

JavaScript发送邮件的方式&#xff1f;怎么使用JavaScript发信&#xff1f; 无论是用户反馈、联系表单还是自动通知&#xff0c;前端触发的邮件发送功能都能极大地提升用户体验。AokSend将详细介绍如何通过JavaScript发送邮件&#xff0c;实现前端触发的邮件发送功能。 JavaS…

58.【C语言】内存函数(memcpy函数)

目录 1.memcpy *简单使用 翻译: *模拟实现 注意事项: *例题 1.memcpy *简单使用 memcpy:memory copy cplusplus的介绍 点我跳转 翻译: 函数 memcpy void * memcpy ( void * destination, const void * source, size_t num ); 复制内存块 直接从source指向的位置复制num…

SpringBoot开发-数据加密

提示&#xff1a;本篇文章介绍各种加密工具以及数据脱密工具的使用 文章目录 前言一、AES加密算法二、AES加密算法工具使用&#xff08;一&#xff09;引入依赖&#xff08;二&#xff09;编写工具类&#xff08;三&#xff09;测试 三、MD5加密算法四、MD5加密工具使用&#x…

Windows【环境 01】服务器系统重装后的服务恢复(ES\Redis\Jafka\Tomcat)环境变量和服务注册

服务器系统重装后的服务恢复 1.原因2.问题处理2.1 JDK2.2 Elasticsearch2.3 Redis2.4 Jafka2.5 Tomcat 3.总结 1.原因 Windows 服务器系统盘损坏&#xff0c;换了硬盘并重做了系统&#xff0c;其他磁盘未损坏但安装的服务无法正常运行了&#xff0c;包括&#xff1a; Elastic…

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

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

Windows11自带截图工具的录屏功能

WinShiftS打开截图工具。 点击工具栏上的“录屏”按钮&#xff0c;或者按下WinAltR组合键。启动录屏模式&#xff0c;并允许你开始录制屏幕内容。 可以选择录制整个屏幕还是只录制一个特定的窗口。此外&#xff0c;还可以设置录制视频的分辨率和帧率。如果希望录制屏幕上的音…

在 deepin 上除了 Steam,还能怎么玩游戏?

查看原文 前段时间&#xff0c;很多朋友在 deepin 23 上实现了《黑神话&#xff1a;悟空》的通关&#xff0c;那么除了通过 Steam 玩 Windows 游戏之外&#xff0c;还有其他可以使用的游戏平台吗&#xff1f; 回答&#xff0c;当然是可以哒&#xff01; 游戏平台介绍 今天介…

每日OJ题_牛客_WY22 Fibonacci数列(斐波那契)

目录 牛客_WY22 Fibonacci数列&#xff08;斐波那契&#xff09; 解析代码 牛客_WY22 Fibonacci数列&#xff08;斐波那契&#xff09; Fibonacci数列_牛客题霸_牛客网 解析代码 求斐波那契数列的过程中&#xff0c;判断⼀下&#xff1a;何时 n 会在两个 fib 数之间。 #in…

拥塞控制算法的 rtt 公平性

我强调过&#xff0c;拥塞控制的核心在公平可用性&#xff0c;公平性由 buffer 动力学保证&#xff0c;而 buffer 动力学有两种表现形式&#xff1a; buffer 占比决定带宽占比&#xff0c;以 aimd 为例&#xff1b;带宽越小&#xff0c;buffer 挤兑加速比越大&#xff0c;以 b…

HTTP中的event-stream,eventsource,SSE,chatgpt,stream request,golang

我们都知道chatgpt是生成式的&#xff0c;因此它返回给客户端的消息也是一段一段的&#xff0c;所以普通的HTTP协议无法满足&#xff0c;当然websocket是能满足的&#xff0c;但是这个是双向的通信&#xff0c;其实 SSE&#xff08;Server-Sent Events&#xff09; 正好满足这个…

树与图的深度优先遍历(dfs的图论中的应用)

模板题 846. 树的重心 给定一颗树&#xff0c;树中包含 nn 个结点&#xff08;编号 1∼n&#xff09;和 n−1条无向边。 请你找到树的重心&#xff0c;并输出将重心删除后&#xff0c;剩余各个连通块中点数的最大值。 重心定义&#xff1a;重心是指树中的一个结点&#xff…

RabbitMQ 高级特性——发送方确认

文章目录 前言发送方确认confirm 确认模式return 退回模式 常见面试题 前言 前面我们学习了 RabbitMQ 中交换机、队列和消息的持久化&#xff0c;这样能够保证存储在 RabbitMQ Broker 中的交换机和队列中的消息实现持久化&#xff0c;就算 RabbitMQ 服务发生了重启或者是宕机&…

【Android】浅析MVC与MVP

【Android】浅析MVC与MVP 什么是架构&#xff1f; 架构&#xff08;Architecture&#xff09;在软件开发中指的是软件系统的整体设计和结构&#xff0c;它描述了系统的高层组织方式&#xff0c;包括系统中各个组件之间的关系、依赖、交互方式&#xff0c;以及这些组件如何协同…

基于OpenCV的YOLOv5图片检测

利用OpenCV的DNN模块加载onnx模型文件进行图片检测。 1、使用的yolov5工程代码&#xff0c;调用export.py导出onnx模型。 2、下载opencv版本&#xff0c;https://opencv.org/releases/ 使用opencv版本4.5.3或以上&#xff0c;本文使用的opencv4.6.0 3、使用vc20…

4.使用 VSCode 过程中的英语积累 - View 菜单(每一次重点积累 5 个单词)

前言 学习可以不局限于传统的书籍和课堂&#xff0c;各种生活的元素也都可以做为我们的学习对象&#xff0c;本文将利用 VSCode 页面上的各种英文元素来做英语的积累&#xff0c;如此做有 3 大利 这些软件在我们工作中是时时刻刻接触的&#xff0c;借此做英语积累再合适不过&a…

STM32 使用 CubeMX 实现按键外部中断

目录 问题背景知识参考需要改什么注意尽量不要在中断函数使用 循环函数做延时中断函数中延时方法调试 问题 我想实现按钮触发紧急停止类似功能&#xff0c;需要使用按键中断功能。 背景知识 GPIO 点亮 LED。stm32cubemx hal学习记录&#xff1a;GPIO输入输出。STM32—HAL库 …

【实战篇】MySQL是怎么保证高可用的?

背景 在一个主备关系中&#xff0c;每个备库接收主库的 binlog 并执行。正常情况下&#xff0c;只要主库执行更新生成的所有 binlog&#xff0c;都可以传到备库并被正确地执行&#xff0c;备库就能达到跟主库一致的状态&#xff0c;这就是最终一致性。 但是&#xff0c;MySQL…