【C++】PCL对大容量点云进行体素降采样

news/2024/11/25 12:26:01/

文章目录

  • 0.引言
  • 1.普通体素降采样
  • 2.OcTree体素降采样

0.引言

\qquadPCL的体素滤波器如果对超大容量点云进行降采样,要求降采样后的格点数目必须在整型的范围,不然就会报[pcl::VoxelGrid::applyFilter] Leaf size is too small for the input dataset. Integer indices would overflow的错误。本文使用PCL中OcTree结构实现大容量点云的分块存储和分块体素降采样,以达到近似的全局体素降采样效果。
StackOverFlow 参考链接🔗

1.普通体素降采样

\qquadPCL普通的体素降采样只需要调用VoxelGrid库即可,这里给出了一个示例函数。只需要设置体素大小cell_x, cell_y, cell_z即可,其要求降采样后格点不能超过整型的最大值。对于激光雷达扫描的点云,一般原点云数超过10万就不能在再采用这个方法了。

#include <pcl/filters/extract_indices.h>  
#include <pcl/filters/filter.h>
#include <pcl/filters/voxel_grid.h>
#include <pcl/point_types.h>
typedef pcl::PointXYZI PointType;pcl::PointCloud<PointType>::Ptr FILTREexample(pcl::PointCloud<PointType>::Ptr pointcloud, pcl::IndicesPtr indices, float cell_x, float cell_y, float cell_z) {pcl::PointCloud<PointType>::Ptr filtered_pointcloud(new pcl::PointCloud<PointType>);pcl::VoxelGrid<PointType> sor;sor.setInputCloud(pointcloud);sor.setLeafSize(cell_x, cell_y, cell_z);sor.filter(*filtered_pointcloud); // No problem :)return filtered_pointcloud;
}

2.OcTree体素降采样

\qquadPCL库中并没有给出直接的实例教程,所以本文在这里简要说明以下,VoxelGrid体素滤波器有一个函数sor.setIndices(indices);,其中indices就是大体素点云拆分成一个个小点云团的分区序号数组,这个数组的构建通过OcrTree的近邻搜索加以构建,具体如下:

pcl::PointCloud<PointType>::Ptr subFilter(pcl::PointCloud<PointType>::Ptr pointcloud, pcl::IndicesPtr indices, float cell_x, float cell_y, float cell_z) {pcl::PointCloud<PointType>::Ptr filtered_pointcloud(new pcl::PointCloud<PointType>);pcl::VoxelGrid<PointType> sor;sor.setInputCloud(pointcloud);sor.setIndices(indices);sor.setLeafSize(cell_x, cell_y, cell_z);sor.filter(*filtered_pointcloud); // No problem :)return filtered_pointcloud;
}pcl::PointCloud<PointType>::Ptr OctFilter(pcl::PointCloud<PointType>::Ptr cloudIn, float cell_x, float cell_y, float cell_z) {    pcl::octree::OctreePointCloudSearch<PointType> octree(128);  // // Octree resolution - side length of octree voxelsoctree.setInputCloud(cloudIn);octree.addPointsFromInputCloud();pcl::octree::OctreePointCloud<PointType>::LeafNodeIterator it;pcl::octree::OctreePointCloud<PointType>::LeafNodeIterator it_end = octree.leaf_depth_end();pcl::PointCloud<PointType>::Ptr filtered_cloud(new pcl::PointCloud<PointType>);    for (it = octree.leaf_depth_begin(); it != it_end; ++it){pcl::IndicesPtr indexVector(new std::vector<int>);pcl::octree::OctreeContainerPointIndices& container = it.getLeafContainer();container.getPointIndices(*indexVector);*filtered_cloud += *subFilter(cloudIn, indexVector, cell_x,cell_y,cell_z);}return filtered_cloud;
}

其中128是Octree的分辨率,一般较大的点云需要设的大一些,如果设的过小,还是有可能在调用子函数subFilter产生相同的[pcl::VoxelGrid::applyFilter] Leaf size is too small for the input dataset. Integer indices would overflow错误。一个简单的用法如下:

