工作过程中经常要对散乱三维点云进行处理,其处理的前提是建立点与点之间的拓扑关系,因为是散乱只能建立临近点区域块邻接关系。比较常用的办法就是根据点云的体积,用做大的立体包围盒进行包裹,然后对包围盒划分为边长等距的小立方体,该方法适用于在整个立体空间中,分布相对平均,密度一致的点云。但大部分的点云都是基于轮廓扫描获取的点云,属于表面型点云,中空。如果还用等间距立体包围盒进行划分,浪费很多的内存空间,增加检索数据的时间。解决觉思路是,有点云的地方就划分,没有点云的地方就不划分,更高效的利用内存、减少检索数据的时间。基于这样的思路,线性存储_数组数据类型是没有办法构建这样的数据结构的,只能非线性存储数据结构_OcTree。
八叉树OcTree,一个立方体等分为八份,并可以持续的细分下去,虽然每个节点都能分出八个叉,但形象,且等分空间,是等分立方体方法的优化。
LabVIEW没有现成的树形数据容器,但可以借助LabVIEW Framework Engineer Chris Cilino&Cirrus Logic两位博士设计一套树形容器来搭建OcTree,用于云数据拓扑关系的建立。
数据容器节点数据类型:
Data:该子节点的点云数据
Range:该立方体的范围
Center:该立方体的中间位置。
Parent:该节点的父类名字
Child:该节点的子类的名字
ParentOcTree:父类节点的数值引用
ChildOcTree:子类节点的数值引用
Current:当前节点的数值引用
创建OcTree数据容器首节点:
节点进行递归分裂:
读出点云,根据规则,插入8个立方体,并对8个立方体创建树形容器,加入父类并更新父类子节点的数值引用。在创建每个节点的时候都要递归分裂下去。
递归读出所有节点
首先读出跟节点的所有子类,读出Node值,递归所有子类读出Node值。
分裂深度为3时,点云OcTree拓扑关系如下:
分裂深度为5时,点云OcTree拓扑关系如下:
声明:文中观点不代表本站立场。本文传送门:https://eyangzhen.com/314178.html