首页 > 技术文章 > 三维点云处理|点云里的每个点如何去寻找邻近点(一)

isadoraytwwt 2020-04-24 09:24 原文

##最常用来解决这个问题的是八叉树和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上面。

 

推荐阅读