1、建立一个K-d Tree 索引
import open3d as o3d
import numpy as np
pcd = o3d.io.read_point_cloud("data//bunny.pcd")
# 把所有点渲染为黑色(黑色兔子)
pcd.paint_uniform_color([0, 0, 0])
# 建立KD树索引
pcd_tree = o3d.geometry.KDTreeFlann(pcd)
2、K近邻搜索
pcd.colors[100] = [1, 0, 0] # 第50个点作为查询点,给定查询点并渲染为红色
# K近邻搜索
[k, idx, _] = pcd_tree.search_knn_vector_3d(pcd.points[100], 50)
# K邻域的点,渲染为绿色
np.asarray(pcd.colors)[idx[1:], :] = [0, 1, 0]
print("查询点:", pcd.colors[100])
print("K近邻距离:", idx)
3、结果
![](https://img-blog.csdnimg.cn/2714f7ef75684f5ca3876828b7bb8852.png)
4、代码解析
[k, idx, _] = pcd_tree.search_knn_vector_3d(pcd.points[100], 50) # K近邻搜索
# 查询距离指定点(第100个点)最近的邻近点(最近的50个点)
# k表示需要查询的最近邻点的个数,这里是100。
# idx是一个一维整数数组,它包含了最近邻点的索引。索引从0开始,表示点云数据中的点的索引。
# _是一个空的占位符,表示距离值。在这种情况下,它并没有被使用。
np.asarray(pcd.colors)[idx[1:], :] = [0, 1, 0] # K邻域的点,渲染为绿色
# np.asarray(pcd.colors)将点云对象pcd的颜色属性转换为NumPy数组,以便进行索引和赋值操作
# idx[1:]是一个索引数组,表示要修改的点的索引
# 使用idx[1:]从中提取除第一个元素之外的所有索引,这意味着要修改除第一个点之外的所有点的颜色