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));//主要说明的即为此函数