ApproximateVoxelGrid和VoxelGrid详解
PCL点云库-ApproximateVoxelGrid和VoxelGrid详解
- 1.前言
- 2.ApproximateVoxelGrid
- 3.VoxelGrid
- 4.分析原因
- 5.总结
1.前言
网上关于这两个的介绍,主要就是说:Approximate是求取的点云中心,VoxelGrid求取的是点云重心,但是点云本身是没有质量等能够求取点云重心的属性的,也就是说,点云的重心和中心是一致的,那么这两者的区别在什么地方呢?下面逐个进行介绍。两者设置体素大小为0.1,0.1,0.1
2.ApproximateVoxelGrid
使用一下数据进行实验(体素大小0.1,0.1,0.1):
POINTS 4
DATA ascii
0.04 0.04 0.04
0.06 0.05 0.08
0.08 0.09 0.06
0.0 0.0 0.0
得到Approximate的结果如下:
POINTS 1
DATA ascii
0.044999998 0.045000002 0.044999998
3.VoxelGrid
使用同样的数据,采用VoxelGrid方法进行测试(体素大小0.1,0.1,0.1):
POINTS 1
DATA ascii
0.044999998 0.045000002 0.044999998
4.分析原因
从以上测试结果可以看出,两者的结果是一致的,说明两者求得体素的坐标是一致的,但是两者究竟有什么不同呢?下面把数据换成经常使用的bunny.pcd 进行尝试,体素大小设置为0.1,0.1,0.1:
Approximate结果:
POINTS 11
DATA ascii
-0.032691099 0.27162147 0.17471828
0.028832393 0.28098819 0.17515437
-0.10149693 0.3929342 0.19868037
-0.040520184 0.33333206 0.18058498
0.03307664 0.32633963 0.17715645
-0.044258013 0.27539831 0.22635823
0.026912104 0.27516812 0.22207269
-0.1028813 0.38191426 0.20612897
-0.059437286 0.34165737 0.23051687
0.030122528 0.32957068 0.22502449
-0.043324616 0.40204018 0.22569159
VoxelGrid:
POINTS 11
DATA ascii
-0.032691084 0.27162111 0.17471828
0.02883238 0.28098813 0.17515427
-0.10149693 0.3929342 0.19868039
-0.040520199 0.3333326 0.18058489
0.033076655 0.32633996 0.17715652
-0.044257991 0.27539819 0.22635801
0.02691211 0.27516836 0.22207287
-0.10288131 0.38191435 0.20612894
-0.05943713 0.34165803 0.2305164
0.030122489 0.32957044 0.22502452
-0.043324623 0.40204024 0.22569156
虽然以上结果有细微差异,但可能是精度本身造成的,无法说明实质性问题。
下面改变体素大小为0.01,0.01,0.01
Approximate:
POINTS 2933
DATA ascii
0.015469999 0.33879003 0.24076335
-0.041140001 0.36688 0.23012
-0.0284 0.33820999 0.223445
0.0055939998 0.33579403 0.24381602
-0.020129999 0.31180999 0.24129
-0.090970002 0.36248001 0.22451
-0.056759998 0.36476001 0.24166
0.00127 0.34858999 0.23391999
0.035580002 0.34290999 0.22136
0.01446 0.336575 0.24237001
-0.02244 0.33939001 0.22861999
-0.05889 0.36109 0.24214999
.
.
.
VoxelGrid:
POINTS 818
DATA ascii
-0.024225555 0.27552536 0.14696814
-0.015552045 0.27729389 0.14661342
-0.0071881819 0.27919725 0.14865817
-0.022413665 0.2823284 0.14752102
-0.014937567 0.28500649 0.14624217
-0.0050424999 0.28537068 0.14697167
0.0045101955 0.28630352 0.14812391
0.013244999 0.28799775 0.14888
-0.01018 0.29023999 0.1494
.
.
.
此时,两者的巨大差异体现出来了,Approximate比VoxelGrid多了很多点,翻看Approximate的源码可以看出:
int ix = static_cast<int> (floor (input_->points[cp].x * inverse_leaf_size_[0]));int iy = static_cast<int> (floor (input_->points[cp].y * inverse_leaf_size_[1]));int iz = static_cast<int> (floor (input_->points[cp].z * inverse_leaf_size_[2]));unsigned int hash = static_cast<unsigned int> ((ix * 7171 + iy * 3079 + iz * 4231) & (histsize_ - 1));he *hhe = &history_[hash];if (hhe->count && ((ix != hhe->ix) || (iy != hhe->iy) || (iz != hhe->iz))) {flush (output, op++, hhe, rgba_index, centroid_size);hhe->count = 0;hhe->centroid.setZero ();// = Eigen::VectorXf::Zero (centroid_size);}
代码中的hash和ix,iy,iz并不是一一对应的关系,当点云中的一个点所属的包围和已经有其他点,并且此包围盒计算的hash和之前计算的包围盒hash重复,Approximate会把包围盒直接进行计算,输出到目标点云。但是由于hash和ix,iy,iz,并不是一一对应的,所以最终的结果会出现一个包围盒中有多个点的现象。
(这点我可能介绍的不是很明白,源码中的hash语句完全摸不着头脑,不知道为什么要定义这个玩意)
VoxelGrid就是保持一个体素中有一个点,得到的结果和八叉树结果类似。
5.总结
从以上分析可知:Approximate当体素设置的比较大时,和VoxelGrid的结果保持一致;当体素设置的比较小时,会出现一个体素中有多个点的情况。体素设置的阈值应该是和点云的包围盒数量有关,大于512个就会出现一个体素内多个点的情况。
(关于Approximate的源代码,我对hash也是有疑问的,如果解释的不对,请直接在评论当中指出,谢谢)
ApproximateVoxelGrid和VoxelGrid详解相关推荐
- 用pcl读ply文件_一分钟详解PCL中点云配准技术
原文首发于微信公众号「3D视觉工坊」:一分钟详解PCL中点云配准技术 本文是对前两篇文章:点云配准(一 两两配准)以及3D点云(二 多福点云配准)的补充,希望可以在一定程度上帮助大家对点云配准理解地更 ...
- SLAM学习笔记(二十)LIO-SAM流程及代码详解(最全)
写在前面 关于安装配置,博客LIO_SAM实测运行,论文学习及代码注释[附对应google driver数据] 我觉得已经写的比较完善了.但是我觉得在注释方面,这位博主写的还不够完善,因此在学习以后, ...
- 点云配准NDT (P2D)算法详解
点云配准NDT (P2D)算法详解 最近了解了一些关于点云配准算法NDT的相关文章,进行总结一下. NDT算法的关键是其利用正态分布对参考点云进行了重新表示,使用点云在一个模型特定位置的似然值而不是直 ...
- 从命令行到IDE,版本管理工具Git详解(远程仓库创建+命令行讲解+IDEA集成使用)
首先,Git已经并不只是GitHub,而是所有基于Git的平台,只要在你的电脑上面下载了Git,你就可以通过Git去管理"基于Git的平台"上的代码,常用的平台有GitHub.Gi ...
- JVM年轻代,老年代,永久代详解
秉承不重复造轮子的原则,查看印象笔记分享连接↓↓↓↓ 传送门:JVM年轻代,老年代,永久代详解 速读摘要 最近被问到了这个问题,解释的不是很清晰,有一些概念略微模糊,在此进行整理和记录,分享给大家.在 ...
- docker常用命令详解
docker常用命令详解 本文只记录docker命令在大部分情境下的使用,如果想了解每一个选项的细节,请参考官方文档,这里只作为自己以后的备忘记录下来. 根据自己的理解,总的来说分为以下几种: Doc ...
- 通俗易懂word2vec详解词嵌入-深度学习
https://blog.csdn.net/just_so_so_fnc/article/details/103304995 skip-gram 原理没看完 https://blog.csdn.net ...
- 深度学习优化函数详解(5)-- Nesterov accelerated gradient (NAG) 优化算法
深度学习优化函数详解系列目录 深度学习优化函数详解(0)– 线性回归问题 深度学习优化函数详解(1)– Gradient Descent 梯度下降法 深度学习优化函数详解(2)– SGD 随机梯度下降 ...
- CUDA之nvidia-smi命令详解---gpu
nvidia-smi是用来查看GPU使用情况的.我常用这个命令判断哪几块GPU空闲,但是最近的GPU使用状态让我很困惑,于是把nvidia-smi命令显示的GPU使用表中各个内容的具体含义解释一下. ...
最新文章
- Pycharm出现out of memory 的终极解决方法
- C++ Map Source
- python动态图片转字符画_使用python实现一个将图片转换成字符画的功能
- python基于rsa的数字签名实现_青岛宽客聚会期权定价公式基于python的实现
- python 字符串 编码 解码_Python 字符串编解码研究
- CentOS7 编译安装golang和rpm安装golang
- 热烈庆祝《Python可以这样学》在台湾发行繁体版
- Delphi2010中向TRxRichEdit控件中插入OLE对象。
- 京东2019校园招聘测试开发工程师面试经历
- 方差 标准差_总体、样本、总体方差、样本方差、抽样方差和标准误
- 关闭Tomcat报错The web application [ROOT] appears to have started a thread named [Abandoned connectio
- 中央广播电视大学中等专业办公设备使用与维护
- HTML5文字转语音源码,微软TTS语音源码(将文本转为语音并播放)
- PowerMILL宏自动化编程教程
- 基于RNN的短期股票预测
- VS.NET 2003简体中文版下载
- html沙盘图插件,3D Map Generator(3D沙盘设计PS插件)V1.0 正式版
- python接单业余赚钱的门路_用Python赚钱的5个方法,教你业余时间月赚几千外快...
- 前端学习笔记——JavaScript进阶
- Android11文件管理权限申请