-----------------------体素数据---------------------体素化网格
体素(Voxel)是体积元素(Volume pixel)的简称,是数据位于三维空间内规则网格上的最小单位,体素,其物理意义类似于二维图像像素在三维空间上的推广,是一组均匀分布、位于正交网格中心的立方体的集合。体素不能表示三维空间中的位置信息,即不具有三维坐标。可以通过体素数据在立体空间内的相对位置关系表示场景或物体的三维信息。
场景的体素数据表示
1.首先将点云数据进行体素化
体素化(Voxelization)是利用体素来近似表示场景或物体的空间结构和几何形状的过程。体素化的基本原理是:在输入的点云数据上创建一个三维立体的网格,立体网格是一种微小的三维立方体的集合。然后,在每个三维立方体内,利用立方体内所有点云数据的重心点来近似表示网格内的所有点,网格处理后得到相应的体素云数据。体素云数据可以表示模型的表面几何特征和内部属性信息,并且利用体素数据的相对位置关系还可以表示三维信息。
点云数据是杂乱、无组织结构的,但是通过体素化处理后,在体素空间内存在三
种拓扑结构:6 邻接、18 邻接以及 26 邻接。其中 6 邻接的两个体素具有 6 个公共面,
18 邻接的体素具有 12 条公共边和 6 个公共面,26 邻接体素在此基础上还具有 8 个
公共点。如图 3.3 所示,从左到右依次为 6 邻接、18 邻接以及 26 邻接。
2.体素化后获得体素云数据
体素化处理首先需要建立体素空间,体素空间类似于二维图像模型的像素空间。体素空间的范围可以根据点云数据坐标分别在 X,Y,Z 轴的最大、最小值来确定,然后设定固定的体素分辨率 R,以体素分辨率为基本单位对体素空间下的最大包围盒进行划分,得到体积为 的微小的立方体集合。每个立方体内的中心点或者质心点可以用来表示相应的体素立方体,所有中心点或者质心点形成的数据集即为体素云数据。
--------------------超体素数据------------------------
超体素(Supervoxel)是一种由体素数据组成的集合,是在三维空间内具有一定语义感知信息的原子体积的三维网格的子集,类似于二维图像上的超像素。超体素是根据位置关系或者其他属性的相似性来生成不规则形状的簇,与体素的本质类似,是三维空间内的由体素构成的不规则的几何体。超体素内携带丰富的属性信息,例如具有空间一致性,并且相对于体素数据更加易于理。一个性质良好的超体素应该具有较为规则的几何形状与均匀的体素密度,并且可以很好的依附于边界信息。
场景的超体素数据表示
超体素的获取过程即体素数据的聚类过程,其基本原理是对局部范围内满足相似性约束的体素数据的融合,根据纹理、颜色、法线等相似属性将体素云数据划分为相应的超体素,用于研究体素簇之间的关系,有利于后续的分类和识别工作。这类似于在图像分割处理中,将像素聚类得到超像素,利用超像素的关系来分割、理解图像。目前,超体素已普遍应用于三维数据处理和视频分析等研究领域,如点云分割,目标识别,运动分析和场景重构等。
--------------------
应用在体素滤波、超体聚类等。
1.体素滤波
在使用PCL的处理点云时,很多时候我们不需要有太过高的分辨率,因为点云过多会造成计算变慢,并且更加消耗计算资源,所以我们需要把点云变稀,voxel就是一个很好的方法。
voxel就是三维的pixel,也就是把点云画出网格,然后每个网格内保留一个点就可以了。网格的大小可以自己定义,这就相当于一个downsample(下采样)
我显示出了所有的点,如果某一个格子内没有点就可以不显示了,你也可以把格子调的很密,颜色也可以保留。
#include <pcl/io/pcd_io.h>
#include <pcl/point_types.h>
#include <pcl/filters/voxel_grid.h>//Pcl自带的voxel功能pcl::VoxelGrid<pcl::PCLPointCloud2> sor;//pcl的一贯规则,你要使用voxel功能,首先需要创建一个voxel类的一个对象,也就是sor sor.setInputCloud (cloud);//然后输入需要过滤的点云,也就是cloudsor.setLeafSize (0.01f, 0.01f, 0.01f);//然后设置一下叶子大小,也就是resolution(分辨率),也就是这个格子的最小间距,设置的越小则越密集,保留的点越多。三个参数分别是xyzsor.filter (*cloud_filtered);//然后给一个输出的点云用来接收过滤的结果,即cloud_filtered就是变稀疏后的cloud
点云数量很有可能点数减少了十倍,但是形状还保留,基本上没什么太大的影响,不过如果你要做精确的体积估计的话这个肯定是不可以的,因为边缘肯定会变短,但是不那么精确,知道大致形状,知道中心就可以的需求就可以放心大胆的使用这个功能
左右是过滤前后的对比,右边的图然能够看出来是一张桌子上面放了个杯子,但是点明显变稀疏了,能够满足你的要求且不会破坏你的结果那么就可以尝试读入点云就用这个过滤一遍,点云少了后续的处理速度会快的很多。
-----------------------
后续可以基于体素做超体聚类,LCCP等算法。