DBSCAN 对点云障碍物聚类

(感谢前辈)转自:https://zhuanlan.zhihu.com/p/72121128


点云数据去除地面后,地面上的点很自然的都成了障碍物,但是要进行目标分类,还需要把每个目标的一堆障碍物的点聚集到一起,然后才好进行后续的分析,因为每个点都是空间上离的很近的点,那么很自然的,就想到了可以使用基于密度的聚类 DBSCAN ;

为了更好的适应我的需求,使用的是自己写的DBSCAN方法;

整个过程如下:

1 先做降采样,降低点云数量;

2 然后地面去除,得到障碍物的点;

3 然后把剩余的地表障碍物点送入 DBSCAN 进行聚类;

4 最后进行可视化;


聚类核心代码如下:

def vector_distance_v2(v):"""把单个向量内部的每个元素两两相减,得到一个差值矩阵,矩阵是上三角和下三角刚好相反的结果:param v: 可以是一个一维数组,或者一个一维的列表:return:"""if type(v) is list:v = np.array(v)# result = []# for i in range(len(v)):#     result.append(v[i] - v)  # 可以改为列表推导式result = [v[i] - v  for i in range(len(v))]return np.vstack(result)   def point_distance(points):"""计算所有 points 两两之间的距离:param points:  地面分割之后检测出来的点  n * 4:return:  n * n 的距离矩阵"""d2 = vector_distance_v2(points[:,0])**2 + \vector_distance_v2(points[:,1])**2 + \vector_distance_v2(points[:,2])**2return np.sqrt(d2)# @profile
def DBSCAN_points(points, eps=2., Minpts=15):"""基于密度的点云聚类:param d_bbox: 点与点之间的距离矩阵:param eps:  最大搜索直径阈值:param Minpts:  最小包含其他对象数量阈值:return: 返回聚类结果,是一个嵌套列表,每个子列表就是这个区域的对象的序号"""# 先求距离print('DBSCAN clustering:',points.shape)d_bbox = point_distance(points)#初始化核心对象集合T,聚类个数k,聚类集合C, 未访问集合P,T = set()k = 0C = []P = set(range(d_bbox.shape[0]))# print('P',P)for d in range(d_bbox.shape[0]):# print(np.sum( d_bbox[d,:] <= eps))if np.sum( d_bbox[d,:] <= eps) >= Minpts:T.add(d)  # 最初的核心对象print('Len T: ',len(T))#开始聚类while len(T):P_old = P  #o = list(T)[np.random.randint(0, len(T))]  # 从T中随机选取一个核心元素# o = list(T)[random.randint(0, len(T)-1)]  # 从T中随机选取一个核心元素# print('o: ',o)P = P - set([o])Q = []Q.append(o)# print('Q: ',Q)while len(Q):q = Q[0]# print('q: ', q)# Nq = [i for i in range(d_bbox.shape[0]) if d_bbox[q,i] <= eps] #q的领域密度Nq = np.where(d_bbox[q,:] <= eps)[0]if len(Nq) >= Minpts:S = P & set(Nq)   # 这个核心对象的密度可达对象与未访问对象的交集Q += (list(S))   # 把这个核心对象以及它的密度可达对象都包含进来,对所有的对象再做多次密度可达检测P = P - S  # 未访问集合P 减去 这个核心对象的密度可达对象# print('S: ', S)# print('Nq: ', Nq)# print('P: ', P)Q.remove(q)  # q 已经做过密度可达检测了,去掉它# print('------')k += 1Ck = P_old - P # 原有的P和去掉了该核心对象的密度可达对象的P就是该类的所有对象T = T - Ck  # 去掉该类对象里面包含的核心对象C.append(Ck)     # 把该类的对象加入列表# print('noise points:', P)   # 最后没有被归类的数据点就是噪音点return C

存在的问题:

1 耗时久,计算量大;主要是由于 DBSCAN 需要计算每两个点两两之间的距离,超过5万个点就是25万的距离矩阵,就直接报内存错误了,查看任务管理器发现内存占用达到了5-9G;尽管后续极力压缩,还是需要5-6秒的时间,这显然是不可接受的;

2 它对同一个物体聚类的效果比较好,不会存在同一个物体聚类分割成了2部分的情况;但是! 它会把多个离的比较近的物体聚类为一个;

效果如下图:

因为经过了降采样,图片中的点可能不是那么亮,但是其实效果还可以;并且这个里面的地面还存在一些,因为没有使用最新的地面分割方法;

