谁是我邻居--kdTreeOcTree

2023-11-29 08:59
文章标签 邻居 kdtreeoctree

本文主要是介绍谁是我邻居--kdTreeOcTree,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

由于分割工作需要对点云的邻近点进行操作,不断对比和访问某个点的邻居,所以决定点云的相邻关系是非常重要的。对于Scan来说,邻居关系是天然的。但对于很多杂乱点云,或者滤波,分割后的点云来说,邻居关系就已经被破坏了。确定一个点云之间的相邻关系可以通过“树”来完成,目前比较主流的方法包括:kdTree和OcTree,这两种方法各有特点。

1.1.kdTree---一种递归的邻近搜索策略

  关于kdTree到底是怎么工作的https://en.wikipedia.org/wiki/K-d_tree这里有非常详细的说明,我不再赘述。但是kdTree实际上包括两个部分:1.建立kdTree,2.在kdTree中查找。建立kdTree实际上是一个不断划分的过程,首先选择最sparse的维度,然后找到该维度上的中间点,垂直该维度做第一次划分。此时k维超平面被一分为二,在两个子平面中再找最sparse的维度,依次类推知道最后一个点也被划分。那么就形了一个不断二分的树。如图所示。

  

  显然,一般情况下一个点的邻近点只需要在其父节点和子节点中搜索即可,大大缩小了邻近点的搜索规模。并且kdtree可以有效的对插入点进行判断其最近点在哪个位置。对于低层次视觉来说kdTree算法是非常重要的。在很多情况下需要给出某个点,再查k临近点的编号,或者差某半径范围内的点。PCL已经实现了kdtree算法,其调用接口如下:

复制代码
  #include <pcl/point_cloud.h>#include <pcl/kdtree/kdtree_flann.h>//创建kdtree 结构pcl::KdTreeFLANN<pcl::PointXYZ> kdtree;//传入点云
  kdtree.setInputCloud (cloud);//设置输入点
  pcl::PointXYZ searchPoint;//k邻近搜索int K = 10;//设置两个容器,第一个放点的标号,第二个点到SearchPoint的距离std::vector<int> pointIdxNKNSearch(K);std::vector<float> pointNKNSquaredDistance(K);//进行搜索,注意,此函数有返回值>0为找到,<0则没找到
   kdtree.nearestKSearch (searchPoint, K, pointIdxNKNSearch, pointNKNSquaredDistance)//    基于距离的搜索    ////两个未知大小的容器,作用同上std::vector<int> pointIdxRadiusSearch;std::vector<float> pointRadiusSquaredDistance;// 搜索半径float radius = 3;//搜索,效果同上kdtree.radiusSearch (searchPoint, radius, pointIdxRadiusSearch, pointRadiusSquaredDistance)
复制代码

   显然,我们还需要一个算法把Idx里的点云数据提取出来进行重新着色之类的工作,代码可以写作:

  

复制代码
    pcl::PointCloud<pcl::PointXYZ>::Ptr Npoints(new pcl::PointCloud<pcl::PointXYZ>);Npoints->height=1;Npoints->width=searchindice.size();Npoints->resize (searchindice.size());//注意此清空操作非常极其以及特别重要,否则Npoints中会有莫名奇妙的点。Npoints->clear();int PointNUM = 0;for(int i=0;i<searchindice.size();++i){   PointNUM = searchindice[i];Npoints->push_back(cloud->points[PointNUM]);//    cout<<distance[i]<<",  "<<cloud->points[PointNUM].x<<"  "<<cloud->points[PointNUM].y<<"  "<<cloud->points[PointNUM].z<<"  "<<endl;
    }pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> Npoints_color_handler (Npoints, 0, 255, 0);viewer->addPointCloud(Npoints,Npoints_color_handler,"Npoints");viewer->setPointCloudRenderingProperties (pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 5, "Npoints");
复制代码

 

1.2 OcTree

  OcTree是一种更容易理解也更自然的思想。对于一个空间,如果某个角落里有个盒子我们却不知道在哪儿。但是"神"可以告诉我们这个盒子在或者不在某范围内,显而易见的方法就是把空间化成8个卦限,然后询问在哪个卦限内。再将存在的卦限继续化成8个。意思大概就是太极生两仪,两仪生四象,四象生八卦,就这么一直划分下去,最后一定会确定一个非常小的空间。对于点云而言,只要将点云的立方体凸包用octree生成很多很多小的卦限,那么在相邻卦限里的点则为相邻点。

 

  显然,对于不同点云应该采取不同的搜索策略,如果点云是疏散的,分布很广泛,且每什么规律(如lidar测得的点云或双目视觉捕捉的点云)kdTree能更好的划分,而octree则很难决定最小立方体应该是多少。太大则一个立方体里可能有很多点云,太小则可能立方体之间连不起来。如果点云分布非常规整,是某个特定物体的点云模型,则应该使用ocTree,因为很容易求解凸包并且点与点之间相对距离无需再次比对父节点和子节点,更加明晰。典型的例子是斯坦福的兔子。

