首先在获取的大场景范围下,点云中不可避免地存在大量的噪声信息,为了防止这些噪声点在对点云数据进行特征提取时造成干扰,对点云数据进行预处理排除噪声干扰。噪声通常是个数较少且散乱分布的离群点,以前尝试过先对点云进行半径滤波,直通滤波之类的噪声以及非目标点的提出,再使用聚类的方法进行目标物体分割。但是本次想直接尝试一下在有点云数据的基础上直接进行聚类。根据激光扫描的特点,激光扫描数据的聚类算法的整体思路为:如果当前扫描点与前一个扫描点的距离在预设阈值范围内,则当前点被聚到前一个扫描点的类中;否则,把当前扫描点设置为新的聚类种子,根据预设阈值判断下一个扫描点是否与该种子属于同一类。重复以上步骤,直到所有的点都被聚到不同的类中。通过聚类,可以减少物体边界点对特征点检测的影响,同时,对于点云中不规则的离散点,往往其所在类的尺寸较小,很容易将其滤掉。由于特征提取中常使用的搜索算法在小范围内的计算效率也远高于整体范围,因此点云聚类也有助于加速特征提取。

//欧式距离聚类,实现点云分割
#include "pch.h"
#include <pcl/ModelCoefficients.h>
#include <pcl/point_types.h>
#include <pcl/io/pcd_io.h>
#include <pcl/filters/extract_indices.h>
#include <pcl/filters/voxel_grid.h>
#include <pcl/features/normal_3d.h>
#include <pcl/kdtree/kdtree.h>
#include <pcl/sample_consensus/method_types.h>
#include <pcl/sample_consensus/model_types.h>
#include <pcl/segmentation/sac_segmentation.h>
#include <pcl/segmentation/extract_clusters.h>
#include <iostream>
using namespace std;int
main(int argc, char** argv)
{// 申明存储点云的对象.pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);//读取Pcd文件if (pcl::io::loadPCDFile<pcl::PointXYZ>("C://Users//HEHE//Desktop//flange_filter3_Radius_filter2.pcd", *cloud) == -1)    {       PCL_ERROR("Cloudn't read file!");        return -1;  } cout << "there are " << cloud->points.size()<<" points before filtering." << endl;     // 建立kd-tree对象用来搜索 .pcl::search::KdTree<pcl::PointXYZ>::Ptr kdtree(new pcl::search::KdTree<pcl::PointXYZ>);kdtree->setInputCloud(cloud);// Euclidean 聚类对象.pcl::EuclideanClusterExtraction<pcl::PointXYZ> clustering;//类EuclideanClusterExtraction是基于欧式距离进行聚类分割的类clustering.setClusterTolerance(4.0);//设置在欧氏空间中所使用的搜索半径设置的过小可能导致聚类被划分到几个集群,设置的过大可能将聚类进行联通clustering.setMinClusterSize(100);// 设置聚类包含的的最小点数目clustering.setMaxClusterSize(25000); //设置聚类包含的的最大点数目clustering.setSearchMethod(kdtree);//类的关键成员函数clustering.setInputCloud(cloud);//指定输入的点云进行聚类分割std::vector<pcl::PointIndices> clusters;// cluster存储点云聚类分割的结果。PointIndices存储对应点集的索引clustering.extract(clusters);// For every cluster...int currentClusterNum = 1;for (std::vector<pcl::PointIndices>::const_iterator i = clusters.begin(); i != clusters.end(); ++i){//添加所有的点云到一个新的点云中pcl::PointCloud<pcl::PointXYZ>::Ptr cluster(new pcl::PointCloud<pcl::PointXYZ>);for (std::vector<int>::const_iterator point = i->indices.begin(); point != i->indices.end(); point++)cluster->points.push_back(cloud->points[*point]);cluster->width = cluster->points.size();cluster->height = 1;cluster->is_dense = true;// 保存if (cluster->points.size() <= 0)break;std::cout << "Cluster " << currentClusterNum << " has " << cluster->points.size() << " points." << std::endl;std::string fileName = "C://Users//HEHE//Desktop//cluster" + boost::to_string(currentClusterNum) + ".pcd";pcl::io::savePCDFileASCII(fileName, *cluster);currentClusterNum++;}
}

