PCL addLine可视化K近邻

目录

一、概述

1.1原理

1.2实现步骤

1.3应用场景

二、代码实现

2.1关键函数

2.2完整代码

三、实现效果


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

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


一、概述

        本文将介绍如何使用PCL库中的 addLine 方法可视化K近邻搜索的结果。K近邻搜索(K-Nearest Neighbors, KNN)用于查找点云中与查询点最近的K个点。可视化K近邻搜索的结果有助于直观地理解点与其邻居之间的空间关系。我们将在点云中绘制查询点与其K个最近邻点之间的连线,并将其可视化。

1.1原理

        K近邻搜索的基本原理是通过KD树(k-D Tree)对点云数据进行高效的空间索引和查询。KD树通过递归地将数据空间划分为多个超平面,以便快速查找与查询点距离最近的K个点。通过在查询点与这些邻近点之间绘制连线,我们可以直观地看到查询点与其最近邻点的关系。

1.2实现步骤

  1. 读取点云数据并构建KD树。
  2. 执行K近邻搜索,找到与查询点最近的K个点。
  3. 在查询点与其K个最近邻点之间绘制连线。
  4. 将原始点云、查询点及其近邻关系进行可视化展示。

1.3应用场景

  1. 邻域分析:分析点云中某点的局部邻域结构,应用于点云滤波、配准等任务。
  2. 数据可视化:通过可视化邻域关系,直观展示点云数据中点的分布及空间关系。
  3. 3D特征检测:在3D特征提取中,通过邻域关系识别点云中的几何特征。

二、代码实现

2.1关键函数

  • nearestKSearch:执行K近邻搜索,找到指定点的K个最近邻点。
  • addLine:在查询点与其K个最近邻点之间绘制连线。
  • pcl::visualization::PCLVisualizer:用于可视化点云和K近邻搜索结果。

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 <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>("bunny.pcd", *cloud) == -1){PCL_ERROR("Couldn't read file!");  // 如果文件加载失败,输出错误信息return -1;  // 返回错误代码并退出程序}// -----------------------------K近邻搜索---------------------------------pcl::KdTreeFLANN<pcl::PointXYZ> kdtree;  // 创建KD树对象kdtree.setInputCloud(cloud);  // 设置KD树的输入点云// 定义查询点,选择点云中的某个点作为查询点pcl::PointXYZ searchPoint = cloud->points[2000];  // 这里假设使用点云中的第2000个点int K = 1000;  // 设置K值,表示查找的最近邻点的数量vector<int> pointIdxNKNSearch(K);  // 用于存储最近邻点的索引vector<float> pointNKNSquaredDistance(K);  // 用于存储最近邻点与查询点之间的距离平方值// 执行K近邻搜索if (kdtree.nearestKSearch(searchPoint, K, pointIdxNKNSearch, pointNKNSquaredDistance) > 0){// 如果搜索成功,将搜索到的邻近点存储到pointIdxNKNSearch中}// -----------------------------结果可视化------------------------------------// 创建PCLVisualizer对象,用于显示点云和邻近关系boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer(new pcl::visualization::PCLVisualizer("3D Viewer"));viewer->setBackgroundColor(0, 0, 0);  // 设置背景颜色为黑色// 将原始点云添加到可视化窗口,并设置颜色为绿色pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> single_color(cloud, 0, 255, 0);  // 绿色viewer->addPointCloud<pcl::PointXYZ>(cloud, single_color, "sample cloud");// 将查询点标记为红色pcl::PointCloud<pcl::PointXYZ>::Ptr searchPointCloud(new pcl::PointCloud<pcl::PointXYZ>());searchPointCloud->points.push_back(searchPoint);pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> red_color(searchPointCloud, 255, 0, 0);  // 红色viewer->addPointCloud<pcl::PointXYZ>(searchPointCloud, red_color, "search point");viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 5, "search point");  // 设置查询点的大小// 在查询点与其K个最近邻点之间绘制连线for (size_t i = 0; i < pointIdxNKNSearch.size(); ++i){// 获取最近邻点的坐标pcl::PointXYZ neighborPoint = cloud->points[pointIdxNKNSearch[i]];// 添加从查询点到该邻近点的连线,颜色为白色viewer->addLine<pcl::PointXYZ>(searchPoint, neighborPoint, 255, 255, 255, "line" + std::to_string(i));}// 进入主循环,保持窗口打开while (!viewer->wasStopped()){viewer->spinOnce(100);  // 刷新窗口//boost::this_thread::sleep(boost::posix_time::microseconds(100000));}return 0;  // 程序结束
}

