【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】

和kd树一样,八叉树也是一种数据管理方式。如果二叉树分别由左子树和右子树两个分支,那么八叉树就有八个分支。选择这一种数据结构主要也是为了查找方便。参考代码可以查找这个链接,https://pcl.readthedocs.io/projects/tutorials/en/master/octree.html#octree-search

1、准备octree_search.cpp文件

#include <pcl/point_cloud.h>
#include <pcl/octree/octree_search.h>#include <iostream>
#include <vector>
#include <ctime>int
main ()
{srand ((unsigned int) time (NULL));pcl::PointCloud<pcl::PointXYZ>::Ptr cloud (new pcl::PointCloud<pcl::PointXYZ>);// Generate pointcloud datacloud->width = 1000;cloud->height = 1;cloud->points.resize (cloud->width * cloud->height);for (std::size_t i = 0; i < cloud->size (); ++i){(*cloud)[i].x = 1024.0f * rand () / (RAND_MAX + 1.0f);(*cloud)[i].y = 1024.0f * rand () / (RAND_MAX + 1.0f);(*cloud)[i].z = 1024.0f * rand () / (RAND_MAX + 1.0f);}float resolution = 128.0f;pcl::octree::OctreePointCloudSearch<pcl::PointXYZ> octree (resolution);octree.setInputCloud (cloud);octree.addPointsFromInputCloud ();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);// Neighbors within voxel searchstd::vector<int> pointIdxVec;if (octree.voxelSearch (searchPoint, pointIdxVec)){std::cout << "Neighbors within voxel search at (" << searchPoint.x << " " << searchPoint.y << " " << searchPoint.z << ")" << std::endl;for (std::size_t i = 0; i < pointIdxVec.size (); ++i)std::cout << "    " << (*cloud)[pointIdxVec[i]].x << " " << (*cloud)[pointIdxVec[i]].y << " " << (*cloud)[pointIdxVec[i]].z << std::endl;}// K nearest neighbor searchint K = 10;std::vector<int> pointIdxNKNSearch;std::vector<float> pointNKNSquaredDistance;std::cout << "K nearest neighbor search at (" << searchPoint.x << " " << searchPoint.y << " " << searchPoint.z<< ") with K=" << K << std::endl;if (octree.nearestKSearch (searchPoint, K, pointIdxNKNSearch, pointNKNSquaredDistance) > 0){for (std::size_t i = 0; i < pointIdxNKNSearch.size (); ++i)std::cout << "    "  <<   (*cloud)[ pointIdxNKNSearch[i] ].x << " " << (*cloud)[ pointIdxNKNSearch[i] ].y << " " << (*cloud)[ pointIdxNKNSearch[i] ].z << " (squared distance: " << pointNKNSquaredDistance[i] << ")" << std::endl;}// Neighbors within radius searchstd::vector<int> pointIdxRadiusSearch;std::vector<float> pointRadiusSquaredDistance;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;if (octree.radiusSearch (searchPoint, radius, pointIdxRadiusSearch, pointRadiusSquaredDistance) > 0){for (std::size_t i = 0; i < pointIdxRadiusSearch.size (); ++i)std::cout << "    "  <<   (*cloud)[ pointIdxRadiusSearch[i] ].x << " " << (*cloud)[ pointIdxRadiusSearch[i] ].y << " " << (*cloud)[ pointIdxRadiusSearch[i] ].z << " (squared distance: " << pointRadiusSquaredDistance[i] << ")" << std::endl;}}

2、代码分析

和kd树一样,八叉树也支持最近点查找和半径查找。除此之外,八叉树还支持体素查找,这是额外的一种查找方法。

3、准备CMakeLists.txt文件

cmake_minimum_required(VERSION 3.5 FATAL_ERROR)project(octree_search)find_package(PCL 1.2 REQUIRED)include_directories(${PCL_INCLUDE_DIRS})
link_directories(${PCL_LIBRARY_DIRS})
add_definitions(${PCL_DEFINITIONS})add_executable (octree_search octree_search.cpp)
target_link_libraries (octree_search ${PCL_LIBRARIES})

4、生成sln文件,准备编译

用cmake生成文件之后就可以开始编译了。

5、准备执行octree_search.exe,

执行过程中,可能会出现缺少dll的情况,像这样,

补全dll后,就可以正常执行exe文件了,

3d激光雷达开发(八叉树)相关推荐

  1. 3d激光雷达开发(入门)

    [ 声明:版权所有,欢迎转载,请勿用于商业用途. 联系信箱:feixiaoxing @163.com] 大约在2017年的时候,学习百度的apollo系统的时候,就知道3d激光雷达了.3d激光雷达和普 ...

  2. 3d激光雷达开发(pcl安装和使用)

    [ 声明:版权所有,欢迎转载,请勿用于商业用途. 联系信箱:feixiaoxing @163.com] 之前讨论过,目前3d激光雷达这块,算法部分用的最多的就是pcl库.网上很多教程都是讲pcl在li ...

  3. 3d激光雷达开发(从halcon看点云pcl库)

    [ 声明:版权所有,欢迎转载,请勿用于商业用途. 联系信箱:feixiaoxing @163.com] 做点云开发的,很少有不知道pcl库的,这一点就有点像做数字图像处理的,很少有不知道opencv的 ...

  4. 3d激光雷达开发(多雷达标定)

    [ 声明:版权所有,欢迎转载,请勿用于商业用途. 联系信箱:feixiaoxing @163.com] 有过camera开发经验的朋友都知道,camera有两种标定.一种是内参标定,主要是标定切向畸变 ...

  5. 3d激光雷达开发(平面映射)

    [ 声明:版权所有,欢迎转载,请勿用于商业用途. 联系信箱:feixiaoxing @163.com] 3d点云当中,一个经常用到的方法就是先找到一个平面,然后将点映射到平面上面.这个里面用到的数据结 ...

  6. 3d激光雷达开发(ndt匹配)

    [ 声明:版权所有,欢迎转载,请勿用于商业用途. 联系信箱:feixiaoxing @163.com] 除了icp匹配之外,ndt匹配也是使用比较多的一种方法.相比较icp而言,ndt匹配花的时间要少 ...

  7. 3d激光雷达开发(icp匹配)

    [ 声明:版权所有,欢迎转载,请勿用于商业用途. 联系信箱:feixiaoxing @163.com] 所谓匹配,其实就是看两个点云数据里面,哪些关键点是一样的.这样就可以把一个点云移动到另外合适的位 ...

  8. 3d激光雷达开发(法向量预测)

    [ 声明:版权所有,欢迎转载,请勿用于商业用途. 联系信箱:feixiaoxing @163.com] 法向量在3d点云当中扮演很重要的一个角色.一个三维数据点的特征,不仅和它自己有关,还和它周围的点 ...

  9. 3d激光雷达开发(lidar使用)

    [ 声明:版权所有,欢迎转载,请勿用于商业用途. 联系信箱:feixiaoxing @163.com] 安装好了pcl库之后,下面就是需要想办法采集真实的雷达数据了.和camera不同,3d雷达一般需 ...

最新文章

  1. 小学生计算机课堂实践的重要性,多媒体在小学教学中的重要性
  2. 为什么你今年的去哪儿产品经理面试挂了?
  3. [leetcode] 472. 连接词
  4. ajax返回的java list_ssm+ajax异步请求返回list遍历
  5. java if if else语句_Java if else条件判断语句用法
  6. html5网页设计作业代码 大学生校园网站制作 学校官网制作html
  7. linux截屏 保存目录,linux设置截屏图片的保存路径
  8. java-家庭作业1
  9. 自信转运--《奇迹男孩》
  10. macOS Big Sur 11.2.3 (20D91) 正式版发布,百度网盘下载
  11. 上海基诺墙绘 中荷学生共同创作涂鸦 “We are伐木累”示好
  12. 【STM32】TCL2543CN 12位11通道ADC芯片stm驱动程序,使用32自带SPI实现
  13. css html5 css3
  14. 西门子博途软件安装及使用
  15. Linux下使用df与du命令查看磁盘空间
  16. python dataframe索引筛选_python-Pandas DataFrame:查找两列相等/相同的特定长度序列的索引值...
  17. 《网络安全工程师笔记》 第十二章:域
  18. 安超云生态 | 安超云与百信完成产品兼容互认证 携手打造协同生态
  19. linux USB虚拟串口设备名的修改
  20. AE学习——建议使用2020版本

热门文章

  1. [MSP430DriverLib-2]使用延时让LED闪烁
  2. iOS开发基础:OC数组对象NSArray的常用方法
  3. 真的假的?LiFi或将取代WiFi
  4. 使用PowerShel导入和导出Hyper-v虚拟机
  5. 视图中获取控制器中数据的方式
  6. win7中配置iis
  7. 让计划任务生成的文件中包含当前日期
  8. 学习 ASP.NET MVC (第二回)实战篇
  9. 【洛谷 P1070】道路游戏 (DP)
  10. 15_http响应相关概念