这篇关于谁是我邻居--kdTreeOcTree的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/432223

相关文章

PCL 基于八叉树获取体素邻居

文章目录 一、简介二、实现代码三、实现效果参考资料 一、简介 基于一个指定的体素,通过八叉树获取该体素周围的体素点云。 二、实现代码 //标准文件#include <iostream>#include <thread>//PCL#include <pcl/common/common.h>#include

基于用户的协同过滤推荐算法单机版代码实现(包含输出用户-评分矩阵模型、用户间相似度、最近邻居、推荐结果、平均绝对误差MAE、查准率、召回率)

基于用户的协同过滤推荐算法单机版代码实现(包含输出用户-评分矩阵模型、用户间相似度、最近邻居、推荐结果、平均绝对误差MAE、查准率、召回率) 一、开发工具及使用技术 MyEclipse10、jdk1.7、mahout API、movielens数据集。 二、实现过程 1、定义用户-电影评分矩阵: /**  * 用户-电影评分矩阵工具类  */ public class DataMo

linux网络协议栈(四)链路层 (3)邻居子系统ARP

4.3、邻居子系统+ARP: 4.3.1、什么是邻居: 所谓邻居就是二层直连的两个主机,如A与B直连或者A与B通过二层交换机连接,都是邻居。邻居子系统的作用是就是实现L3地址和L2地址的映射关系。 邻居子系统本身只实现一个通用架构,具体实现按照具体的L3协议和L2协议确定,如对于IPV4/ethernet,ARP协议就是邻居子系统的实现内容,对于IPV6/ethernet则是ND协议,对于其

OSPF邻居建立后学不到路由?新手做项目最容易犯这个错!

号主:老杨丨11年资深网络工程师,更多网工提升干货,请关注公众号:网络工程师俱乐部 你们好,我的网工朋友。 新手经常会在配置OSPF时遇到一些棘手的问题,比如由于接口网络类型配置不一致导致的邻居关系建立失败,进而影响到路由的学习与业务的连通性。 想象一下,如果你的GPS系统突然显示所有路线都关闭了,你会如何找到目的地? 在网络中,OSPF协议就像是那个GPS系统,它通过动态路由选择来确

邻居好说话:冒泡排序

简化版的桶排序不仅仅有上一节所遗留的问题,更要命的是:它非常浪费空间!例如需要排序数的范围是0~2100000000之间,那你则需要申请2100000001个变量,也就是说要写成int a[2100000001]。因为我们需要用2100000001个“桶”来存储0~2100000000之间每一个数出现的次数。即便只给你5个数进行排序(例如这5个数是1,1912345678,2100000000,

外贸资讯 | 你看不上的邻居1-2月从中国进口额猛增

你看不上的邻居1-2月进口额猛增 被你猜对了,是印度 先是在俄罗斯最近的新闻报道里说,1月份中国成为印度主要贸易伙伴:两国贸易额增长16%,达到105亿美元。 然后去查了印度海关数据,也是中国排在第一,有意思的是俄罗斯是它的第二大进口来源国。它从俄罗斯大量进口,应该是转口的石油天然气,太精了。 也看一下它的1月份出口统计 最后去看了中国海关的统计数据,中国列了1-2月的数

绕过讯雷邻居的合谐教程.txt

邻居们好啊!有没有发现迅雷邻居最近不好用了? 因为他的屏蔽词词库越来越大了,目前我找到如下应对方法: --------------------------------------------------------------------------- 首先,寻找到forbidden_words.zip文件。 WIN7默认在C:\Users\Public\Documents\Thunder Ne

OSPF邻居震荡抑制

目录 前言: 产生原因 相关概念 实现原理 震荡检测 震荡抑制 退出震荡抑制 典型场景 基本场景 前言: OSPF邻居震荡抑制功能是一种震荡抑制方式,通过延迟邻居建立或调整链路开销为最大值的方法达到抑制震荡的目的。 产生原因 如果承载OSPF业务的接口状态在Up和Down之间切换,就会引起邻居状态的频繁震荡。此时,OSPF会快速发送Hello报文重新建立邻居,同步数据

网络学习:邻居发现协议NDP

目录 前言: 一、报文内容 二、地址解析----NS/NA 目标的被请求组播IP地址 邻居不可达性检测: 重复地址检测 路由器发现 地址自动配置 默认路由器优先级和路由信息发现 重定向 前言:         邻居发现协议NDP(Neighbor Discovery Protocol)是IPv6协议体系中一个重要的基础协议。邻居发现协议 替代了IPv4的ARP(Addr

BGP——基本概念1(自治系统、邻居建立、认证)

目录 基本概念 自治系统 BGP对等体概述 名词解释 基本概念 对等体类型 建立对等体关系的条件 对等体信息参数讲解 BGP邻居建立过程 BGP认证 基本概念 1.BGP 是路径矢量协议,是自治系统间的路由协议 2.BGP采用TCP  179号端口,工作在应用层的协议,BGP路由器之间基于TCP建立BGP会话 3.运行BGP的路由器称为BGP Spearker,他们