欧式聚类提取-------PCL

news/2025/1/16 3:48:29/

欧式聚类

std::vector<pcl::PointCloud<pcl::PointXYZ>::Ptr> PclTool::euclideanClustering(const pcl::PointCloud<pcl::PointXYZ>::Ptr& cloud)
{std::vector<pcl::PointCloud<pcl::PointXYZ>::Ptr> clustered_clouds;// 下采样pcl::VoxelGrid<pcl::PointXYZ> vg;pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_filtered(new pcl::PointCloud<pcl::PointXYZ>);vg.setInputCloud(cloud);vg.setLeafSize(0.01f, 0.01f, 0.01f);vg.filter(*cloud_filtered);// 创建平面模型分割的对象并设置参数pcl::SACSegmentation<pcl::PointXYZ> seg;pcl::PointIndices::Ptr inliers(new pcl::PointIndices);pcl::ModelCoefficients::Ptr coefficients(new pcl::ModelCoefficients);pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_plane(new pcl::PointCloud<pcl::PointXYZ>());seg.setOptimizeCoefficients(true);seg.setModelType(pcl::SACMODEL_PLANE);  // 分割模型seg.setMethodType(pcl::SAC_RANSAC);     // 随机参数估计方法seg.setMaxIterations(100);              // 最大的迭代的次数seg.setDistanceThreshold(0.02);         // 设置阀值pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_f(new pcl::PointCloud<pcl::PointXYZ>);int i = 0, nr_points = (int)cloud_filtered->points.size();while (cloud_filtered->points.size() > 0.3 * nr_points)  // 滤波停止条件{// Segment the largest planar component from the remaining cloudseg.setInputCloud(cloud_filtered);  // 输入seg.segment(*inliers, *coefficients);if (inliers->indices.size() == 0){std::cout << "Could not estimate a planar model for the given dataset." << std::endl;break;}pcl::ExtractIndices<pcl::PointXYZ> extract;extract.setInputCloud(cloud_filtered);extract.setIndices(inliers);extract.setNegative(false);// Get the points associated with the planar surfaceextract.filter(*cloud_plane);  // [平面std::cout << "PointCloud representing the planar component: " << cloud_plane->points.size() << " data points." << std::endl;//  // 移去平面局内点,提取剩余点云extract.setNegative(true);extract.filter(*cloud_f);*cloud_filtered = *cloud_f;}// 创建KdTree对象用于欧式聚类的搜索pcl::search::KdTree<pcl::PointXYZ>::Ptr tree(new pcl::search::KdTree<pcl::PointXYZ>);tree->setInputCloud(cloud_filtered);std::vector<pcl::PointIndices> cluster_indices;pcl::EuclideanClusterExtraction<pcl::PointXYZ> ec;  // 欧式聚类对象ec.setClusterTolerance(0.02);                       // 设置聚类容差为2cmec.setMinClusterSize(100);                          // 设置一个聚类的最小点数为100ec.setMaxClusterSize(25000);                        // 设置一个聚类的最大点数为25000ec.setSearchMethod(tree);                           // 设置搜索方法ec.setInputCloud(cloud_filtered);ec.extract(cluster_indices);  // 从点云中提取聚类// 迭代聚类索引并创建每个聚类的点云for (std::vector<pcl::PointIndices>::const_iterator it = cluster_indices.begin(); it != cluster_indices.end(); ++it){pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_cluster(new pcl::PointCloud<pcl::PointXYZ>);for (std::vector<int>::const_iterator pit = it->indices.begin(); pit != it->indices.end(); ++pit)cloud_cluster->points.push_back(cloud_filtered->points[*pit]);cloud_cluster->width = cloud_cluster->points.size();cloud_cluster->height = 1;cloud_cluster->is_dense = true;clustered_clouds.push_back(cloud_cluster);}return clustered_clouds;
}

原始点云

在这里插入图片描述
聚类后得到五个点云

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述


http://www.ppmy.cn/news/1457251.html

相关文章

【系统架构师】-选择题(十五)

1、实时操作系统&#xff08;RTOS&#xff09;内核与应用程序之间的接口称为&#xff08;API&#xff09; PCI是外设部件互连标准 GUI&#xff0c;图形用户界面&#xff0c;是用户与操作系统之间的接口 2、基于网络的数据库&#xff08;Netware Database&#xff0c;NDB&#x…

PyRun_SimpleString(“import cv2“); 报错解决

#include <Python.h> #include <iostream>using namespace std;int main() {Py_Initialize();if (!Py_IsInitialized()){printf("初始化失败&#xff01;");return 0;}PyRun_SimpleString("import sys");PyRun_SimpleString("sys.path.ap…

【go项目01_学习记录03】

学习记录 1 路由http.ServeMux1.1 查看HandleFunc方法源码1.2 查看ListenAndServe方法源码1.3 重构&#xff1a;使用自定义的 ServeMux1.4 http.ServeMux 的局限性1.4.1 URI 路径参数1.4.2 请求方法过滤1.4.3 不支持路由命名 1.5 http.ServeMux 的优缺点 1 路由http.ServeMux …

无线通信基础

这里写目录标题 通信概述什么是无线通信无线通信电磁波 通信概述 什么是无线通信 无线通信 : 是指利用电磁波信号可以在自由空间中传播的特性进行信息交换的一种通信方式 无线通信的关键技术包括调制技术、解调技术、信道编码技术、信号处理技术、天线技术等。这些技术的不断…

编程新伙伴:如何利用ChatGPT提升代码编写效率

编程是一项既需要逻辑思维又需要创造性的技术活动。而现在&#xff0c;ChatGPT&#xff0c;一款由OpenAI研发的人工智能&#xff0c;可以帮助你更高效地编写代码。这款AI工具被设计成理解和产生人类的自然语言&#xff0c;现在也得以应用于编程领域。那么&#xff0c;ChatGPT如…

3GPP官网下载协议步骤

1.打开官网 https://www.3gpp.org/ 2.点击 3.在界面选择要找的series&#xff0c;跳转到查找界面 以V2X通信协议为例&#xff0c;论文中通常会看到许多应用&#xff1a; [7] “Study on evaluation methodology of new Vehicle-to-Everything (V2X) use cases for LTE and NR…

【西瓜书机器学习】第五章 神经网络

一起啃西瓜书(5)-神经网络《机器学习-周志华》 - 知乎 (zhihu.com)参考进行自我复习整理&#xff0c;侵删&#xff01; 1、神经元模型 神经网络定义&#xff1a;神经网络是由 具有适应性 的 简单单元 组成的广泛 并行互连 的网络。M-P神经元模型&#xff1a;输入、处理、输出 …

浮动以及如何清除浮动

什么是浮动&#xff0c;先来看浮动的定义 在网页设计中&#xff0c;"浮动"是一种布局技术&#xff0c;用于控制元素在页面中的位置。浮动元素会脱离正常的文档流&#xff0c;并移动到其容器的左侧或右侧&#xff0c;允许其他内容环绕它。 通常&#xff0c;浮动被用于…