• 2.KDTree相关


    1.理论:

    k-d树(k-dimensional树的简称),是一种分割k维数据空间的数据结构。主要应用于多维空间关键数据的搜索(如:范围搜索和最近邻搜索)。

    详细介绍见【量化课堂】kd 树算法之详细篇 - JoinQuant量化课堂 - JoinQuant(侵删)

    例如:特征点匹配通过距离函数在高维矢量之间进行相似性检索的问题。针对如何快速而准确地找到查询点的近邻,现在提出了很多高维空间索引结构和近似查询的算法,k-d树就是其中一种。

    索引结构中相似性查询有两种基本的方式:一种是范围查询,另一种是K近邻查询:

    • 范围查询(range searches):给定查询点和查询距离的阈值,从数据集中找出所有与查询点距离小于阈值的数据
    • K近邻查询(K-neighbor searches):给定查询点及正整数K,从数据集中找到距离查询点最近的K个数据,当K=1时,就是最近邻查询(nearest neighbor searches)。

    kdtree的结构:kd树是一个二叉树结构,它的每一个节点记载了【特征坐标,切分轴,左指针,右枝指针】。

    kd 树的构造以及 kd 树上的 kNN 算法见上方连接。

    2.PCL中对于kdtree的支持:

    PCL中类pcl::KdTree是kd-tree数据结构的实现。并且提供基于FLANN进行快速搜索的一些相关子类与包装类。具体可以参考相应的API。下面给出2个类的具体用法。

    pcl::search::KdTree < PointT >

    pcl::search::KdTreepcl::search::Search< PointT >的子类,是pcl::KdTree的包装类。包含(1) k 近邻搜索;(2) 邻域半径搜索。

    1. #pragma once
    2. #include
    3. #include
    4. #include
    5. #include
    6. void kdtreeTest1()
    7. {
    8. pcl::PointCloud::Ptr cloud(new pcl::PointCloud);
    9. pcl::io::loadPCDFile("do1.pcd", *cloud);
    10. pcl::search::KdTreetree;
    11. tree.setInputCloud(cloud);
    12. std::vector<int>indices;//存放查询到的索引
    13. std::vector<float>distance;//存放对应距离的平方
    14. //设一个查询点
    15. pcl::PointXYZ pointq = cloud->points[0];
    16. //查询离pointq最近的K个点
    17. int k = 3;
    18. int size = tree.nearestKSearch(pointq, k, indices, distance);
    19. std::cout << "k search result size is " << size<
    20. //查询pointq半径r范围领域内的点
    21. double r = 2.0;
    22. size = tree.radiusSearch(pointq, r, indices, distance);
    23. std::cout << "r search result size is " << size;
    24. }

     

     搜索结果默认是按照距离point点的距离从近到远排序;如果InputCloud中含有point点,搜索结果的的第一个点是point本身。

    pcl::KdTreeFLANN < PointT >

    pcl::KdTreeFLANNpcl::KdTree的子类,可以实现同样的功能。

    1. #pragma once
    2. #include
    3. #include
    4. #include
    5. #include
    6. void kdtreeTest2()
    7. {
    8. pcl::PointCloud::Ptr cloud(new pcl::PointCloud);
    9. pcl::io::loadPCDFile("do1.pcd", *cloud);
    10. //pcl::search::KdTreetree;
    11. pcl::KdTreeFLANNtree;
    12. tree.setInputCloud(cloud);
    13. std::vector<int>indices;
    14. std::vector<float>distance;
    15. //设一个查询点
    16. pcl::PointXYZ pointq = cloud->points[0];
    17. //查询离pointq最近的K个点
    18. int k = 3;
    19. int size = tree.nearestKSearch(pointq, k, indices, distance);
    20. std::cout << "k search result size is " << size<
    21. //查询pointq半径r范围领域内的点
    22. double r = 2.0;
    23. size = tree.radiusSearch(pointq, r, indices, distance);
    24. std::cout << "r search result size is " << size;
    25. }

    结果一样,略。

  • 相关阅读:
    Ceph qos 限速
    二、使用java简单操作kafka
    [附源码]java毕业设计哈金院食堂美食评价系统
    创造财富的9种模式
    SpringClouldAlibaba 之 Sentinel流控规则同步到nacos(并重新生成镜像)
    Spring Security基本框架之用户定义
    JavaGUI——Java图形用户界面
    中国移动物联网开放平台OneNET学习笔记(2)——设备接入测试(MQTT协议)OneNET Studio篇
    HTML+CSS简单的网页制作期末作业——浙江旅游景点介绍网页制作
    【Java】阿拉伯数字转汉字(完全符合中文阅读习惯)(支持所有整数类型)
  • 原文地址:https://blog.csdn.net/m0_57747965/article/details/126236945