Open3d K-D树

k-d树也是二叉树,是用于分割多维空间的数据结构,所以其每一个节点是一个多维坐标。在这里先不做过多解释,我们暂且可以把k-d树理解为,点云中的点按照一定空间关系排列,方便进行查找操作。

查询max_nn个指定点的近邻点

[k, idx, _] = pcd_tree.search_knn_vector_3d(point, max_nn)

查询所有距离指定点小于radius的点

[k, idx, _] = pcd_tree.search_radius_vector_3d(point, radius)

最后返回max_nn个距离指定点小于radius的点

[k, idx, _] = pcd_tree.search_hybrid_vector_3d(point, radius, max_nn)

k: 找到满足要求点的个数
idx:找到满足要求点的索引列表
_:找到满足要求点到指定点的距离列表


import open3d as o3d
import numpy as np


def radius_search():
    print("Loading pointcloud ...")
    sample_pcd_data = o3d.data.PCDPointCloud()
    pcd = o3d.io.read_point_cloud(sample_pcd_data.path)
    pcd_tree = o3d.geometry.KDTreeFlann(pcd)

    print(
        "Find the neighbors of 50000th point with distance less than 0.2, and painting them green ..."
    )
    [k, idx, _] = pcd_tree.search_radius_vector_3d(pcd.points[50000], 0.2)
    #idx[1:]除了指定点,因为距离它最近的是它自己
    #[:,:]第一个冒号代表所有行,第二个冒号代表所有行,
    np.asarray(pcd.colors)[idx[1:], :] = [0, 1, 0]

    print("Displaying the final point cloud ...\n")
    o3d.visualization.draw([pcd])


def knn_search():
    print("Loading pointcloud ...")
    sample_pcd = o3d.data.PCDPointCloud()
    pcd = o3d.io.read_point_cloud(sample_pcd.path)
    pcd_tree = o3d.geometry.KDTreeFlann(pcd)

    print(
        "Find the 2000 nearest neighbors of 50000th point, and painting them red ..."
    )
    [k, idx, _] = pcd_tree.search_knn_vector_3d(pcd.points[50000], 2000)
    np.asarray(pcd.colors)[idx[1:], :] = [1, 0, 0]

    print("Displaying the final point cloud ...\n")
    o3d.visualization.draw([pcd])


if __name__ == "__main__":
    knn_search()
    radius_search()

import numpy as np
import open3d as o3d

if __name__ == "__main__":

    print("Load two aligned point clouds.")
    demo_data = o3d.data.DemoFeatureMatchingPointClouds()
    pcd0 = o3d.io.read_point_cloud(demo_data.point_cloud_paths[0])
    pcd1 = o3d.io.read_point_cloud(demo_data.point_cloud_paths[1])

    pcd0.paint_uniform_color([1, 0.706, 0])
    pcd1.paint_uniform_color([0, 0.651, 0.929])
    o3d.visualization.draw_geometries([pcd0, pcd1])
    print("Load their FPFH feature and evaluate.")
    print("Black : matching distance > 0.2")
    print("White : matching distance = 0")
    feature0 = o3d.io.read_feature(demo_data.fpfh_feature_paths[0])
    feature1 = o3d.io.read_feature(demo_data.fpfh_feature_paths[1])

    fpfh_tree = o3d.geometry.KDTreeFlann(feature1)
    for i in range(len(pcd0.points)):
        [_, idx, _] = fpfh_tree.search_knn_vector_xd(feature0.data[:, i], 1)
        #查找满足要求的特征点,并计算最接近特征点pcd1.points[idx[0]]到指定点的距离pcd0.points[i]
        dis = np.linalg.norm(pcd0.points[i] - pcd1.points[idx[0]])
        c = (0.2 - np.fmin(dis, 0.2)) / 0.2
        pcd0.colors[i] = [c, c, c]
    o3d.visualization.draw_geometries([pcd0])
    print("")

    print("Load their L32D feature and evaluate.")
    print("Black : matching distance > 0.2")
    print("White : matching distance = 0")
    feature0 = o3d.io.read_feature(demo_data.l32d_feature_paths[0])
    feature1 = o3d.io.read_feature(demo_data.l32d_feature_paths[1])

    fpfh_tree = o3d.geometry.KDTreeFlann(feature1)
    for i in range(len(pcd0.points)):
        [_, idx, _] = fpfh_tree.search_knn_vector_xd(feature0.data[:, i], 1)
        dis = np.linalg.norm(pcd0.points[i] - pcd1.points[idx[0]])
        c = (0.2 - np.fmin(dis, 0.2)) / 0.2
        pcd0.colors[i] = [c, c, c]
    o3d.visualization.draw_geometries([pcd0])
    print("")

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Open3D是一个开源的3D计算框架,其中包含了一系列用于处理、分析和可视化3D数据的工具和算法。其中之一就是K均值聚类算法。 K均值聚类是一种常用的聚类算法,用于将数据集划分为K个不重叠的簇。它的核心思想是通过迭代的方式,不断调整簇中心的位置,直到达到收敛条件。具体步骤如下: 1. 随机选择K个初始簇中心点。 2. 遍历数据集中的每个点,将其分配给距离最近的簇中心。 3. 更新每个簇的中心点,即计算簇内所有点的平均值。 4. 重复步骤2和步骤3,直到簇中心不再发生明显变化或达到预定的迭代次数。 在Open3D中,可以使用`open3d.ml.clustering.DBSCAN`类来进行K均值聚类。首先需要创建一个DBSCAN对象,并设置所需的参数,如距离阈值、最小样本数等。然后,调用`fit`方法,将数据集作为参数传递给该方法,即可进行聚类。 具体代码如下所示: ```python import numpy as np import open3d as o3d # 创建一个DBSCAN对象 dbscan = o3d.ml.clustering.DBSCAN() # 设置参数 dbscan.set_eps(0.3) dbscan.set_min_points(10) # 加载数据集 data = np.genfromtxt('data.csv', delimiter=',') # 进行聚类 labels = dbscan.fit(data) # 打印每个点的簇标签 print(labels) ``` 上述代码中,首先创建了一个DBSCAN对象,并设置了距离阈值为0.3和最小样本数为10。接着,加载了数据集,数据集可以是一个numpy数组或者文件路径。之后,调用`fit`方法进行聚类,并将聚类结果存储在`labels`变量中。最后,打印出每个点的簇标签。 通过使用Open3D的K均值聚类功能,我们可以对3D数据进行聚类分析,从而揭示出数据集中的潜在模式和结构。这在计算机视觉、三维重建和机器学习等领域具有广泛的应用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值