本工作中,场景点云通过深度相机测量得到,不同深度相机的点云容量不同,如Photoneo深度相机一次观测(1帧)可得到300万个点,SCAPE深度相机)一次只有3万个点。值得指出,点云容量与点云质量、识别效果没有必然的正比关系,上述两个厂商都是工业界一流的视觉相机厂商、3D视觉方案商。
本工作所使用的深度相机的点云容量约为20万,对人体模型进行观测发现,1帧内人体模型部分的点云偏向稀疏,于是采用多帧融合的方法,得到了稠密点云。但是,这个稠密点云的点密度分布不均匀,会误导ICP算法,导致人体位姿估计陷入局部最优,得到错误的位置和姿态。
为减少因点密度分布不均造成的计算错误,本工作需要使点云的密度在各个空间坐标上分布均匀。为了达成这个目标,采用点云降采样(Downsampling)方法。点云降采样方法的原理是将三维空间网格化,也被称为体素化。网格化后,每一个格子被称为一个体素(Voxel)。降采样的基本思路是检查每一个体素,若体素内有点存在,则用一个点代替体素内的点集。这个点的坐标可以是体素的中心坐标,也可以是点集坐标的期望。
PCL的降采样方法由类pcl::VoxelGrid<pcl::PCLPointCloud2>
实现。需要注意,pcl::PCLPointCloud2
是PCL用于保存点云的类,这是一个在PCL早期版本中使用的类。在近期版本中已经被pcl::PointCloud<pcl::PointXYZ> Ptr
替代,同样用于保存点云数据,这个类在进行点云的图形显示、空间变换操作等功能时更加方便。
根据上述讨论,为了达到降采样目标,本工作会将点云数据交由pcl::VoxelGrid<pcl::PCLPointCloud2>
处理。一旦降采样完成,为了进行后续操作,本工作会将点云数据转换回pcl::PointCloud<pcl::PointXYZ> Ptr
。操作流程如下,
pcl::PointCloud<pcl::PointXYZ> Ptr
对象进行保存;pcl::VoxelGrid<pcl::PCLPointCloud2>
;pcl::PointCloud<pcl::PointXYZ> Ptr
;其中,点云数据读取的工作已经在上文讨论过。
降采样准备工作中,点云数据的转换用到了PCL的函数toPCLPointCloud2
,其基本用法如下,
PointCloudT::Ptr cloud_in (new P