2021SC@SDUSC
文章目录
open3D KDTree和OCTree的应用
本篇结合之前对源码的分析,外加与小组成员讨论open3D中python方面关于KDTree和OCTree的源码,我们结合最近所学的算法和计算机图形学方面的知识,用python完成了对open3D相关知识的几个简单的应用。
KDTree的使用
原理介绍
- KDTree数据结构是计算机科学中用来组织具有k维空间中若干点的数据结构。它是一个具有其他约束的二进位搜索树。K-d树对于范围搜索和最近邻搜索是非常有用的。为了我们的目的,我们通常只处理三维点云,所以我们所有的k-d树都是三维的。K-d树的每一层都使用垂直于相应轴的超平面,沿着特定的维度分割所有的子级。在树的根部,所有的子节点都将根据第一维(即,如果第一维坐标小于根,它将在左子树中,如果它大于根,那么它将明显地在右子树中)分割。树中的每一层都在下一个维度上划分,一旦所有其他维度都被耗尽,就返回到第一个维度。构建k-d树最有效的方法是使用一个分区方法:将中间点放置在根部,所有的东西都有一个更小的一维值,左边更小,右边更大。然后,在左树和右子树上重复此过程,直到要分区的最后一棵树仅由一个元素组成。
- 在三维点云数据查找过程中KDTree也是通过垂直于点云的一维超平面,并将空间递归的分割为多个子空间来实现三维点云数据的快速检索。在三维点云中 kd-tree 的详细计算过程如下:
- 依据点云的全局坐标系建立包含所有点云的立方体包围盒;
- 对每个包含超过1个点的立方体,构建分割平面;
- 两个分割子空间和分割平面上的点构成分支与连接点;
- 分割子空间,如果内部点的数量超过1,则执行步骤2继续分割。
算法流程
-
读取点云并构建一个KDTree
-
选取查询点
-
K近邻搜索
-
半径邻域搜索
-
混合搜索
#这是最近邻查询的预处理步骤 import open3d as o3d pcd = o3d.io.read_point_cloud("bunny.pcd") pcd.paint_uniform_color([0.5, 0.5, 0.5])#把所有点渲染为灰色(灰兔子) pcd_tree = o3d.geometry.KDTreeFlann(pcd)#建立KD树索引 #下边代码是把第200个点作为查询点。 pcd.colors[200] = [1, 0, 0]#给定查询点并渲染为红色 #search_knn_vector_3d返回查询点的k个最近邻的索引列表。这些相邻的点存储在数组numpy中,使用pcd.colors对numpy数组内所有的点进行颜色渲染(渲染为绿色[0,1,0])。这里跳过了第一个索引点,因为它是查询点本身。 [k,