当前位置: 首页 > news >正文

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;  // 程序结束
}

三、实现效果

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 中国计算机学会(CCF)推荐中文科技期刊目录(2019年)
  • 【云原生监控】Prometheus之Alertmanager报警
  • SpringBoot 消息队列RabbitMQ 消息确认机制确保消息发送成功和失败 生产者确认
  • 什么是HTTP DDOS,如何防护
  • C++速通LeetCode中等第12题-矩阵置零(空间O(1)含注释)
  • xml中的转义字符
  • Java-使用反射来处理对象,并构建新的JSON数据结构
  • windows C++ 并行编程-异步消息块(四)
  • Java集合(List篇)
  • fiddler抓包06_抓取https请求(chrome)
  • 财富通公司开发维修售后小程序,解决售后维修问题
  • 【摘抄】软件工程师认知
  • 量子噪声流加密(一:整体框架描述)
  • 惠海H6118 DC-DC 降压恒流芯片30V36v40V48V降12V9V24V36V 1.2A大电流 调光降压芯片IC舞台灯
  • 学习CubeIDE——外设中断开发
  • 【跃迁之路】【519天】程序员高效学习方法论探索系列(实验阶段276-2018.07.09)...
  • android高仿小视频、应用锁、3种存储库、QQ小红点动画、仿支付宝图表等源码...
  • Hexo+码云+git快速搭建免费的静态Blog
  • JS题目及答案整理
  • Linux中的硬链接与软链接
  • MySQL常见的两种存储引擎:MyISAM与InnoDB的爱恨情仇
  • 基于Dubbo+ZooKeeper的分布式服务的实现
  • 软件开发学习的5大技巧,你知道吗?
  • 消息队列系列二(IOT中消息队列的应用)
  • 一起参Ember.js讨论、问答社区。
  • 译自由幺半群
  • 因为阿里,他们成了“杭漂”
  • 在 Chrome DevTools 中调试 JavaScript 入门
  • MiKTeX could not find the script engine ‘perl.exe‘ which is required to execute ‘latexmk‘.
  • 正则表达式-基础知识Review
  • ​埃文科技受邀出席2024 “数据要素×”生态大会​
  • ​你们这样子,耽误我的工作进度怎么办?
  • # 深度解析 Socket 与 WebSocket:原理、区别与应用
  • #!/usr/bin/python与#!/usr/bin/env python的区别
  • #162 (Div. 2)
  • ( 10 )MySQL中的外键
  • (1)SpringCloud 整合Python
  • (16)Reactor的测试——响应式Spring的道法术器
  • (2009.11版)《网络管理员考试 考前冲刺预测卷及考点解析》复习重点
  • (52)只出现一次的数字III
  • (6)设计一个TimeMap
  • (C语言)字符分类函数
  • (二)Kafka离线安装 - Zookeeper下载及安装
  • (二)十分简易快速 自己训练样本 opencv级联lbp分类器 车牌识别
  • (附源码)基于SSM多源异构数据关联技术构建智能校园-计算机毕设 64366
  • (回溯) LeetCode 46. 全排列
  • (一)C语言之入门:使用Visual Studio Community 2022运行hello world
  • (转) Face-Resources
  • *++p:p先自+,然后*p,最终为3 ++*p:先*p,即arr[0]=1,然后再++,最终为2 *p++:值为arr[0],即1,该语句执行完毕后,p指向arr[1]
  • .net下简单快捷的数值高低位切换
  • @autowired注解作用_Spring Boot进阶教程——注解大全(建议收藏!)
  • @media screen 针对不同移动设备
  • @PostConstruct 注解的方法用于资源的初始化
  • [023-2].第2节:SpringBoot中接收参数相关注解
  • [ActionScript][AS3]小小笔记