学校网站建设调查报告,做ppt赚钱的网站,asp网站做视频,创新的模板网站建设目录 1. kd树的意义2. kd树的使用 参考博客《欧式聚类#xff08;KD-Tree#xff09;详解#xff0c;保姆级教程》和《(三分钟)学会kd-tree 激光SLAM点云搜索常见》
1. kd树的意义
kd树是什么#xff1f;
kd树是一种空间划分的数据结构#xff0c;对于多个维度的数据KD-Tree详解保姆级教程》和《(三分钟)学会kd-tree 激光SLAM点云搜索常见》
1. kd树的意义
kd树是什么
kd树是一种空间划分的数据结构对于多个维度的数据按照某种规则选定某个维度在该维度下进行排序选择中间的数据作为划分节点然后分别对划分节点左边和右边的数据进行上面的划分步骤。
为什么需要kd树
三维点云的数据量较大使用kd树进行搜索可以减少时间可以确保点云的关联点寻找和匹配处于实时状态。总而言之就是利用kd树可以实现点云数据的快速搜索。
2. kd树的使用
使用kd树一般有两个任务分别是k近邻搜索和半径内搜索。代码实现主要参考双愚的代码 #include iostream
#include pcl/kdtree/kdtree_flann.h
#include pcl/point_cloud.h
#include vector
#include ctimeint main(int argc, char** argv)
{srand(time(NULL));//第一步生成点云pcl::PointCloudpcl::PointXYZ::Ptr cloud (new pcl::PointCloudpcl::PointXYZ);cloud-width 100;cloud-height 1;cloud-points.resize(cloud-width * cloud-height);for (size_t i0; i cloud-points.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);}//第二步生成搜索点pcl::PointXYZ searchPoint;searchPoint.x 1024.0f * rand() / (RAND_MAX 1.0f);searchPoint.y 1024.0f * rand() / (RAND_MAX 1.0f);searchPoint.z 1024.0f * rand() / (RAND_MAX 1.0f);//第三步定义kd树pcl::KdTreeFLANNpcl::PointXYZ kdtree;kdtree.setInputCloud(cloud); //将点云cloud作为输入//第四步采用kdtree.nearestKSearch方法输出点searchPoint的最近10个点云int K 10;std::cout K nearest neighbor search at ( searchPoint.x searchPoint.y searchPoint.z ) with K K std::endl;std::vectorint pointIdxNKNSearch(K);std::vectorfloat pointNKNSquaredDistance(K);if (kdtree.nearestKSearch(searchPoint, K, pointIdxNKNSearch, pointNKNSquaredDistance) 0){for (size_t i0; ipointIdxNKNSearch.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;}}//第五步采用kdtree.radiusSearch方法输出点searchPoint的给定半径距离内的其他点float radius 256.0f * rand() / (RAND_MAX 1.0f);std::cout Neighbors within radius search at ( searchPoint.x searchPoint.y searchPoint.z ) with radius radius std::endl;std::vectorint pointIdxRadiusSearch;std::vectorfloat pointRadiusSquaredDistance;if (kdtree.radiusSearch(searchPoint, radius, pointIdxRadiusSearch, pointRadiusSquaredDistance) 0){for (size_t i 0; i pointIdxRadiusSearch.size (); i){std::cout cloud-points[ pointIdxRadiusSearch[i] ].x cloud-points[ pointIdxRadiusSearch[i] ].y cloud-points[ pointIdxRadiusSearch[i] ].z (squared distance: pointRadiusSquaredDistance[i] ) std::endl;}}return 0;
}CMakeLists.txt
cmake_minimum_required(VERSION 2.8 FATAL_ERROR)project(kdtree_search)find_package(PCL)add_executable(kdtree_search kdtree_search.cpp)
target_link_libraries(kdtree_search ${PCL_LIBRARIES})运行结果