Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >nanoflann库

nanoflann库

作者头像
点云PCL博主
发布于 2019-07-30 08:14:34
发布于 2019-07-30 08:14:34
4.1K0
举报
文章被收录于专栏:点云PCL点云PCL

点云处理过程中可能会遇到寻找最临近点的问题,常用的解决方案就是用空间换效率。例如建立kd-tree等树状结构来代替遍历。

这里向大家介绍一个nanoflann工程,nanoflann 算法对fastann进行了改进,效率以及内存使用等方面都进行了优化,而且代码十分轻量级且开源,是一个不错的选择。工程代码下载地址 https://github.com/jlblancoc/nanoflann

1.介绍

nanoflann是一个c++11标准库,用于构建具有不同拓扑(R2,R3(点云),SO(2)和SO(3)(2D和3D旋转组))的KD树。nanoflann不需要编译或安装。你只需要#include <nanoflann.hpp>在你的代码中。

1.1 如何使用库

最简单的方法:将其include/nanoflann.hpp用于需要的地方。

1.2 代码示例

  1. KD-trees使用kdd_search()和查找radius_search() : pointcloud_kdd_radius.cpp
  2. 点云数据集上的KD树查找:pointcloud_example.cpp
  3. 在动态点云数据集上进行KD树查找:dynamic_pointcloud_example.cpp
  4. 旋转组(SO2)上的KD树查找:SO2_example.cpp
  5. 旋转组(SO3)上的KD树查找:SO3_example.cpp
  6. 使用外部适配器类在点云数据集上查找KD树:pointcloud_adaptor_example.cpp
  7. KD-tree使用在Eigen::Matrix<>:matrix_example.cpp上查找
  8. KD-tree查找std::vector<std::vector<T> >或std::vector<Eigen::VectorXd>:vector_of_vectors_example.cpp
  9. 如何构建索引并将其保存到磁盘供以后使用的示例:saveload_example.cpp

3. nanoflann可以做什么?

A.建立具有单一索引的KD树(没有随机化的KD树,没有大致的搜索)。快速,线程安全地查询KD树上最近的邻居。接口是:

1. nanoflann :: KDTreeSingleIndexAdaptor <>::knnSearch()

找到num_closest最近的邻居query_point[0:dim-1]。它们的索引存储在结果对象中。查看示例使用代码:

2. nanoflann :: KDTreeSingleIndexAdaptor <>::radiusSearch()

query_point[0:dim-1]在最大半径范围内查找所有邻居。输出作为对的向量给出,其中第一个元素是点索引,第二个元素是相应的距离。查看示例使用代码。

3. nanoflann :: KDTreeSingleIndexAdaptor<>::radiusSearchCustomCallback()

可以用于接收范围内找到的每个点的回叫。这在某些情况下可能更有效,而不是用结果构建一个巨大的向量对。

B. 使用2D和3D点云或N维数据集。

C. 直接使用Eigen::Matrix<>类(矩阵和向量向量)

D. 使用动态点云而无需重建整个kd-tree索引。

E. 使用距离度量标准:

o L1 (曼哈顿)

o L2 (欧几里得,赞成SSE2优化)。

o L2_Simple (欧几里得,用于像点云这样的低维数据集)。

o SO2 (用于旋转组SO2)。

o SO3 (欧几里得,对于旋转组SO3)。

F. 将构建的索引保存并加载到磁盘。

1.4 Nanoflann不能做什么?

使用除L1,L2,SO2和SO3以外的其他距离度量。

支持SE(3)组。

只有C ++接口存在:不支持C,MATLAB或Python

2.如何选择KD树参数?

2.1 KDTreeSingleIndexAdaptorParams::leaf_max_size

KD树它有一个根节点,一组中间节点,最后是没有孩子的“叶”节点。点只存储在叶节点中。每个叶子都包含一个列表,其中包含哪些点落入其范围内。在构建树的同时,递归地分割节点,直到内部的点数等于或低于某个阈值。那是leaf_max_size。在进行查 时,“树算法”通过选择叶节点结束,然后在叶中的所有元素内对查询的最近点执行线性搜索(一个接一个)。所以,leaf_max_size必须将其设定为合适的值:

· 较大的值意味着树会更快地构建(因为树会更小),但是每个查询会更慢(因为叶子中的线性搜索要完成更多的点)。

· 较小的值将构建树慢得多(将会有许多树节点),但查询会更快......因为搜索的“树部分”(对数复杂度)仍然有很高的成本。

选择哪个数字确实取决于应用程序,甚至取决于处理器高速缓存的大小,因此理想情况下应该执行一些基准测试以最大限度地提高效率。

但为了帮助选择一个比较合适的参数作为一个基准,我提供了以下两个基准。每个图表代表leaf_max_size1到10K之间不同值的树构建(水平)和查询(垂直)时间(95%不确定性椭圆,由于对数标度而变形)。

· 一个100K点云,均匀分布(每个点有(x,y,z)float坐标):

· 一个来自真实数据集(scan_071_points.dat来自弗莱堡校区360数据集,每个点具有(x,y,z)float坐标)的大约150K点云:

