open3D源码分析第八篇

本文详细介绍了open3D中KDTree和OCTree的原理及应用,包括从点云和Mesh构造OCTree的算法流程,并展示了在3D点云数据检索中的高效搜索方法,如K近邻搜索和半径邻域搜索。
摘要由CSDN通过智能技术生成

2021SC@SDUSC

open3D KDTree和OCTree的应用

本篇结合之前对源码的分析,外加与小组成员讨论open3D中python方面关于KDTree和OCTree的源码,我们结合最近所学的算法和计算机图形学方面的知识,用python完成了对open3D相关知识的几个简单的应用。

KDTree的使用

原理介绍

  1. KDTree数据结构是计算机科学中用来组织具有k维空间中若干点的数据结构。它是一个具有其他约束的二进位搜索树。K-d树对于范围搜索和最近邻搜索是非常有用的。为了我们的目的,我们通常只处理三维点云,所以我们所有的k-d树都是三维的。K-d树的每一层都使用垂直于相应轴的超平面,沿着特定的维度分割所有的子级。在树的根部,所有的子节点都将根据第一维(即,如果第一维坐标小于根,它将在左子树中,如果它大于根,那么它将明显地在右子树中)分割。树中的每一层都在下一个维度上划分,一旦所有其他维度都被耗尽,就返回到第一个维度。构建k-d树最有效的方法是使用一个分区方法:将中间点放置在根部,所有的东西都有一个更小的一维值,左边更小,右边更大。然后,在左树和右子树上重复此过程,直到要分区的最后一棵树仅由一个元素组成。
  2. 在三维点云数据查找过程中KDTree也是通过垂直于点云的一维超平面,并将空间递归的分割为多个子空间来实现三维点云数据的快速检索。在三维点云中 kd-tree 的详细计算过程如下:
    • 依据点云的全局坐标系建立包含所有点云的立方体包围盒;
    • 对每个包含超过1个点的立方体,构建分割平面;
    • 两个分割子空间和分割平面上的点构成分支与连接点;
    • 分割子空间,如果内部点的数量超过1,则执行步骤2继续分割。

算法流程

  1. 读取点云并构建一个KDTree

  2. 选取查询点

  3. K近邻搜索

  4. 半径邻域搜索

  5. 混合搜索

    #这是最近邻查询的预处理步骤
    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,
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值