pcl::PointCloud<PointType>::Ptr laserCloudIn(new pcl::PointCloud<PointType>);
// TODO: Load PointCloud into laserCloudIN
pcl::PointCloud<PointType>::Ptr laserCloudOut(new pcl::PointCloud<PointType>);
*laserCloudOut = *OctFilter(laserCloudIn, 0.05f, 0.05f, 0.05f);  // set your voxel size

http://www.ppmy.cn/news/6101.html

相关文章

整理各种Vue项目在IE浏览器白屏报错 SCRIPT1002:语法错误

目录 一、关于 sockjs-client 依赖包 二、关于 highlight 依赖包 三、关于 swiper 依赖包 四、IE 不支持 ES6 语法 五、第三方插件引入导致 六、本地环境正常&#xff0c;生产环境仍旧白屏 这篇文章主要介绍了 Vue 项目在 IE 浏览器显示白屏并报错 SCRIPT1002: 语法错误 …

7、操作系统之间的文件传输

Windows 与 Linux 在Windows与Linux中传输文件的常用方式有两种&#xff0c;一种是使用使用XFTP工具&#xff0c;另一种是使用rz sz 命令的方式进行 lrzsz 安装 yum install lrzsz -y 1&#xff09;rz 将文件从window上传到Linux 2&#xff09;sz 将文件从linux传输到window …

stm32cubemx hal学习记录:电机控制

一、基础配置 1、配置RCC、SYS&#xff0c;SYS的Timebase Source选择TIM6 2、配置USART1、时钟84MHz 3、激活FreeRTOS&#xff0c;选择CMSIS_V1&#xff0c;Config parameters种USE_TIMERS选择ENABLE 二、编码器及电机驱动引脚配置 1、选用TIM3的编码器模式 2、驱动使用L2…

react-router-dom 降低版本的两种方法

前言 react-router-dom 如今已经升级到了 V6 版本&#xff0c;相比较 V5 版本&#xff0c;变化还是挺大的。如今使用 npm install react-router-dom -S 命令来下载 react-router-dom &#xff0c;会自动下载 V6 版本&#xff0c; V6 版本会在接下来的一段时间内成为主流。不过…

Coinbase或在不久使用Zebec发放工资,并对Web3支付赛道发展寄予厚望

流支付协议Zebec Protocol目前已经完成了生态向BNB Chian上的迁移&#xff0c;目前得到了以PancakeSwap为代表的头部生态的支持。在12月20日Zebec生态在PancakeSwap官方的支持下&#xff0c;经过社区投票&#xff0c;ZBC通证上线了糖浆池&#xff0c;并有望继续上线Binance。而…

机器学习算法基础——决策树

文章目录决策树算法的定义发展历程适用范围及其优缺点适用范围优点缺点代码实现决策树算法的定义 决策树&#xff08;Decision Tree&#xff09;是在已知各种情况发生概率的基础上&#xff0c;通过构成决策树来求取净现值的期望值大于等于零的概率&#xff0c;评价项目风险&…

小程序02/小程序 响应式单位rpx 、image组件概念说明 和 mode属性介绍

一. 响应式单位rpx rpx 说明 rpx: 规定不管屏幕为多少px , 100%的屏幕宽度就是750rpx 100% 屏幕的宽度 750rpx rpx响应单位 rpx是微信小程序独有的&#xff0c;解决屏幕自适应的尺寸单位 可以根据屏幕宽度进行自适应&#xff0c;不论大小屏幕&#xff0c;规定屏幕宽为750…

基于ACO蚁群优化实现VRPTW问题求解matlab仿真

目录 1.算法概述 2.仿真效果 3.matlab仿真源码 1.算法概述 随着科学技术和生产的不断发展,许多实际问题不可能在合理的时间范围内找到全局最优解,这就促使了近代最优化问题求解方法的产生。随着各种不同搜索机制的启发式算法相继出现,如禁忌搜索、遗传算法、模拟退火算法…