因此,对于查询成本占主导地位的应用(例如ICP),似乎leaf_max_size10到50之间是最佳的。目前,其默认值为10。

3.性能

3.1 nanoflann:更快,更少的内存使用

3.2 原始flann对比nanoflann

许多点云算法(如ICP)中最耗时的部分是查询最近邻居的KD树。因此这个操作是最重要的。nanoflann相对于原始flann实现可节省大约50%的时间(此图表中的时间以微秒为单位):

由于模板化代码的原因,在构建KD树索引时还节省了一些时间,避免在辅助矩阵中复制数据(下图中的时间以毫秒为单位):

4.其他KD树项目

FLANN - Marius Muja和David G. Lowe(不列颠哥伦比亚大学)。

FASTANN - James Philbin(VGG,牛津大学)。

ANN - David M. Mount和Sunil Arya(马里兰大学)。

libkdtree ++ - Martin F. Krafft等人。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2018-04-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 点云PCL 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
PCL库简要说明
PCL(PointCloudLibrary)是在吸收了前人点云相关研究基础上建立起来的大型跨平台开源C++编程库,它实现了大量点云相关的通用算法和高效数据结构,涉及到点云获取、滤波、分割、配准、检索、特征提取、识别、追踪、曲面重建、可视化等。支持多种操作系统平台,可在Windows、Linux、Android、MacOSX、部分嵌入式实时系统上运行。如果说OpenCV是2D信息获取与处理的结晶,那么PCL就在3D信息获取与处理上具有同等地位,PCL是BSD授权方式,可以免费进行商业和学术应用 。
点云PCL博主
2019/07/30
1.4K0
kd-tree理论以及在PCL 中的代码的实现
通过雷达,激光扫描,立体摄像机等三维测量设备获取的点云数据,具有数据量大,分布不均匀等特点,作为三维领域中一个重要的数据来源,点云主要是表征目标表面的海量点的集合,并不具备传统网格数据的几何拓扑信息,所以点云数据处理中最为核心的问题就是建立离散点间的拓扑关系,实现基于邻域关系的快速查找。
点云PCL博主
2019/07/31
1.4K0
kd-tree理论以及在PCL 中的代码的实现
PCL
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
sofu456
2019/08/31
2.1K0
PCL点云曲面重建(1)
在测量较小的数据时会产生一些误差,这些误差所造成的不规则数据如果直接拿来曲面重建的话,会使得重建的曲面不光滑或者有漏洞,可以采用对数据重采样来解决这样问题,通过对周围的数据点进行高阶多项式插值来重建表面缺少的部分,
点云PCL博主
2019/07/31
2K0
PCL点云曲面重建(1)
PCL学习八叉树
建立空间索引在点云数据处理中有着广泛的应用,常见的空间索引一般 是自顶而下逐级划分空间的各种空间索引结构,比较有代表性的包括BSP树,KD树,KDB树,R树,四叉树,八叉树等索引结构,而这些结构中,KD树和八叉树使用比较广泛
点云PCL博主
2019/07/31
1.8K0
PCL学习八叉树
从K近邻算法、距离度量谈到KD树、SIFT+BBF算法
前两日,在微博上说:“到今天为止,我至少亏欠了3篇文章待写:1、KD树;2、神经网络;3、编程艺术第28章。你看到,blog内的文章与你于别处所见的任何都不同。于是,等啊等,等一台电脑,只好等待..”。得益于田,借了我一台电脑(借他电脑的时候,我连表示感谢,他说“能找到工作全靠你的博客,这点儿小忙还说,不地道”,有的时候,稍许感受到受人信任也是一种压力,愿我不辜负大家对我的信任),于是今天开始Top 10 Algorithms in Data Mining系列第三篇文章,即本文「从K近邻算法谈到KD树、SIFT+BBF算法」的创作。
全栈程序员站长
2022/09/06
1K0
从K近邻算法、距离度量谈到KD树、SIFT+BBF算法
KNN近邻,KD树
何谓K近邻算法,即K-Nearest Neighbor algorithm,简称KNN算法,单从名字来猜想,可以简单粗暴的认为是:K个最近的邻居,当K=1时,算法便成了最近邻算法,即寻找最近的那个邻居。
大数据技术与机器学习
2019/11/20
1.3K0
机器学习之KNN(k近邻)算法详解
数据集中的每个样本有相应的“正确答案”, 根据这些样本做出 预测, 分有两类: 回归问题和分类问题。
全栈程序员站长
2022/09/01
2K0
机器学习19:k近邻(kNN)模型
k近邻(k-NearestNeighbor)学习是一种最简单的监督学习算法,工作机制非常简单:给定测试样本,基于某种距离度量找出训练集中与其最近的k个训练样本,然后基于这k个邻居的信息来进行预测。通常,在分类任务中使用投票法,即选择这k个样本职工出现最多的类别标记作为预测结果;在回归任务中可以使用平均法,即将这k个样本的实值输出标记的平均值作为预测结果;还可以基于距离远近来进行加权平均或者加权投票,距离越远的样本权重越大。
用户5473628
2019/08/08
1.4K0
机器学习19:k近邻(kNN)模型
Lidar与IMU标定代码实战:lidar_align
对于Lidar+IMU系统,往往需要标定Lidar与IMU的外参[4],即从Lidar到IMU的6个位姿参数。ETH开源的lidar_align代码[0],用于标定Lidar和里程计Odom之间的位姿参数。本文将对代码进行初步介绍,并总结一些使用中可能会遇到的问题。
计算机视觉
2020/12/11
2.2K0
【荐闻】MAD-ICP:一种基于激光雷达里程计(LO)的新型方法
本文提出了MAD-ICP,这是一种基于激光雷达里程计(LO)的新型方法。MAD-ICP利用了一种高效且通用的kd-tree数据结构,并结合估计的姿态不确定性动态维护一个稳健的环境模型。
一点人工一点智能
2024/05/19
2010
【荐闻】MAD-ICP:一种基于激光雷达里程计(LO)的新型方法
深入理解KNN扩展到ANN
一句话就可以概括出KNN(K最近邻算法)的算法原理:综合k个“邻居”的标签值作为新样本的预测值。更具体来讲KNN分类过程,给定一个训练数据集,对新的样本Xu,在训练数据集中找到与该样本距离最邻近的K(下图k=5)个样本,以这K个样本的最多数所属类别(标签)作为新实例Xu的预测类别。
算法进阶
2022/06/02
1.4K0
深入理解KNN扩展到ANN
PCL中八叉树理论
建立空间索引在点云数据处理中已被广泛的应用,常见的空间索引一般是自顶向下逐级划分空间的各种空间索引结构,比较有代表性的包括BSP树,KD树,R树,CELL树,八叉树等索引结构,其中就属KD树和八叉树在3D点云中的应用最为广泛,KD树的理论基础在上一篇推文中已经讲解,那么我们知道PCL库中已经对KD树和八叉树的数据结构的建立和索引的方法进行的实现,以方便在此基础上的其他点云的处理操作。
点云PCL博主
2019/07/30
4.2K0
PCL中八叉树理论
【硬核】机器学习与数据结构的完美结合——KD-tree
今天是机器学习的第15篇文章,之前的文章当中讲了Kmeans的相关优化,还讲了大名鼎鼎的EM算法。有些小伙伴表示喜欢看这些硬核的,于是今天上点硬菜,我们来看一个机器学习领域经常用到的数据结构——KD-Tree。
TechFlow-承志
2020/04/14
9480
向量数据库?那咱们就浅谈一下吧
今年自己做了不少业余的 LLM demo/PoC 级的应用,前前后后使用了几种向量数据库(Vector Database),包括尚不能称之为向量数据库的 FAISS,玩票性质的 redisearch 和 pgvector,闭源的 SAAS 服务 pinecone,以及使用 Rust 构建的 qdrant 和 lancedb。这些向量数据库各有千秋,支持的索引技术不尽相同,但它们都试图解决传统数据库或者搜索引擎在搜索高维度信息时的力不从心的问题。
tyrchen
2023/09/27
2.6K0
向量数据库?那咱们就浅谈一下吧
最近邻搜索|Nearest neighbor search
最近邻搜索 ( NNS ) 作为 邻近搜索(proximity search) 的一种形式,是在给定集合中找到与给定点最接近(或最相似)的点的优化问题(optimization problem)。相似度通常用不相似函数表示:对象越不相似,函数值越大。
用户3578099
2023/09/01
1.1K0
最近邻搜索|Nearest neighbor search
统计学习方法:K近邻
K近邻(k-nearest neighbors)算法是一个简单、直观的算法。它没有显式的学习过程,但是物理意义与思路都非常容易理解。
统计学家
2019/04/10
3730
KD-树
kd树(k-dimensional树的简称),是一种分割k维数据空间的数据结构,其中的每一个节点都是k维的数据,主要应用于多维空间关键数据的近邻查找(Nearest Neighbor)和近似最近邻查找(Approximate Nearest Neighbor)。
为为为什么
2024/09/20
1730
KD-树
一看就懂的K近邻算法(KNN),K-D树,并实现手写数字识别!
何谓K近邻算法,即K-Nearest Neighbor algorithm,简称KNN算法,单从名字来猜想,可以简单粗暴的认为是:K个最近的邻居,当K=1时,算法便成了最近邻算法,即寻找最近的那个邻居。
mantch
2019/08/14
2.1K0
pcl点云合并_pcl点云重建
首先创建一个Kd树对象作为提取点云时所用的搜索方法,再创建一个点云索引向量cluster_indices,用于存储实际的点云索引信息,每个检测到的点云聚类被保存在这里。请注意: cluster_indices是一个向量,对每个检测到的聚类,它都包含一个索引点的实例,如cluster_indices[0]包含点云中第一个聚类包含的点集的所有索引。
全栈程序员站长
2022/11/01
2.1K0
相关推荐
PCL库简要说明
更多 >
领券
💥开发者 MCP广场重磅上线!
精选全网热门MCP server,让你的AI更好用 🚀
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档