0 关于KD-Tree

关于kd-tree的基本原理和构造实现情况可以参考博文:《KD-Tree结构与算法原理》

1 PCL中使用kd-tree进行最近邻点搜索

先分部解释,完整代码见第二部分。

1.1 最近邻搜索关键函数

int pcl::search::KdTree< PointT, Tree >::nearestKSearch (
const PointT & point,
int k,
std::vector< int > & k_indices,
std::vector< float > & k_sqr_distances
) const

其中参数对应分别为:

  • point:输入的目标点
  • k: 选取的最近点个数
  • k_indices:最近点的下标集合
  • k_sqr_distances: 对应点到目标点的距离平方集合

返回的int返回值为找到的点的个数。

1.2 半径邻域搜索

int pcl::search::KdTree< PointT, Tree >::radiusSearch(
const PointT & point,
int radius,
std::vector< int > & k_indices,
std::vector< float > & k_sqr_distances
) const

其中参数对应分别为:

  • point:输入的目标点
  • radius: 搜索半径
  • k_indices:最近点的下标集合
  • k_sqr_distances: 对应点到目标点的距离平方集合

返回的int返回值为找到的点的个数。
具体使用方法见下方代码。

2 例程

//
// Created by greg on 5/5/21.
//#include <pcl/pcl_base.h>
#include <pcl/point_cloud.h>
#include <pcl/kdtree/kdtree_flann.h>#include <iostream>
#include <vector>
#include <ctime>int main(int argc,char** argv)
{//初始化随机数srand (time (NULL));pcl::PointCloud<pcl::PointXYZ>::Ptr cloud (new pcl::PointCloud<pcl::PointXYZ>);// 初始化及生成点云数据cloud->width = 1000;cloud->height = 1;cloud->points.resize (cloud->width * cloud->height);//利用随机数生成for (std::size_t i = 0; i < cloud->points.size (); ++i){cloud->points[i].x = 1024.0f * rand () / (RAND_MAX + 1.0f);cloud->points[i].y = 1024.0f * rand () / (RAND_MAX + 1.0f);cloud->points[i].z = 1024.0f * rand () / (RAND_MAX + 1.0f);}//初始化输入点集与目标点pcl::KdTreeFLANN<pcl::PointXYZ> kdtree;kdtree.setInputCloud (cloud);pcl::PointXYZ searchPoint;searchPoint.x = 1024.0f * rand () / (RAND_MAX + 1.0f);searchPoint.y = 1024.0f * rand () / (RAND_MAX + 1.0f);searchPoint.z = 1024.0f * rand () / (RAND_MAX + 1.0f);// K nearest neighbor 搜索,指定大小为10个点int K = 10;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 (std::size_t i = 0; i < pointIdxNKNSearch.size (); ++i)std::cout << "    "  <<   cloud->points[ pointIdxNKNSearch[i] ].x<< " " << cloud->points[ pointIdxNKNSearch[i] ].y<< " " << cloud->points[ pointIdxNKNSearch[i] ].z<< " (squared distance: " << pointNKNSquaredDistance[i] << ")" << std::endl;}// 半径邻域搜索std::vector<int> pointIdxRadiusSearch;std::vector<float> pointRadiusSquaredDistance;float radius = 256.0f * rand () / (RAND_MAX + 1.0f);std::cout << "Neighbors within radius search at (" << searchPoint.x<< " " << searchPoint.y<< " " << searchPoint.z<< ") with radius=" << radius << std::endl;if ( kdtree.radiusSearch (searchPoint, radius, pointIdxRadiusSearch, pointRadiusSquaredDistance) > 0 ){for (std::size_t i = 0; i < pointIdxRadiusSearch.size (); ++i)std::cout << "    "  <<   cloud->points[ pointIdxRadiusSearch[i] ].x<< " " << cloud->points[ pointIdxRadiusSearch[i] ].y<< " " << cloud->points[ pointIdxRadiusSearch[i] ].z<< " (squared distance: " << pointRadiusSquaredDistance[i] << ")" << std::endl;}return 0;
}

输出结果:

其中第一部分为k近邻搜索结果,输出找到的点以及距离平方。第二部分为半径邻域搜索结果,因为给出的半径r为随机数,所以搜索结果数量会变化。