1.(基于欧式距离聚类实现的点云分割)相关推荐

  1. Java实现的基于欧式距离的聚类算法的Kmeans作业

    Kmeans作业 环境配置 java环境,使用原生的Java UI组件JPanel和JFrame 算法原理 基于欧式距离的聚类算法,其认为两个目标的距离越近,相似度越大. 该实验产生的点为二维空间中的 ...

  2. PCL 的欧式距离聚类

    PCL 的欧式距离聚类 (感谢前辈) 转自:https://zhuanlan.zhihu.com/p/75117664 聚类代码如下: from paper_1_v0.my_ransac import ...

  3. 基于欧式距离分类问题的数据标准化处理

    机器学习中的分类模型,有一些是基于欧式距离的,如K-means模型.当样本的特征较多时, 即使上万的数据分布在较高维数空间中,其样本仍会显得比较稀疏. 为了不使得样本间的距离过大,需要对数据进行标准化 ...

  4. 无人驾驶汽车系统入门(二十五)——基于欧几里德聚类的激光雷达点云分割及ROS实现

    无人驾驶汽车系统入门(二十五)--基于欧几里德聚类的激光雷达点云分割及ROS实现 上一篇文章中我们介绍了一种基于射线坡度阈值的地面分割方法,并且我们使用pcl_ros实现了一个简单的节点,在完成了点云 ...

  5. 点云分割之欧式距离聚类

    是一种层次聚类的方法 欧几里德算法具体的实现方法大致是: 1 找到空间中某点p10,有kdTree找到离他最近的n个点,判断这n个点到p的距离.将距离小于阈值r的点p12,p13,p14....放在类 ...

  6. 【欧式距离:二维和三维定位算法】

    [关于开发UWB模块所使用的二维和三维定位算法] 本文将介绍开发UWB模块中所使用到的二维定位算法(三点定位算法) 链接:三维空间的构建(四点定位算法) 内容概览 概念介绍 需要的材料 算法 欧几里得 ...

  7. 单木分割实验之距离聚类(实验五)

    单单木分割实验之距离聚类 实验原理 实验效果 实验代码 实验原理 在从原始点云中准确提取到树木后,需要对树木点云进行单体化处理,叫做单木分割,树木之间存在一定距离,通过欧式距离聚类即可进行简单的单木分 ...

  8. 【点云处理】基于欧式聚类的点云分割

    对于范围较广的点云来说,一开始先使用基于模型的点云分割方法将类似于平面这样的点云块提出来,然后在对留下的小部分点云进行像欧式聚类这样的后续分割处理. 原始点云: 代码,对代码的理解都注释上了,以便于以 ...

  9. 【数据挖掘】基于层次的聚类方法 ( 聚合层次聚类 | 划分层次聚类 | 族间距离 | 最小距离 | 最大距离 | 中心距离 | 平均距离 | 基于层次聚类步骤 | 族半径 )

    文章目录 基于层次的聚类方法 简介 基于层次的聚类方法 概念 聚合层次聚类 图示 划分层次聚类 图示 基于层次的聚类方法 切割点选取 族间距离 概念 族间距离 使用到的变量 族间距离 最小距离 族间距 ...

最新文章

  1. 遗传算法与C++实现
  2. Vue教程1 【Vue核心】
  3. SDWebImage开源库阅读分析(全)
  4. ViSP中AprilTag的实时识别与定位
  5. 在Windows环境下编译cocos2d-x-3.0
  6. java int.parse_java数据类型转换,parseXXX(String)或valueOf(String)有什么区别?
  7. 《看聊天记录都学不会C语言?太菜了吧》(11)2分钟领悟数组
  8. python输入正整数n、求n以内能被17整除的最大正整数_求100之内自然数中最大的能被17整除的数资料...
  9. 最贵5000!小米最贵旗舰MIX 3发布,雷军:干翻华为
  10. php 顺序排序,PHP顺序排序
  11. HCIE-Security Day2:防火墙安全区域、安全级别的理解
  12. sumo添加车辆_SUMO 交通控制接口 —— TraCI
  13. 基于图像识别的火灾检测系统设计思路流程
  14. 基于Java在线学习系统设计与实现
  15. 014-JVM-查看class文件的工具Binary viewer、ue、classlib Bytecode viewer
  16. RTK使用笔记-千寻CORS模式
  17. python选择题题库
  18. java的panel布局_学习面panel和三种布局
  19. Java实现指数运算
  20. UCloud宗泽:区块链安全现状堪忧,泡沫与价值并存

热门文章

  1. 2021年大数据常用语言Scala(四):基础语法学习 声明变量
  2. 0x02 mysql 表格相关操作
  3. PyCharm中Directory与Python package的区别
  4. 20135234mqy 实验四
  5. EF-Entity Framework 相关技术点收集贴
  6. Codeforces Beta Round #95 (Div. 2) 部分解题报告 (dp,组合数,)
  7. Linux 常用技巧记录
  8. 控制显示隐藏_大众发动机控制单元隐藏功能刷写
  9. python求平方根的代码_Python求平方根(附带源码)
  10. 扑克牌排序_JAVA 扑克牌排序打印,并进行洗牌