PCL点云库:Kd树

  Kd树按空间划分生成叶子节点,各个叶子节点里存放点数据,其可以按半径搜索或邻区搜索。PCL中的Kd tree的基础数据结构使用了FLANN以便可以快速的进行邻区搜索。FLANN is a library for performing fast approximate nearest neighbor searches in high dimensional spaces。下面是一个最基本的例子,只寻找一个最近点:

#include <pcl/point_cloud.h>
#include <pcl/kdtree/kdtree_flann.h>

#include <iostream>
#include <vector>
#include <ctime>

int main (int argc, char** argv)
{
    srand (time (NULL));  //seeds rand() with the system time 

    time_t begin,end;
    begin = clock();  //开始计时
    //-------------------------------------------------------------------------------
    pcl::PointCloud<pcl::PointXYZ>::Ptr cloud (new pcl::PointCloud<pcl::PointXYZ>);

    // Generate pointcloud data
    cloud->width = 400000;
    cloud->height = 1;
    cloud->points.resize (cloud->width * cloud->height);

    // fills a PointCloud with random data
    for (size_t i = 0; 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);
    }

    // creates kdtree object
    pcl::KdTreeFLANN<pcl::PointXYZ> kdtree;

    // sets our randomly created cloud as the input
    kdtree.setInputCloud (cloud);

    //create a “searchPoint” which is assigned random coordinates
    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);

    // K nearest neighbor search
    int K = 1;
    std::vector<int> pointIdxNKNSearch(K);
    std::vector<float> pointNKNSquaredDistance(K);

    std::cout << "K nearest neighbor search at (" << searchPoint.x
        << " " << searchPoint.y
        << " " << searchPoint.z
        << ") with K=" << K << std::endl;

    /***********************************************************************************************
    template<typename PointT>
    virtual int pcl::KdTree< PointT >::nearestKSearch  ( const PointT &  p_q,
                                                        int  k,
                                                        std::vector< int > &  k_indices,
                                                        std::vector< float > &  k_sqr_distances
                                                        )  const [pure virtual] 

    Search for k-nearest neighbors for the given query point.
    Parameters:
        [in] the given query point
        [in] k the number of neighbors to search for
        [out] the resultant indices of the neighboring points
        [out] the resultant squared distances to the neighboring points
    Returns:
        number of neighbors found
    ********************************************************************************************/
    if ( kdtree.nearestKSearch (searchPoint, 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 Times =  double(end - begin) / CLOCKS_PER_SEC; //将clock()函数的结果转化为以秒为单位的量

    std::cout<<"time: "<<Times<<"s"<<std::endl;

    return 0;
}

  生成四十万个随机点,release版本下测试0.3s左右找到最近点,这比之前自己写的Kd树不知快到哪里去了。当然自己写只是为了更好的理解其中的原理,真要用的时候还得靠别人的轮子...

参考:

How to use a KdTree to search

Module kdtree

时间: 2024-10-18 11:07:58

PCL点云库:Kd树的相关文章

《VS2010(X64)&amp;PCL点云库学习》Part 2 A simple test of PCL in MFC

<VS2010(X64)&PCL点云库学习>Part 2 A simple test of PCL in MFC                                                                             本文主要介绍如何将PCL的控制台程序移植到MFC中,基本内容还是按照上一篇PCL配置博文来继续讲解的. 1.新建MFC程序 2.应用程序类型对话框中,勾选基于对话框,一直下一步,或者直接点击完成. 3.配置环境:主要包括添加

Windows下安装PCL点云库

原文链接:http://blog.csdn.net/u012337034/article/details/38270109 简介: 在Windows下安装PCL点云库的方法大概有两种:其一,all-in-one-installer,这个只有两个版本1.5.1和1.6.0,而且顾名思义,安装方法极其简单,这里就不多做介绍了:其二,build PCL out of source,这里我们可以使用PCL的各种版本,而且随着PCL的更新,我们也可以不断的update.接下来我将会详细介绍如何独立安装PC

[PCL](1)PCL点云库安装

1.安装文件下载:官网,我还是比较喜欢别人编译好的安装包啊,哈哈. http://www.pointclouds.org/downloads/windows.html 2.傻瓜式安装(下面的依赖项都集成进来了) 写入环境变量,这个很不错,可选. 中间安装了Boost.VTK.Kinect驱动什么的.反正是一路下一步,当然我的机器是Win7系统,之前没有安装过PCL,比较纯净. 之后又单独安装了QT4.8.2的sdk. 3.测试 在安装目录下有share/doc/pcl-1.6/tutorials

《PCL点云库学习&amp;VS2010(X64)》Part 8 PCL1.72(VTK6.2.0)可视化例程

Part 8 PCL1.72(VTK6.2.0)可视化例程                                                                                                PCL1.72 VTK6.20 控制台程序 加入.props属性表文件 1.Cloud_Viewer Cloud_Viewer.cpp代码: #include <vtkAutoInit.h> VTK_MODULE_INIT(vtkRendering

PCL点云库中怎样读取指定的PCD文件,又一次命名,处理后保存到指定目录

我一直想把处理后的pcd文件重命名,然后放到指定的目录,尝试了好久最终做到了: 比方我想读取  "table_scene_lms400.pcd" 把它进行滤波处理,重命名为 "table_scene_lms400_filter.pcd" ,然后保存到  "C:\PCD_FILTER\"文件夹下. 基本的语句例如以下: <span style="font-family:Microsoft YaHei;font-size:14px;&

PCL点云库中如何读取指定的PCD文件,重新命名,处理后保存到指定文件夹

我一直想把处理后的pcd文件重命名,然后放到指定的文件夹,尝试了好久终于做到了: 比如我想读取  "table_scene_lms400.pcd" 把它进行滤波处理,重命名为 "table_scene_lms400_filter.pcd" ,然后保存到  "C:\PCD_FILTER\"目录下. 主要的语句如下: <span style="font-family:Microsoft YaHei;font-size:14px;&qu

从K近邻算法、距离度量谈到KD树、SIFT+BBF算法

从K近邻算法.距离度量谈到KD树.SIFT+BBF算法 从K近邻算法.距离度量谈到KD树.SIFT+BBF算法 前言 前两日,在微博上说:“到今天为止,我至少亏欠了3篇文章待写:1.KD树:2.神经网络:3.编程艺术第28章.你看到,blog内的文章与你于别处所见的任何都不同.于是,等啊等,等一台电脑,只好等待..”.得益于田,借了我一台电脑(借他电脑的时候,我连表示感谢,他说“能找到工作全靠你的博客,这点儿小忙还说,不地道”,有的时候,稍许感受到受人信任也是一种压力,愿我不辜负大家对我的信任)

多维空间分割树--KD树

算法介绍 KD树的全称为k-Dimension Tree的简称,是一种分割K维空间的数据结构,主要应用于关键信息的搜索.为什么说是K维的呢,因为这时候的空间不仅仅是2维度的,他可能是3维,4维度的或者是更多.我们举个例子,如果是二维的空间,对于其中的空间进行分割的就是一条条的分割线,比如说下面这个样子. 如果是3维的呢,那么分割的媒介就是一个平面了,下面是3维空间的分割 这就稍稍有点抽象了,如果是3维以上,我们把这样的分割媒介可以统统叫做超平面 .那么KD树算法有什么特别之处呢,还有他与K-NN

PCL中点云数据格式之间的转化

(1) 关于pcl::PCLPointCloud2::Ptr和pcl::PointCloud<pcl::PointXYZ>两中数据结构的区别 pcl::PointXYZ::PointXYZ ( float_x, float_y, float_z ) 区别: struct PCLPointCloud2 { PCLPointCloud2 () : header (), height (0), width (0), fields (), is_bigendian (false), point_ste