3d激光雷达开发(八叉树)
【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱: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激光雷达开发(八叉树)相关推荐
- 3d激光雷达开发(入门)
[ 声明:版权所有,欢迎转载,请勿用于商业用途. 联系信箱:feixiaoxing @163.com] 大约在2017年的时候,学习百度的apollo系统的时候,就知道3d激光雷达了.3d激光雷达和普 ...
- 3d激光雷达开发(pcl安装和使用)
[ 声明:版权所有,欢迎转载,请勿用于商业用途. 联系信箱:feixiaoxing @163.com] 之前讨论过,目前3d激光雷达这块,算法部分用的最多的就是pcl库.网上很多教程都是讲pcl在li ...
- 3d激光雷达开发(从halcon看点云pcl库)
[ 声明:版权所有,欢迎转载,请勿用于商业用途. 联系信箱:feixiaoxing @163.com] 做点云开发的,很少有不知道pcl库的,这一点就有点像做数字图像处理的,很少有不知道opencv的 ...
- 3d激光雷达开发(多雷达标定)
[ 声明:版权所有,欢迎转载,请勿用于商业用途. 联系信箱:feixiaoxing @163.com] 有过camera开发经验的朋友都知道,camera有两种标定.一种是内参标定,主要是标定切向畸变 ...
- 3d激光雷达开发(平面映射)
[ 声明:版权所有,欢迎转载,请勿用于商业用途. 联系信箱:feixiaoxing @163.com] 3d点云当中,一个经常用到的方法就是先找到一个平面,然后将点映射到平面上面.这个里面用到的数据结 ...
- 3d激光雷达开发(ndt匹配)
[ 声明:版权所有,欢迎转载,请勿用于商业用途. 联系信箱:feixiaoxing @163.com] 除了icp匹配之外,ndt匹配也是使用比较多的一种方法.相比较icp而言,ndt匹配花的时间要少 ...
- 3d激光雷达开发(icp匹配)
[ 声明:版权所有,欢迎转载,请勿用于商业用途. 联系信箱:feixiaoxing @163.com] 所谓匹配,其实就是看两个点云数据里面,哪些关键点是一样的.这样就可以把一个点云移动到另外合适的位 ...
- 3d激光雷达开发(法向量预测)
[ 声明:版权所有,欢迎转载,请勿用于商业用途. 联系信箱:feixiaoxing @163.com] 法向量在3d点云当中扮演很重要的一个角色.一个三维数据点的特征,不仅和它自己有关,还和它周围的点 ...
- 3d激光雷达开发(lidar使用)
[ 声明:版权所有,欢迎转载,请勿用于商业用途. 联系信箱:feixiaoxing @163.com] 安装好了pcl库之后,下面就是需要想办法采集真实的雷达数据了.和camera不同,3d雷达一般需 ...
最新文章
- 小学生计算机课堂实践的重要性,多媒体在小学教学中的重要性
- 为什么你今年的去哪儿产品经理面试挂了?
- [leetcode] 472. 连接词
- ajax返回的java list_ssm+ajax异步请求返回list遍历
- java if if else语句_Java if else条件判断语句用法
- html5网页设计作业代码 大学生校园网站制作 学校官网制作html
- linux截屏 保存目录,linux设置截屏图片的保存路径
- java-家庭作业1
- 自信转运--《奇迹男孩》
- macOS Big Sur 11.2.3 (20D91) 正式版发布,百度网盘下载
- 上海基诺墙绘 中荷学生共同创作涂鸦 “We are伐木累”示好
- 【STM32】TCL2543CN 12位11通道ADC芯片stm驱动程序,使用32自带SPI实现
- css html5 css3
- 西门子博途软件安装及使用
- Linux下使用df与du命令查看磁盘空间
- python dataframe索引筛选_python-Pandas DataFrame:查找两列相等/相同的特定长度序列的索引值...
- 《网络安全工程师笔记》 第十二章:域
- 安超云生态 | 安超云与百信完成产品兼容互认证 携手打造协同生态
- linux USB虚拟串口设备名的修改
- AE学习——建议使用2020版本