博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
PCL库学习笔记(KD树及K近邻搜索)
阅读量:4049 次
发布时间:2019-05-25

本文共 2126 字,大约阅读时间需要 7 分钟。

本文学习了一种快速寻找无序点云的邻近点方法,就是构造KD树。用树这种数据结构,能够忽略掉许多点的比较,提高搜索速度。原理部分这篇博客讲的非常详细:

以下是在阅读完博主博文之后,自己仿照写的一个寻找最近点算法。代码还是要自己多写,粘贴复制一时爽,用的时候就会痛苦万分,不断去找文件和文件夹。

两点说明:

1、如果设置的目标点为待搜索点云中的点,则搜索到的邻近点包含其本身;
2、以下为寻找K个最近点,还有一种是寻找一定范围类的邻近点,大家对比分析;

#include
#include
#include
#include
#include
int main(){
srand(time(NULL)); time_t begin, end; begin = clock(); pcl::PointCloud
::Ptr cloud(new pcl::PointCloud
); cloud->height = 1; cloud->width = 100000; cloud->is_dense = true; cloud->resize(cloud->width*cloud->height); for (int i = 0; i < cloud->size(); i++) { cloud->points[i].x = 1024.0f*rand() / (RAND_MAX + 1.0f); cloud->points[i].y = 1024.0f*rand() / (RAND_MAX + 1.0f); cloud->points[i].z = 1024.0f*rand() / (RAND_MAX + 1.0f); } // creats kdtree object pcl::KdTreeFLANN
kdtree; //set input point cloud kdtree.setInputCloud(cloud); // set target point pcl::PointXYZ target; target.x = 1024.0f*rand() / (RAND_MAX + 1.0f); target.y = 1024.0f*rand() / (RAND_MAX + 1.0f); target.z = 1024.0f*rand() / (RAND_MAX + 1.0f); // set kdtree search int K = 10; std::vector
pointIdxNKNSearch(K); std::vector
pointNKNSquaredDistance(K); std::cout << "K nearset neighbor search at (" << target.x << " " << target.y << " " << target.z << "), with K = " << K << std::endl; if (kdtree.nearestKSearch(target, K, pointIdxNKNSearch, pointNKNSquaredDistance) > 0) { for (size_t i = 0; i < pointIdxNKNSearch.size(); ++i) std::cout << " " << cloud->points[pointIdxNKNSearch[i]].x << " " << cloud->points[pointIdxNKNSearch[i]].y << " " << cloud->points[pointIdxNKNSearch[i]].z << " (squared distance: " << pointNKNSquaredDistance[i] << ")" << std::endl; } end = clock(); double time = (end - begin) * 1000 / CLOCKS_PER_SEC; std::cout << "time: " << time << "ms" << std::endl; return 0;}

在半径范围内的搜索方式:

double radius;	if (kdtree.radiusSearch(searchpoint, radius, Idx, Distance) > 0) {
for (size_t i = 0; i < Idx.size(); i++) {
cout << cloud->points[Idx[i]].x << " " << cloud->points[Idx[i]].y << " " << cloud->points[Idx[i]].z << " " << Distance[i] << endl; } }

转载地址:http://ivyci.baihongyu.com/

你可能感兴趣的文章
spring JdbcTemplate 的若干问题
查看>>
Servlet和JSP的线程安全问题
查看>>
GBK编码下jQuery Ajax中文乱码终极暴力解决方案
查看>>
Oracle 物化视图
查看>>
PHP那点小事--三元运算符
查看>>
解决国内NPM安装依赖速度慢问题
查看>>
Brackets安装及常用插件安装
查看>>
Centos 7(Linux)环境下安装PHP(编译添加)相应动态扩展模块so(以openssl.so为例)
查看>>
fastcgi_param 详解
查看>>
Nginx配置文件(nginx.conf)配置详解
查看>>
标记一下
查看>>
IP报文格式学习笔记
查看>>
autohotkey快捷键显示隐藏文件和文件扩展名
查看>>
Linux中的进程
查看>>
学习python(1)——环境与常识
查看>>
学习设计模式(3)——单例模式和类的成员函数中的静态变量的作用域
查看>>
自然计算时间复杂度杂谈
查看>>
当前主要目标和工作
查看>>
使用 Springboot 对 Kettle 进行调度开发
查看>>
一文看清HBase的使用场景
查看>>