PCL中利用KD-Tree搜索空间点云最临近点源码相关推荐

  1. iOS中利用UISearchBar实现搜索

    先把源码贴出来 https://github.com/losedMemory/ZSSearchBar   这是我在github上写的一个Demo,大家可以看看 在大多数app中都会用到搜索功能,那么搜 ...

  2. Struts2中利用s:tree显示树的问题

    在struts2的文档中看到可以用s:tree标签来显示树,于是就按文档中的步骤走了一遍: 基本步骤是 1.<s:tree>标签不是struts-tags里面的标签,而是struts-do ...

  3. k-d tree树 近邻算法

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

  4. k-d tree算法

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

  5. KD Tree的原理及Python实现

    1. 原理篇 我们用大白话讲讲KD-Tree是怎么一回事. 1.1 线性查找 假设数组A为[0, 6, 3, 8, 7, 4, 11],有一个元素x,我们要找到数组A中距离x最近的元素,应该如何实现呢 ...

  6. K-D Tree 算法详解及Python实现

    K-D Tree 算法 k−d treek−dtree\mathrm{k-d\ tree}即k−dimensional treek−dimensionaltree\mathrm{k-dimension ...

  7. KD tree and Bbf

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

  8. PCL点云库调库学习系列——k-d tree与八叉树

    k-d tree与八叉树 1 k-d tree与八叉树 本文并不涉及具体原理的解释,文章着重在k-d树与八叉树在近邻搜索方面的API的使用 1.1 k-d tree k-d tree算法及原理: ht ...

  9. PCL点云处理之使用KD树搜索最邻近点,避坑(三十八)

    PCL点云处理之使用KD树搜索最邻近点(三十八) 前言 一.KD树搜索最邻近点? 二.使用步骤 1.代码 2.结果 总结 前言 一.KD树搜索最邻近点? 在点云处理中,找某个点的最近点非常普遍,PCL ...

最新文章

  1. 【灌水】一些奇妙的图片(持续更新)
  2. 浏览器渲染机制面试_浏览器渲染原理
  3. 【Makefile由浅入深完全学习记录5】预定义变量的使用
  4. HTML可以替代CSS的所有功能,CSS-用Divs替换HTML表
  5. 构建微服务(Building Microservices)-PDF 文档
  6. Spring-context-AnnotationConfigUtils类
  7. HTTP 协议 - 简单谈谈 TCP / IP (一)
  8. wojilu系统的ORM代码解析-[源代码结构分析,用特性和反射来感知属性-特性介绍篇]...
  9. 北京市土壤侵蚀强度空间分布数据
  10. 智能车制作pdf 王盼宝_智能车制作——从元器件、机电系统、控制算法到完整的智能车设计(Word+PDF+ePub+PPT)...
  11. 遗传算法matlab_当结构设计遇到遗传算法应用ANSYS和MATLAB联合优化设计探索(二)...
  12. RUBi: Reducing Unimodal Biases in Visual Question Answering
  13. 计算机中cpu是指什么意思,CPU是什么?CPU又是什么意思?
  14. 从今往后,我也有了我自己的博客
  15. 命令 修复损坏的 Ubuntu 系统 ,不用重装
  16. 通达信指标函数说明大全(2014)(转)
  17. intellidea 应用问题
  18. python语言初学
  19. JZ73 翻转单词序列
  20. 2021年熔化焊接与热切割报名考试及熔化焊接与热切割最新解析

热门文章

  1. C++使用CreateProcess执行cmd命令(实例演示)
  2. 前端播放rtmp协议的视频流文件
  3. windbg 命令 - !list
  4. 3.1 腾讯云AI能力矩阵
  5. Java三种设计模式
  6. QuickBI-自建数据库MySQL连接
  7. python excel 插入图片并设置好大小
  8. Altera 的SOC器件之将自定义的IP挂在ARM硬核下(通过avalon总线),实现arm核与IP之间的通信
  9. NAT模式/路由模式/全路由模式
  10. 上海大学计算机专硕与学硕,计算机学院2017届留沪研究生学习成绩综合评定工作通知...