使用Flann库实现KDtree半径查找时的参数SearchParams()参数设置记录

int neighbors_in_radius= kdtree.radiusSearch(seed_queue_points,radiusPointsIndex, radiusDists, radius2,SearchParams(-1,0.1, false))

本博客主要说明SearchParams的参数设置,试过SearchParams(128),同一个点云数据用时和使用PCL中的KDTREE时间基本一致。

补充影响速度较大的因素主要时排序
经过查看PCL和flann源码发现这个地方可设置三个参数,
三个参数,
第一个我使用默认参数,
第二个参数是判断精度,flann的默认参数是0 ,若不选择即为0,第三个参数是,找出的数据是否排序,默认未true,因为我使用的点云单位为mm,只有整数,故此处精度我选择0.1,SearchParams(-1,0.1, false)这样设置后,耗时少了一半

第三个true和false是选择输出搜索到的点是否排序,false不排序,时间直接大幅降低,
因为我使用此函数做欧氏距离聚类所用,所以我无需输出排序后的点,但搜索次数较多,因此我选择false为了缩短搜索时间,若搜索次数较少,且要求排序,则设为true即可。一般是距离从小到大排列,第一个值一般为搜索的数据本身。

第四个需要注意的是,设置半径时,flann::Index< L2 > 此处选择的时距离的平方,因此传入的半径应为半径平方,最开始调试时,未平方,导致找到的点已知对不上,
记录此博客,方便后续自己学习,希望高手能够详细讲解此flann库的用法,需要各种参数的设置和作用介绍,谢谢
在这里插入图片描述
在这里插入图片描述

实现该函数的调用如下:

#include "flann/flann.h"
struct MyEuclideanPoint
{
	float x;
	float y;
	float z;	
};
  std::vector<MyEuclideanPoint> data;
  for (size_t j = 0; j < inPointCloud.size(); j++)
  {
	  MyEuclideanPoint p;
	  p.x = inPointCloud[j].x;
	  p.y = inPointCloud[j].y;
	  p.z = inPointCloud[j].z;
	  data.push_back(p);
  }
	flann::Matrix<float> data_mat = flann::Matrix<float>(&data[0].x, data.size(), 3);
	//低维度数据参数:flann::KDTreeSingleIndexParams(15)
	flann::Index< L2<float> > kdtree(data_mat, flann::KDTreeSingleIndexParams(15));//此处的15,我再PCL使用KDTREE时,看到上面选择的15如下图
	kdtree.buildIndex();
		flann::Matrix<float> seed_queue_points(&data[seed_queue[sq_idx]].x,1,3);
			int neighbors_in_radius=  kdtree.radiusSearch(seed_queue_points,radiusPointsIndex, radiusDists, radius2,SearchParams(-1,0.1, false));//主要说明的即为此函数

在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值