• 三维点云处理|点云里的每个点如何去寻找邻近点(一)


    ##最常用来解决这个问题的是八叉树和KD树 

    但我们在讲这些之前要先了解二叉树,毕竟二叉树是这些的基础。

    先讲以下两种方法

    · K-NN

    就是直接找三个最近的点,三个。

    红色的点就是我们要查找的点,绿色和蓝色的点就是我们数据库里的点,而绿色的点是我们所找到的邻近点。

    · Fixed Radius-NN

    在中心点红点以某半径画一个圈,在圈内的点都算邻近点。

    思考:为什么找邻域问题很重要?

    因为我们常要用到,在之前讲到的法向量估计中也需要用到找邻域,上采样和降采样或者噪声去除我们都会用到NN方法。

    既然重要,一定有很多开源的方法和包(PCL,flann等)。但是很遗憾,他们都不够快。如果自己写,大概率会比较快。

    现在GPU都已经满大街了,但是在GPU上面的最邻近算法很少也很慢。

    (GPU云服务器是基于异构计算提供的超强的浮点计算能力服务,适用于深度学习,智能视频分析,医疗影像分析,语音识别,高性能计算等应用场景。

    用户可根据自身需求灵活搭配。让您即刻拥有非凡的计算能力。)

    思考:为什么在点云上的邻域问题很困难呢?

    第一个原因就是点云不规则

    第二个原因是点云可以是三维的,三维比二维高一维,但是三维的数据点是指数上升的。用网格处理并不是很高效。

    ##二叉树

    用于处理一维的数据

    ##八叉树

    专门为了三维数据设计的

    ##KD树

    可以任意维度,但是常用于二维来做例子

    以上三点都有一个共同的核心思想:空间分割

    空间分割:

    分割完以后有一些小的空间不需要去查找,那此时如何跳过这些小区域呢?

    如何更快地结束搜索?

    二叉树

    要满足左边的数字都比核心主干的数字小(在图中的核心主干数字是8)

    右边要比中间的大

    左边和右边又是一个小的二叉树

    在计算机科学的开端就发明了(1960)

    那么如何用代码实现二叉树呢?

    结合上上图,每一个圈就是一个节点,每一个节点都有一个key,用来表达key的特征

    左边的节点和右边的节点有还是无

    value是别的因素,例如节点的颜色和编号

    首先搞定一个问题,首先给定我们一堆的数字,也就是一维数组

    怎么构建二叉树来表达我们的信息?

    现在假设我们有一个一维数组【100, 20, 500, 10, 30, 40】

    首先放100

    总结起来,怎么把一个数据放到二叉树里面呢?如果被占据就跟被占据的那个数比较

    转换成代码就是如下:

    ##给定一个数据点,怎么去查找这个数据点是否存在于二叉树里面?

    查找可以用递归或者循环

    以下代码是用递归查找

     那么怎么用循环去实现呢?

    首先要了解 堆栈 的概念,如果要避免递归问题,就要手动去实现一个栈。

     递归的好处:实现起来更容易和更理解,不用手动维护查到哪里了

    坏处:不停压栈,在内存的某些地方记录了,有多少层就要放多少层栈的信息

    循环的话,用一个变量来代表我现在在什么地方。

    它可以用在GPU上面。

  • 相关阅读:
    使用 MongoDB 存储商品分类信息
    什么鬼!基于备份恢复的实例数据还能变多?
    MongoDB账号管理及实践
    TiDB和MongoDB分片集群架构比较
    MongoDB复制集与Raft协议异同点分析
    MongoDB安全事件的防范与反思
    [翻译]pytest测试框架(二):使用
    浏览器渲染原理及解剖浏览器内部工作原理
    html实现鼠标悬停变成手型实现方式
    用ul li实现边框重合并附带鼠标经过效果
  • 原文地址:https://www.cnblogs.com/isadoraytwwt/p/12765308.html
Copyright © 2020-2023  润新知