[PCL教程] PCL漫游之KdTree,OcTree,RANSAC

7 KD树 KdTree

7.1 基本原理

KD树,在k维空间中组织点云的数据结构,是一种二叉搜索树(对于3维点云,k=3)。可用于最近邻的搜索。KD树包括构建阶段和搜索阶段。
参考:KD树简介

  • 构建阶段:即对空间的切分,每轮切分按照一定原则先后切分k个维度。切分域(维度)的先后顺序可以根据方差(空间点的分布)确定,切分点选择中间点即可。

切分域的选择不一定用方差方式,可以简单的d mod n维度方式,d是树节点深度,n代表维度数量。该方法简单,效果也不错。
算法流程

  • 搜索阶段:1)寻找目标数据的近似最近点,即根据目标数据从根节点开始搜索kd树,找到对应的叶子节点作为近似最近点。2)回溯,沿着搜索路径回溯,以目标数据和近似最近点的距离作为判断依据,看看有无更近的点。

7.2 代码

//头文件
#include <pcl/kdtree/kdtree_flann.h>
...
// 定义KdTree对象
pcl::KdTreeFLANN<pcl::PointXYZ> kdtree;
// 设置输入
kdtree.setInputCloud (cloud);
// 搜索点
pcl::PointXYZ searchPoint;
// 近邻点数目
int K = 10;
// 近邻点搜索和距离
std::vector<int> pointIdxNKNSearch(K);
std::vector<float> pointNKNSquaredDistance(K);
// 搜索K近邻 (nearestKSearch),若多于0个,打印出来
if ( kdtree.nearestKSearch (searchPoint, K, pointIdxNKNSearch, pointNKNSquaredDistance) > 0 )
{
   
 for (std::size_t i = 0; i < pointIdxNKNSearch.size (); ++i)
   std::cout << "    "  <<   (*cloud)[ pointIdxNKNSearch[i] ].x 
             << " " << (*cloud)[ pointIdxNKNSearch[i] ].y 
             << " " << (*cloud)[ pointIdxNKNSearch[i
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值