点云数据去除地面后,地面上的点很自然的都成了障碍物,但是要进行目标分类,还需要把每个目标的一堆障碍物的点聚集到一起,然后才好进行后续的分析,因为每个点都是空间上离的很近的点,那么很自然的,就想到了可以使用基于密度的聚类 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])**2
 
 
    return 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 = 0
    C = []
    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 += 1
        Ck = 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部分的情况;但是! 它会把多个离的比较近的物体聚类为一个;

效果如下图:

因为经过了降采样,图片中的点可能不是那么亮,但是其实效果还可以;并且这个里面的地面还存在一些,因为没有使用最新的地面分割方法;
————————————————
版权声明:本文为CSDN博主「Mr Poopybutthole」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_31971181/article/details/113038548

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

  1. PCL 点云DBSCAN聚类算法

    文章目录 一.简介 二.实现代码 三.实现效果 参考资料 一.简介 关于DBSCAN聚类算法的原理可以看之前的文章:点云DBSCAN聚类算法(C++),这里仅仅是对该算法进行了整理,让它可以支持PCL ...

  2. 毫米波雷达点云 DBSCAN聚类算法

    毫米雷达点云 DBSCAN聚类算法 聚类的目的 聚类算法分类 原型聚类 层次聚类 密度聚类 DBSCAN聚类算法原理 相关定义 算法流程以及伪代码 DBSCAN算法优缺点 DBSCAN参数选择 聚类衡 ...

  3. 点云综述一稿 点云硬件、点云软件、点云处理算法、点云应用以及点云的挑战与展望

    经过一周的综述撰写,深感点云算法应用之浩瀚,只能仰仗前辈们的文章作一些整理: 点云硬件: 点云获取技术可分为接触式扫描仪.激光雷达.结构光.三角测距(Triangulation).以及立体视觉等多种. ...

  4. 【点云压缩】点云概述:点云的分类与处理 点云来源

    点云概述 一.什么是点云 二.点云从哪来 1. 三维激光雷达扫描 2. 照相机扫描 3. 逆向工程 三.点云的分类 四.点云的相关处理 1. 点云分割 2. 点云补全 3. 点云上采样 4. 点云压缩 ...

  5. 阿里云PolarDB数据库将云原生进行到底!业内首次实现三层池化

    10月20日,在2021云栖大会上,阿里云宣布自研云原生关系型数据库PolarDB重磅升级,实现内存池化.多主架构.HTAP实时分析等创新功能,进一步引领云原生数据库技术的持续创新. 阿里云智能数据库 ...

  6. 华为云客户端_华为云新一代S6云服务器缘何深受中小企业青睐?

    在移动互联网时代,随着信息量和数据量的迅猛增长,更多企业对数据的处理能力和业务的扩展提出了更高要求.因此,有越来越多的企业选择把业务和数据迁移到云端,通过"云计算服务提供商"购买相 ...

  7. PyTorch 1.3发布:能在移动端部署,支持Colab云TPU,阿里云上也能用

    本文经AI新媒体量子位(公众号ID:qbitai)授权转载,转载请联系出处. 本文约2700字,建议阅读7分钟. 本文向你介绍 PyTorch1.3 的新特性. "我要转PyTorch!&q ...

  8. 【未来研究】城市云脑是互联网云脑的节点,城市云脑之间如何互补与支撑

    作者: 互联网进化论作者 ,计算机博士 刘锋 前言:本文是未来智能实验室的研究文章,重点探讨了基于类脑架构的智慧城市建设不应局限在城市内部,而是在互联网大背景下,不同城市之间也会发生智慧建设的协同效应 ...

  9. 剑指云内存数据库,阿里云在下一盘大棋

    「The real battle will be in databases.」 在 2019 数据技术嘉年华大会上,阿里云数据库产品事业部总经理.李飞飞曾引用 AWS 创始人 Jeff Bezos 的 ...

最新文章

  1. python变量运算符_Python(三) 变量与运算符
  2. 问问大家作为大数据总监,刚刚到一家新单位,怎么开展工作比较好?
  3. 如何划分man文档的章节
  4. 前端学习(3114):react-hello-对state的理解
  5. 0010101 java_JAVA入门教程运算符和表达式
  6. Linux下用户、组、权限操作
  7. python单链表实现具体例子_python中单链表的实现
  8. endnote安装_EndNote X8 系列教程(一):软件介绍与安装
  9. 【ISWC2021】当知识图谱遇上零样本视觉问答
  10. 微积分 --- 以e为底的指数函数(个人学习笔记)
  11. CDA LEVELⅠ2021最新模拟题一(全网最详细有答案)
  12. 海森(hessian)矩阵
  13. Redis的持久化方式
  14. webstorm汉化怎样切回英文_我不小心把NS切成英文/日文系统了,怎样回到中文系统?...
  15. GAMMA初学笔记二
  16. 2020-09-07(基于控制台的DVD管理系统)
  17. 新编计算机组装与维护标准教程,计算机组装与维护标准教程(2015-2018版)
  18. 某选秀比赛的晋级规则是:如果7个评委中,有4个及以上评委投赞成票。试用数组编写程序判断某选手是否晋级
  19. mcnpf5输出结果_MCNP4c3说明
  20. Android .9图片制作

热门文章

  1. python3 判断字符串 是否为字母 数字 浮点数 整数
  2. golang 打印调用堆栈
  3. php中$_REQUEST、$_POST、$_GET的区别
  4. Zend Studio 修改高亮变量的颜色、括号颜色
  5. iconv 文件编码转换
  6. windows查看已连接过的wifi密码
  7. 开机时不显示启动菜单grub
  8. ps查看oracle进程数,通过ps -ef | grep oracle查出的进程,怎样对应数据库中跑的进程...
  9. 青蛙捉昆虫的html游戏,幼儿园小班体育游戏教案《小青蛙捉害虫》
  10. linux共享比windows好处,开源Linux虚拟化优势比Windows有何特点?