点云最邻近Nearest Neighbors

KNN是寻找临近最近的K个点

radiusNN是半径为r的圆内的点

pcl提供上述最邻近搜索算法库,但是开源的执行速度慢。自己写的都比库里快。

为什么点云处理起来运算慢:

1.点云是无规则的,存在空间任何位置

2.点云是三维的,数据量导致指数上升,可以使用三维网格转换为三维图像形式,但是产生一些问题:

    1.如果网格很多,我的分辨率提升了,所需内存就会很大。如果网格很少,内存需求降低,但是分辨率下降,1

    2.网格本身就有问题,网格大部分是空白区,原理上不是很高效。

3.点云数量庞大,例如Velodyne64E,每秒产生22w点云,以20HZ频率处理点云,所需50ms处理11w个点。如何对这11w个点暴力寻找最近的点,所需次数为11w*11w*.0.5=6*10-9@20HZ次运算。一秒处理120亿次。对于i7处理器单核主频4.7Ghz的47亿次/每秒,就略显吃力了。

所以搜索算法就应运而生。主要用到的最邻近搜索算法

二叉树binary search tree BST::解决1D问题, 




二叉树实现方式递归与循环比较:

递归需要不断地压栈出栈,需要树层的存储量,优点代码简洁。C++代码会自动把递归程序转换为循环。递归使用的CPU,GPU一般只能提供十几层的栈,所以递归建议使用在CPU中。

循环:可以用在GPU上,二叉树、八叉树一些算法想要使用GPU,最好写成循环方式。 缺点:写起来复杂

中序遍历(左中右)可实现排序,前序遍历(中左右)实现copytree,后续遍历(左右中)实现删除一个节点




kdtree(K-dimansional tree):2D统计,就是把每一个维度当成一个二叉树,不同的是叶子节点可以包含多个point。使用超平面不断地将点云数量平分轮流切开,直到得到的区域点小于定义的leaf。

octree:2D/3D统计,面向于三维


©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容