DBSCAN 对点云障碍物聚类相关推荐

  1. 点云 DBSCAN 对点云障碍物聚类

    点云数据去除地面后,地面上的点很自然的都成了障碍物,但是要进行目标分类,还需要把每个目标的一堆障碍物的点聚集到一起,然后才好进行后续的分析,因为每个点都是空间上离的很近的点,那么很自然的,就想到了可以 ...

  2. 两种三维点云密度聚类方法的研究与对比

    转载请说明出处: http://blog.csdn.net/zhubaohua_bupt/article/details/70194047 基于密度的点云聚类算法可以识别三维点云物体,也可以对三维点云 ...

  3. 机器学习 聚类篇——python实现DBSCAN(基于密度的聚类方法)

    机器学习 聚类篇--python实现DBSCAN(基于密度的聚类方法) 摘要 python实现代码 计算实例 摘要 DBSCAN(Density-Based Spatial Clustering of ...

  4. 重组标签云-标签聚类及其评价研究

    重组标签云-标签聚类及其评价研究 AlbertoPérez García-Plaza a*, Arkaitz Zubiaga b, Víctor Fresnoa,Raquel Martínez a a ...

  5. 【点云处理】Lidar点云障碍物形状估计(2)

    上一篇文章[点云处理]Lidar点云障碍物形状估计(1)讲到使用OpenCV自带的minAreaRect来估计点云的2D形状,这篇文章再来谈谈目前应用也比较多的基于L-Shape的形状估计.L-Sha ...

  6. 【点云处理】Lidar点云障碍物形状估计(1)

    自动驾驶场景中对Lidar点云障碍物的形状估计就是要给点云簇找到一个合适的3D矩形框.简单起见,我们只考虑偏航角(Yaw),忽略俯仰和翻滚角,这也符合自动驾驶场景中对一般障碍物的设定.有了这个设定之后 ...

  7. K-means 方法实现3D点云的聚类算法

    K-means 方法实现3D点云的聚类算法 import numpy as np import open3d as o3d import copy import random from matplot ...

  8. PCL 点云欧式聚类

    目录 一.概述 二.代码 三.结果 一.概述   PCL中点云欧式聚类的简单使用案例 二.代码 cluster_extraction.cpp #include <pcl/ModelCoeffic ...

  9. 点云谱聚类实现代码_Spark跑DBSCAN算法,工业级代码长啥样?

    最近着手的一个项目需要在Spark环境下使用DBSCAN算法,遗憾的是Spark MLlib中并没有提供该算法.调研了一些相关的文章,有些方案是将样本点按照空间位置进行分区,并在每个空间分区中分别跑D ...

  10. 【点云论文速读】点云分层聚类算法

    点云PCL免费知识星球,点云论文速读. 标题:PAIRWISE LINKAGE FOR POINT CLOUD SEGMENTATION 作者:Lu, Xiaohu and Yao, Jian and ...

最新文章

  1. python引用大数据,Python 3 UDF
  2. 11 所允许的仓储单位类型没有针对仓储类型xxx定义
  3. jenkins集成钉消息通知
  4. FPGA外挂DDR存储器简介
  5. c语言if全部用法,关于if的用法
  6. 男人的爱只有一次----女孩你珍惜了吗
  7. HowNet介绍及相关API的使用方法
  8. Python爬虫五:微信公众号爬虫-2018.9
  9. 实现原理 扫描枪_条码扫描枪原理
  10. html5 答题器页面,梦幻西游网页版科举答题器答案大全
  11. 三星Galaxy之父×××网秦,网秦安全能否脱胎换骨?
  12. iWatch 页面导航
  13. PgSql之操作JSON类型字段
  14. v5行为验证使用介绍(三)- 程序接入流程
  15. Games104现代游戏引擎入门-lecture12游戏引擎的粒子和声效系统
  16. 首次!嫦娥四号成功软着陆月球背面,中国探测器完成人类航天史壮举...
  17. 初学者如何快速开发大数据分析平台
  18. 百分点“数据隧道”玩转大数据平台实时数据复制
  19. iOS 应用之间的跳转
  20. 陌陌运维主管:我们是如何搞定600+设备的初创公司办公室网络环境的 | 36氪

热门文章

  1. html文件关联异常怎么修复,在Win7系统中,如何修复exe文件关联错误?
  2. java图片闪烁_java在窗口中添加图片做动画,怎么一闪一闪的?
  3. iOS开发APP瘦身之PDF图片资源加载框架
  4. java的框架gwt介绍_GWT Portlets
  5. Java软件工程师面试常见问题集锦之一
  6. 论如何成为技术大牛,GitHub中国区前20名详解
  7. php生成word并下载
  8. linux mono 安装步骤,如何在Ubuntu 18.04上安装Mono
  9. m个苹果放在n个盘子里面有多少种放法?(动态规划)
  10. Hyperledger04