首页 > 其他分享 >PCL 使用八叉树进行点云变化检测

PCL 使用八叉树进行点云变化检测

时间:2024-09-28 15:51:46浏览次数:3  
标签:变化检测 PCL visualization viewer 八叉树 changed points octree pcl

目录

一、概述

  PCL中的 pcl::octree::OctreePointCloudChangeDetector函数能够实现同时构建八叉树并完成空间变化检测。

二、代码

#include <iostream>
#include <pcl/io/pcd_io.h>
#include <pcl/point_types.h>
#include <pcl/octree/octree_pointcloud_changedetector.h>
#include <pcl/visualization/pcl_visualizer.h>

int main(int argc, char** argv)
{
    // 读取点云数据
    pcl::PointCloud<pcl::PointXYZ>::Ptr cloudSre(new pcl::PointCloud<pcl::PointXYZ>);
    pcl::PointCloud<pcl::PointXYZ>::Ptr cloudTat(new pcl::PointCloud<pcl::PointXYZ>);
    if (pcl::io::loadPCDFile<pcl::PointXYZ>("lamp.pcd", *cloudSre) == -1 ||
        pcl::io::loadPCDFile<pcl::PointXYZ>("lamp1.pcd", *cloudTat) == -1)
    {
        PCL_ERROR("Couldn't read the PCD files!\n");
        return -1;
    }
    // 构建八叉树并检测变化
    float resolution = 0.05f;  // 八叉树的分辨率
    pcl::octree::OctreePointCloudChangeDetector<pcl::PointXYZ> octree(resolution);

    // 添加第一个点云到八叉树
    octree.setInputCloud(cloudSre);
    octree.addPointsFromInputCloud();
    // 切换到第二个点云并检测变化
    octree.switchBuffers();  // 切换缓存
    octree.setInputCloud(cloudTat);
    octree.addPointsFromInputCloud();  // 添加第二组点云
    // 获取变化的点索引
    std::vector<int> newPointIdxVector;
    octree.getPointIndicesFromNewVoxels(newPointIdxVector);
    // 输出可视化结果到渲染窗口
    pcl::visualization::PCLVisualizer::Ptr viewer(new pcl::visualization::PCLVisualizer("Change Detection Viewer"));
    viewer->setBackgroundColor(0.0, 0.0, 0.0);  // 黑色背景
    // 显示第一组点云(绿色)
    pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> cloud1_color_handler(cloudSre, 0, 255, 0);
    viewer->addPointCloud(cloudSre, cloud1_color_handler, "cloud1");
    // 显示变化的点(红色)
    pcl::PointCloud<pcl::PointXYZ>::Ptr changed_points(new pcl::PointCloud<pcl::PointXYZ>);
    pcl::copyPointCloud(*cloudTat, newPointIdxVector, *changed_points);  // 将变化的点拷贝出来
    pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> changed_points_color_handler(changed_points, 255, 0, 0);
    viewer->addPointCloud(changed_points, changed_points_color_handler, "changed_points");
    // 设置点的大小
    viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 2, "cloud1");
    viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 4, "changed_points");
    // 添加坐标系
    viewer->addCoordinateSystem(1.0);
    viewer->initCameraParameters();
    // 可视化
    while (!viewer->wasStopped())
    {
        viewer->spinOnce(100);
    }

    return 0;
}

三、结果

在这里插入图片描述

标签:变化检测,PCL,visualization,viewer,八叉树,changed,points,octree,pcl
From: https://blog.csdn.net/m0_51204289/article/details/142548719

相关文章

  • 三维点云使用pcl实现RANSAC平面分割
    小白每日一练!点云分割分割是将点云划分为多个部分的过程,每个部分代表不同的物体或表面。在这里,我们使用RANSAC算法来识别和分离平面。(以ModelNet40为例)完整代码放在最后面啦!!测试好了可以直接使用!!RANSAC算法RANSAC算法是一种用于从一组包含异常数据的观测数据中估计数学模......
  • PCL 点云中的数学
    函数求导方差&协方差矩阵基本概念方差(Variance)衡量的是单个随机变量的变化(比如一个人在群体中的身高),概率论中方差用来度量随机变量和其数学期望(即均值)之间的偏离程度。标准差(StandardDeviation)是方差的算术平方根,用σ表示。标准差能反映一个数据集的离散程度。协方......
  • PCL 点云表面法线估算
    估算点云表面法线表面法线是几何表面的重要属性,在许多领域(例如计算机图形应用程序)中大量使用,以应用正确的光源以产生阴影和其他视觉效果。给定一个几何表面,通常很难将表面某个点的法线方向推断为垂直于该点表面的向量。但是,由于我们获取的点云数据集是真实表面上的一组点......
  • PCL 3D特征描述子
    特征描述子FeatureDescriptor是每个特征点独特的身份认证同一空间点在不同视角的特征点具有高度相似的描述子不同特征点的描述子差异性尽量大通常描述子是一个具有固定长度的向量描述子可以分为以下几种类型:基于不变性的描述子、基于直方图的描述子、二进制描述子PC......
  • 变化检测从 Angular zonejs) 到 Angular (provideExperimentalZonelessChangeDetectio
    更改检测是angular的一个基本方面,负责识别和更新dom中因数据修改或用户交互而发生更改的部分。此过程可确保ui与底层数据保持一致,从而增强用户体验和应用程序性能。zone.js的作用从历史上看,angular一直依赖zone.js来实现其变更检测机制。zone.js是一个拦截异步......
  • PCL 计算点云距离
    文章目录一、简介二、实现代码三、实现效果参考资料一、简介顾名思义,这个就是计算点云中每个点到另一个点云最近的距离,之后我们可以基于这些距离做一些预处理工作。思路其实很简单,通过对点云构建kdtree并采用并行的方式实现该计算过程。二、实现代码ColorR......
  • 11 - TCPClient实验
    在上一个章节的UDP通信测试中,尽管通信的实现过程相对简洁,但出现了通信数据丢包的问题。因此,本章节将基于之前建立的WIFI网络连接,构建一个基础的TCPClient连接机制。我们利用网络调试助手工具来发送数据,测试网络通信中接收到的数据能够准确无误地回传。本节课目标:在本次实验......
  • httpclient PoolingHttpClientConnectionManager 连接池使用举例
    1.1TIME_WAIT状态连接的原因和解决策略大量短连接大量短暂的连接会导致短时间内生成大量的TIME_WAIT状态连接。解决方案:尽量使用长连接,减少连接的创建和销毁次数。TCP时间等待池溢出如果服务器短时间内有大量的连接进入TIME_WAIT状态,可能会导致TCP时间等待池溢出。解决方案:可以......
  • 保持使用全局 HttpClient,但确保不同请求的 HttpRequestMessage 独立
    保持使用全局HttpClient,但确保不同请求的HttpRequestMessage独立这是推荐的最佳实践,因为HttpClient是设计为可重用的,你可以使用独立的HttpRequestMessage来确保每个请求有独立的请求头,而不影响其他请求。 privatestaticreadonlyHttpClientclient=newHtt......
  • HttpClient 和 HttpGet 都设置了,setConnectTimeout 和 setReadTimeout/setSocketTimeo
    在使用ApacheHttpClient时,如果你分别在HttpClient和HttpGet(或其他请求对象)上都设置了setConnectTimeout和setReadTimeout(也叫setSocketTimeout),那么最终生效的配置是HttpGet(或请求对象)的配置优先,即请求对象上的超时设置会覆盖全局HttpClient的设置。具体规则说明:H......