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详解相关推荐

  1. 用pcl读ply文件_一分钟详解PCL中点云配准技术

    原文首发于微信公众号「3D视觉工坊」:一分钟详解PCL中点云配准技术 本文是对前两篇文章:点云配准(一 两两配准)以及3D点云(二 多福点云配准)的补充,希望可以在一定程度上帮助大家对点云配准理解地更 ...

  2. SLAM学习笔记(二十)LIO-SAM流程及代码详解(最全)

    写在前面 关于安装配置,博客LIO_SAM实测运行,论文学习及代码注释[附对应google driver数据] 我觉得已经写的比较完善了.但是我觉得在注释方面,这位博主写的还不够完善,因此在学习以后, ...

  3. 点云配准NDT (P2D)算法详解

    点云配准NDT (P2D)算法详解 最近了解了一些关于点云配准算法NDT的相关文章,进行总结一下. NDT算法的关键是其利用正态分布对参考点云进行了重新表示,使用点云在一个模型特定位置的似然值而不是直 ...

  4. 从命令行到IDE,版本管理工具Git详解(远程仓库创建+命令行讲解+IDEA集成使用)

    首先,Git已经并不只是GitHub,而是所有基于Git的平台,只要在你的电脑上面下载了Git,你就可以通过Git去管理"基于Git的平台"上的代码,常用的平台有GitHub.Gi ...

  5. JVM年轻代,老年代,永久代详解​​​​​​​

    秉承不重复造轮子的原则,查看印象笔记分享连接↓↓↓↓ 传送门:JVM年轻代,老年代,永久代详解 速读摘要 最近被问到了这个问题,解释的不是很清晰,有一些概念略微模糊,在此进行整理和记录,分享给大家.在 ...

  6. docker常用命令详解

    docker常用命令详解 本文只记录docker命令在大部分情境下的使用,如果想了解每一个选项的细节,请参考官方文档,这里只作为自己以后的备忘记录下来. 根据自己的理解,总的来说分为以下几种: Doc ...

  7. 通俗易懂word2vec详解词嵌入-深度学习

    https://blog.csdn.net/just_so_so_fnc/article/details/103304995 skip-gram 原理没看完 https://blog.csdn.net ...

  8. 深度学习优化函数详解(5)-- Nesterov accelerated gradient (NAG) 优化算法

    深度学习优化函数详解系列目录 深度学习优化函数详解(0)– 线性回归问题 深度学习优化函数详解(1)– Gradient Descent 梯度下降法 深度学习优化函数详解(2)– SGD 随机梯度下降 ...

  9. CUDA之nvidia-smi命令详解---gpu

    nvidia-smi是用来查看GPU使用情况的.我常用这个命令判断哪几块GPU空闲,但是最近的GPU使用状态让我很困惑,于是把nvidia-smi命令显示的GPU使用表中各个内容的具体含义解释一下. ...

最新文章

  1. Pycharm出现out of memory 的终极解决方法
  2. C++ Map Source
  3. python动态图片转字符画_使用python实现一个将图片转换成字符画的功能
  4. python基于rsa的数字签名实现_青岛宽客聚会期权定价公式基于python的实现
  5. python 字符串 编码 解码_Python 字符串编解码研究
  6. CentOS7 编译安装golang和rpm安装golang
  7. 热烈庆祝《Python可以这样学》在台湾发行繁体版
  8. Delphi2010中向TRxRichEdit控件中插入OLE对象。
  9. 京东2019校园招聘测试开发工程师面试经历
  10. 方差 标准差_总体、样本、总体方差、样本方差、抽样方差和标准误
  11. 关闭Tomcat报错The web application [ROOT] appears to have started a thread named [Abandoned connectio
  12. 中央广播电视大学中等专业办公设备使用与维护
  13. HTML5文字转语音源码,微软TTS语音源码(将文本转为语音并播放)
  14. PowerMILL宏自动化编程教程
  15. 基于RNN的短期股票预测
  16. VS.NET 2003简体中文版下载
  17. html沙盘图插件,3D Map Generator(3D沙盘设计PS插件)V1.0 正式版
  18. python接单业余赚钱的门路_用Python赚钱的5个方法,教你业余时间月赚几千外快...
  19. 前端学习笔记——JavaScript进阶
  20. Android11文件管理权限申请

热门文章

  1. YLMF OS安装vmare tool
  2. hadoop 2.7.7 百度网盘下载链接
  3. 在SpringBoot项目中使用Ureport2报表工具
  4. Whale帷幄 - 门店销售数据分析都有哪些
  5. Linux工具推荐:方便地查看进程网速
  6. 亿图图示:批量转化Visio的操作方法
  7. 离线安装—Tensorflow教程
  8. DIY 一个树莓派无人机
  9. pyecharts与mysql_pyecharts画图总结
  10. Windows 下编译使用 TCMalloc