三、实现效果

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

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

相关文章

Unreal Engine 5 C++: 编辑器工具编写入门(中文解释)

目录 准备工作 1.创建插件 2.修改插件设置 快速资产操作&#xff08;quick asset action) 自定义编辑器功能 0.创建编辑器button&#xff0c;测试debug message功能 大致流程 详细步骤 1.ctrlF5 launch editor 2.创建新的cpp class&#xff0c;derived from AssetAction…

基于PHP的CRM管理系统源码/客户关系管理CRM系统源码/php源码/附安装教程

源码简介&#xff1a; 这是一款基于PHP开发的CRM管理系统源码&#xff0c;全称客户关系管理CRM系统源码&#xff0c;它是由php源码开发的&#xff0c;还附带了一整套详细的安装教程哦&#xff01; 功能亮点&#xff1a; 1、公海管理神器&#xff1a;不仅能搞定公海类型&…

【自然语言处理】补充:布尔模型

【自然语言处理】补充:布尔模型 布尔检索是指针对查询的检索,布尔查询是指利用AND,OR或者NOT操作符将词项连接起来的查询,例如:信息AND检索、信息OR检索、信息AND检索AND NOT教材 Google的高级搜索/布尔查询 Google的AND—百度 “ 手机 报价 ”Google的NOT—百度 “ 手机…

关于MATLAB计算3维图的向量夹角总是不正确的问题记录

文章目录 问题描述解决方法完整代码 问题描述 因为最近在做无人机的一个项目&#xff0c;所以需要画出无人机的轨迹&#xff0c;然后再提取特征值&#xff0c;我这里在计算夹角的时候发现为什么在视觉上明明看的是钝角但是实际计算出来却是锐角的角度。 如下图所示&#xff0c…

Spring面试题合集

Spring 1.谈谈你对Spring的理解 首先Spring是一个轻量级的开源框架&#xff0c;为Java程序的开发提供了基础架构支持&#xff0c;简化了应用开发&#xff0c;让开发者专注于开发逻辑&#xff1b; 同时Spring是一个容器&#xff0c;它通过管理Bean的生命周期和依赖注入&#…

无处不在的人工智能

文章目录 引言科幻电影中的AI《她》&#xff1a;人工智能的爱情《我&#xff0c;机器人》&#xff1a;AI的觉醒 人工智能的发展现状专用人工智能的突破通用人工智能的起步 结语 引言 在21世纪的今天&#xff0c;人工智能&#xff08;AI&#xff09;已经成为推动社会发展的关键…

英集芯IP5902:集成电压可调异步升压转换充电管理功能的8位MCU芯片

英集芯IP5902是一款集成了9V异步升压转换、锂电池充电管理及负端NMOS管的8-bit MCU芯片&#xff0c;外壳采用了SOP16封装形式&#xff0c;高集成度和丰富的功能使其在应用时只需很少的外围器件&#xff0c;就能有效减小整体方案的尺寸&#xff0c;降低BOM成本&#xff0c;为小型…

dockercompose指定配置文件

dockercompose指定配置文件 文件名字必须是以下的集中形式&#xff1a; docker-compose.yaml docker-compose.yml compose.yaml compose.yml 其他名字就失败的。 一般白眉大叔都是用 compose.yaml 这个格式&#xff0c; 用习惯了。 但是我们必须知道它有几种格式都是可以…

聚焦于 Web 性能指标 TTI

在优化网站性能的过程中&#xff0c;我们经常遇到一个“为指标而优化”的困境。指标并不能真正反映用户体验&#xff0c;而应该最真实地反映用户行为。 在本节中&#xff0c;我们将研究 TTI&#xff08;Time to Interactive&#xff09;。在深入探讨这个话题之前&#xff0c;我…

