原理:KD-tree 又称 K 维树是计算机科学中使用的一种数据结构,用来组织表示 K 维空间中点集合。它是一种带有其他约束条件的二分查找树。KD-tree对于区间和近邻搜索十分有用。我们为了达到目的,通常只在三个维度中进行处理,因此所有的 KD-tree 都将是三维 KD-tree。 如下图所示(动图,慢慢看), KD-tree 的每一级在指定维度上分开所有的子节点。在树的根部所有子节点是以第一个指定的维度上被分开(即如果第一维坐标小于根节点的点它将被分在左边的子树中,如果大于根节点的点它将分在右边的子树中)。树的每一级都在下一个维度上分开,所有其他的维度用完之后就回到第一个维度,建立 KD-tree 最高效的方法是像快速分类一样使用分割法,把指定维度的值放在根上,在该维度上包含较小数值的在左子树,较大的在右子树。然后分别在左边和右边的子树上重复这个过程,直到用户准备分类的最后一个树仅仅由一个元素组成。

代码展示:

#include<pcl/io/pcd_io.h>
#include <pcl/point_cloud.h>
#include <pcl/kdtree/kdtree_flann.h>
#include <pcl/visualization/cloud_viewer.h>using PointT = pcl::PointXYZRGB;int main() {// 1.读取点云pcl::PointCloud<PointT>::Ptr cloud(new pcl::PointCloud<PointT>);if (pcl::io::loadPCDFile<PointT>("/home/pi/Desktop/pcl/Open3D/examples/test_data/fragment.pcd",*cloud)==-1){PCL_ERROR("cloud not load file!");return -1;}// 2.原始点云着色for (auto &pt: cloud->points){pt.r = 255;pt.g = 255;pt.b = 255;}// 3.建立kd-treepcl::KdTreeFLANN<pcl::PointXYZRGB> kdtree;kdtree.setInputCloud(cloud);// 4.K近邻搜索PointT searchPoint = cloud->points[0]; //设置查找点searchPoint.r = 0;searchPoint.g = 0;searchPoint.b = 255;int K = 300;  //设置需要查找的近邻点个数std::vector<int> pointIdxNKNSearch(K);  //保存每个近邻点的索引std::vector<float> pointNKNSquaredDistance(K); //保存每个近邻点与查找点之间的欧式距离平方std::cout << "K nearest neighbor search at (" << searchPoint.x<< " " << searchPoint.y<< " " << searchPoint.z<< ") with K=" << K << std::endl;if (kdtree.nearestKSearch(searchPoint, K, pointIdxNKNSearch, pointNKNSquaredDistance) > 0){for (size_t i = 0; i < pointIdxNKNSearch.size(); ++i){cloud->points[pointIdxNKNSearch[i]].r = 0;cloud->points[pointIdxNKNSearch[i]].g = 255;cloud->points[pointIdxNKNSearch[i]].b = 0;}}std::cout << "K = 300近邻点个数:" << pointIdxNKNSearch.size() << endl;// 5.radius半径搜索PointT searchPoint1 = cloud->points[3000];  //设置查找点std::vector<int> pointIdxRadiusSearch;  //保存每个近邻点的索引std::vector<float> pointRadiusSquaredDistance;  //保存每个近邻点与查找点之间的欧式距离平方float radius = 0.3;  //设置查找半径范围std::cout << "Neighbors within radius search at (" << searchPoint.x<< " " << searchPoint.y<< " " << searchPoint.z<< ") with radius=" << radius << std::endl;if (kdtree.radiusSearch(searchPoint1, radius, pointIdxRadiusSearch, pointRadiusSquaredDistance) > 0){for (size_t i = 0; i < pointIdxRadiusSearch.size(); ++i){cloud->points[pointIdxRadiusSearch[i]].r = 255;cloud->points[pointIdxRadiusSearch[i]].g = 0;cloud->points[pointIdxRadiusSearch[i]].b = 0;}}std::cout << "半径0.03近邻点个数: " << pointIdxRadiusSearch.size() << endl;// 6.显示点云pcl::visualization::CloudViewer viewer("cloud viewer");viewer.showCloud(cloud);while (!viewer.wasStopped()){}return 0;
}

效果展示:

PCL之K维树--KD-tree相关推荐

  1. Finding Hotels(牛客国庆集训派对Day7 )(2016ICPC青岛K)(K-D Tree)

    Finding Hotels 给定二维平面上nnn个点,每个点描述为x,y,cx, y, cx,y,c,x,yx, yx,y为坐标,ccc为该点的价值, 有mmm个询问,每次询问给x,y,cx, y, ...

  2. PCL:k-d tree 1 讲解

    1.简介 kd-tree简称k维树,是一种空间划分的数据结构.常被用于高维空间中的搜索,比如范围搜索和最近邻搜索.kd-tree是二进制空间划分树的一种特殊情况.(在激光雷达SLAM中,一般使用的是三 ...

  3. 如何利用 C# 实现 K-D Tree 结构?

    我的朋友海伦一直使用在线约会网站寻找适合自己的约会对象.尽管约会网站会推荐不同的人选,但她没有从中找到喜欢的人.经过一番总结,她发现曾交往过三种类型的人: 不喜欢的人 魅力一般的人 极具魅力的人 尽管 ...

  4. k-d tree入门

    暑期集训开始了 本篇博客将会简单讲一下k-d tree的原理以及实现 首先大家要先了解一下二叉搜索树 二叉搜索树是一个很简单常见的数据结构,他符合以下两个特征 1.一个节点若有左子树,则左子树上的点全 ...

  5. KD Tree原理讲解

    1.引子 在一张地图上,有600多个单位,每个单位之间都需要独立寻路,检测碰撞和寻找最近的敌方目标.当这一切需要在手机上流畅运行并尽可能快的在服务器进行模拟时,最简单的平方算法O(N^2)已经不能满足 ...

  6. k-d tree树 近邻算法

    k-d树(k-dimensional树的简称),是一种分割k维数据空间的数据结构.主要应用于多维空间关键数据的搜索(如:范围搜索和最近邻搜索). 应用背景 SIFT算法中做特征点匹配的时候就会利用到k ...

  7. PCL点云库:Kd树

    Kd树按空间划分生成叶子节点,各个叶子节点里存放点数据,其可以按半径搜索或邻区搜索.PCL中的Kd tree的基础数据结构使用了FLANN以便可以快速的进行邻区搜索.FLANN is a librar ...

  8. [CQOI2017] 老C的任务(差分 + 树状数组 / K-D tree)

    problem luogu-P3755 solution 这题第一眼矩阵内的点权值和,马上就是 K-D tree\text{K-D tree}K-D tree 不过脑子的敲. 这其实就是个二维数点问题 ...

  9. k近邻算法——kd树

    一.kd树概念   kd树(K-Dimensional Tree)是一种对K维空间中的实例点进行存储以便对其进行快速检索的树形数据结构.   kd树是二叉树,表示对K维空间的一个划分(partitio ...

最新文章

  1. mysql包含哪几部分_sql语言包含哪些部分
  2. JAVA后端开发规范
  3. C++ Vector用法深入剖析
  4. 日志分析系统分类有哪些_SEO优化中网站日志起到的重要性作用
  5. check box 如何调整字体大小_CSS中关于box-sizing你可能需要知道的小知识
  6. 猴子选王c语言链表程序代码,c/c++编程题 之 猴子选大王(数组、链表两种方法)...
  7. 容器和云服务器集群,什么是docker集群与镜像
  8. 用idea添加一个模块
  9. 浅析人工智能自然语言生成定义
  10. 【图形学手记】蒙特卡洛积分
  11. oracle 中execute immediate 是什么意思?
  12. 我常去的编程技术网站[最近更新:2011.07.10
  13. 好用的屏幕录像截图工具:Movavi Screen Capture Pro 10 Mac
  14. jquery.blockui示例
  15. 做读书笔记好用的软件分享
  16. 编辑SRT字幕,添加在视频中播放
  17. EI 收录的出版物目录(EI检索目录表格官方下载)
  18. 华为手机计算机怎么语音算术,只动口不动手!华为手机这个自带功能绝了,录音秒变文字!...
  19. 不显示藏宝阁试穿服务器,梦幻西游:真的感谢藏宝阁的试穿系统,圆了我拥有无级别的梦...
  20. Design?Design!

热门文章

  1. Zabbix 系统监控(二)Linux 系统监控
  2. 1 MySQL 主从同步
  3. 惠普服务器新加硬盘找不到,HP服务器更换硬盘后如何查看是否成功同步状态?...
  4. 华为向emui输入鸿蒙,新颜值/新功能/新体验!EMUI 11上手:手机鸿蒙OS的提前预演...
  5. PyQt5点击菜单栏弹出新窗口,解决新窗口闪退的实现方法
  6. ant design table column 设置width不生效解决方案
  7. 解决Eclipse无法添加Tomcat服务器的问题
  8. MySQL中 Data truncated for column ‘xxx‘解决方法
  9. Win10远程桌面 出现 身份验证错误,要求的函数不受支持,这可能是由于CredSSP加密Oracle修正 解决方法
  10. 这个Javascript“要求”是什么?