0
点赞
收藏
分享

微信扫一扫

RedHat运维-Ansible自动化运维基础23-verbosity与导出日志

目录

一、概述

1.1kd树原理

1.2kd树搜索原理

1.3kd树构建示例

二、常见的领域搜索方式

2.1K近邻搜索(K-Nearest Neighbors, KNN Search)

2.2半径搜索(Radius Search)

2.3混合搜索(Hybrid Search)

三、代码实现

3.1关键函数

3.1.1K近邻搜索

3.1.2半径邻域搜索

3.1.3混合搜索

3.2完整代码

四、实现效果


一、概述

1.1kd树原理

1.2kd树搜索原理


1.3kd树构建示例

我们将使用以下点构建一个KD树:

A(2,3), B(5,4), C(9,6), D(4,7), E(8,1), F(7,2)

第一层:

  • 选择 x 轴进行分割。
  • 选择 x 轴上的中位数作为分割点,这里是点 D(4,7)。
                D(4,7)
               /      \

第二层:

  • 对于左子树,选择 y 轴进行分割。
  • 左子树的点为 A(2,3) 和 B(5,4),选择 y 轴上的中位数点 A(2,3) 作为分割点。
  • 对于右子树,选择 y 轴进行分割。
  • 右子树的点为 C(9,6), E(8,1) 和 F(7,2),选择 y 轴上的中位数点 F(7,2) 作为分割点。
                D(4,7)
               /      \
          A(2,3)     F(7,2)
             \       /    \
            B(5,4) E(8,1) C(9,6)

第三层:

  • 对于左子树的右子树,选择 x 轴分割。
  • 对于右子树的左右子树,选择 x 轴分割。

最终构建的KD树结构如下:

                D(4,7)
               /      \
          A(2,3)     F(7,2)
             \       /    \
            B(5,4) E(8,1) C(9,6)

二、常见的领域搜索方式

2.1K近邻搜索(K-Nearest Neighbors, KNN Search)

2.2半径搜索(Radius Search)

2.3混合搜索(Hybrid Search)

三、代码实现

3.1关键函数

3.1.1K近邻搜索

 search_knn_vector_3d返回查询点的k个最近邻的索引列表。这些相邻的点存储在数组numpy中,使用pcd.colors对numpy数组内所有的点进行颜色渲染(渲染为绿色[0,1,0])。这里跳过了第一个索引点,因为它是查询点本身

#K近邻搜索
pcd.colors[10000] = [1, 0, 0]#给定查询点并渲染为红色
[k, idx, _] = pcd_tree.search_knn_vector_3d(pcd.points[10000], 200)#K近邻搜索
np.asarray(pcd.colors)[idx[1:], :] = [0, 1, 0]#K邻域的点,渲染为绿色

3.1.2半径邻域搜索

  使用 search_radius_vector_3d查询所有的和查询点点距离小于给定半径的点

#半径搜索
pcd.colors[5000] = [1, 0, 0]#给定查询点并渲染为红色
[k1, idx1, _] = pcd_tree.search_radius_vector_3d(pcd.points[5000], 0.02)#半径搜索
np.asarray(pcd.colors)[idx1[1:], :] = [0, 0, 1]#半径搜索结果并渲染为蓝色

3.1.3混合搜索

除了KNN搜索(search_knn_vector_3d)和RNN搜索(search_radius_vector_3d)以外,Open3d还提供了混合搜索函数(search_hybrid_vector_3d)。它最多返回K个和查询点距离小于给定半径的最邻近点。这个函数结合了KNN和RNN的搜索条件,在某些文献中也被称作RKNN搜索。在许多情况下它有着性能优势,并且在Open3d的函数中大量的使用.

#混合搜索
pcd.colors[30000] = [1, 1, 0]#给定查询点并渲染为黄色
[k2, idx2, _] = pcd_tree.search_hybrid_vector_3d(pcd.points[30000], 0.05,200)#K近邻搜索
np.asarray(pcd.colors)[idx2[1:], :] = [0, 1, 0.8]#半径搜索结果并渲染为青色

3.2完整代码

import open3d as o3d
import numpy as np
pcd = o3d.io.read_point_cloud("Horse.pcd")
pcd.paint_uniform_color([0.5, 0.5, 0.5])#把所有点渲染为灰色
pcd_tree = o3d.geometry.KDTreeFlann(pcd)#建立KD树索引

#K近邻搜索
pcd.colors[10000] = [1, 0, 0]#给定查询点并渲染为红色


[k, idx, _] = pcd_tree.search_knn_vector_3d(pcd.points[10000], 200)#K近邻搜索
np.asarray(pcd.colors)[idx[1:], :] = [0, 1, 0]#K邻域的点,渲染为绿色

#半径搜索
pcd.colors[5000] = [1, 0, 0]#给定查询点并渲染为红色
[k1, idx1, _] = pcd_tree.search_radius_vector_3d(pcd.points[5000], 0.02)#半径搜索
np.asarray(pcd.colors)[idx1[1:], :] = [0, 0, 1]#半径搜索结果并渲染为蓝色

#混合搜索
pcd.colors[30000] = [1, 1, 0]#给定查询点并渲染为黄色
[k2, idx2, _] = pcd_tree.search_hybrid_vector_3d(pcd.points[30000], 0.05,200)#K近邻搜索
np.asarray(pcd.colors)[idx2[1:], :] = [0, 1, 0.8]#半径搜索结果并渲染为青色
o3d.visualization.draw_geometries([pcd])

四、实现效果

举报

相关推荐

0 条评论