信奥初赛解析:1-3-计算机软件系统

知识要点 软件系统是计算机的灵魂。没有安装软件的计算机称为“裸机”&#xff0c;无法完成任何工作硬件为软件提供运行平台。软件和硬件相互关联,两者之间可以相互转化&#xff0c;互为补充 计算机软件系统按其功能可分为系统软件和应用软件两大类 一、系统软件 系统软件是指…

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

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

【操作教程】视频监控系统EasyCVR视频汇聚管理平台如何添加用户和角色?

视频监控平台/视频监控系统EasyCVR视频汇聚管理平台以其强大的拓展性、灵活的部署方式、高性能的视频能力和智能化的分析能力&#xff0c;为各行各业的视频监控需求提供了优秀的解决方案。通过简单的配置和操作&#xff0c;用户可以轻松地进行远程视频监控、存储和查看&#xf…

永磁同步电机谐波抑制算法(8)——基于神经网络的傻瓜式(无需知道谐波频率)谐波抑制

1.简介 前面的内容已经介绍了很多谐波抑制的方法&#xff1a;多同步、PIR、陷波器等等。也介绍了比较多的谐波来源&#xff1a;死区&#xff08;5、7、11、13等次相电流谐波&#xff09;、绕组不对称&#xff08;基波不等幅值、3次相电流谐波&#xff09;等等。 上述的方法都…

vue3集成google第三方登陆

网上资源很多&#xff0c;但乱七八糟&#xff0c;踩坑几小时后&#xff0c;发现下面的方式没问题。 npm install vue3-google-login 插件文档&#xff1a;vue3-google-登录 (devbaji.github.io) 修改main.js import ./assets/main.css import { createApp } from vue impor…

Dockerfile部署xxljob

使用Dockerfile部署xxljob 1. 背景 我们在使用定时任务调度时&#xff0c;通常会使用xxljob容器化部署xxljob&#xff0c;通常使用 docker pull xuxueli/xxl-job-admin:2.4.0 拉取镜像并启动容器。这种方式对于x86架构服务器来说&#xff0c;没有任何问题。但是在arm架构的服…

结构体、共用体、Makefile

一、结构体 1.1 结构体变量的初始化和赋值的方式 struct Student{int id;char name[32];int score; } struct Student s; s.id 1001; strcpy(s.name,"zhangsan"); s.score 98; struct Student{int id;char name[32];int score; }s; s.id 1001; strcpy(s.name,&…

数据清洗与预处理:从网页中提取的数据处理技术

目录 引言 一、数据清洗与预处理概述 1.1 数据清洗的定义 1.2 数据清洗的重要性 二、数据清洗与预处理的步骤 2.1 数据获取 2.2 数据去重 2.3 缺失值处理 2.4 异常值处理 2.5 数据格式化与标准化 2.6 数据转换与编码 2.7 数据整合与关联 2.8 数据可视化 三、技术…

C++11——function与bind

包装器 function包装器function的介绍function的使用function的使用场景function的意义 bind包装器bind的介绍bind的使用 function包装器 function的介绍 function是用来包装函数的&#xff0c;所以叫做包装器或者适配器&#xff0c;fuction的本质其实是一个类模板。 functio…

基于多域名,通过云运营商弹性负载,Nginx配置等基于的多租户系统部署

已经开发好久的系统&#xff0c;因为业务上没有需求&#xff0c;没有做上线部署&#xff0c;此系统为多租户系统&#xff0c;原来设计是通过租户码参数来识别的&#xff0c;每个租户访问&#xff0c;需要传自己的码过来&#xff0c;才能确定是哪个租户登录系统&#xff0c; 今…

数据结构和算法之树形结构(1)

文章出处: 数据结构和算法之树形结构(1) 关注码农爱刷题&#xff0c;看更多技术文章&#xff01;&#xff01; 树形结构是数据结构四种逻辑结构之一&#xff0c;也是被广泛使用的一种逻辑结构&#xff0c;它描述的是数据元素之间一对多的逻辑关系。树是一种非线性的数据结构&a…