第3章 系统相关技术和算法的分析与研究
在第二章基于Kinect的动作捕捉系统的方案设计中,主要考虑解决以下三个问题:如何修复丢失的关节数据;如何解决运动数据中肢体末端的抖动问题;如何驱动模型,并保证模型动作与真人动作一致。
为了优化运动数据,解决运动数据中关节丢失和肢体末端抖动的问题,本章首先分析Kinect动作数据的产生原理以及骨骼数据的内部结构原理,并在此基础上针对运动数据中关节丢失问题和肢体末端抖动问题提出优化方案,具体来说,在关节丢失的问题上,先分析了人体单关节修复算法,并在此基础上提出改进,以解决多关节连续丢失的问题;在肢体末端抖动问题上,采取了预测数据与实际数据加权求和的方式进行平滑滤波处理。为解决模型驱动问题,本章在分析了人物模型结构的基础上,使用优化后的运动数据结合正向运动学的重定向算法来实现模型的驱动。
3.1 Kinect骨骼跟踪技术研究
Kinect内置的骨骼跟踪算法通过实时跟踪人体的姿势[28]获取当前的骨骼位置数据,运动数据由若干帧骨骼位置数据组成。本节将阐述Kinect骨骼跟踪技术原理及其骨骼数据结构。
3.1.1 Kinect骨骼跟踪技术原理
Kinect通过深度传感器获取到深度图像信息,并通过边缘检测、噪声阈值处理等技术将人体目标(“T”字形的物体,会被Kinect识别为人体)从环境背景中分离出来,得到一个人体的深度图像[29]。再通过BPC算法(Body Part Classification,身体部位分割算法)进行关节定位,骨骼跟踪效果如图3.1所示。
图3.1 Kinect V2深度图像-骨骼追踪图
BPC算法的原理如图3.2所示,通过深度随机决策森林分类法从人体深度图像信息中分割人体部位,并标记各部位中心的像素点。这些标记点十分接近骨骼关节的实际位置,由此来定位骨骼的关节点[30]。将这些关节点映射到坐标系中,连成人体骨架图。
图3.2 身体分割法定位关节点原理图
3.1.2 Kinect骨骼数据结构
Kinect SDK2.0的骨骼结构有25个关节点,如图3.3所示。
头右拇指右腕右手右肘右肩左颈肩部中心肘左肩脊柱右手尖左拇指左手左左尖腕手右髋右膝髋部中心左 髋左膝右踝右脚
左踝左脚
图3.3 Kinect SDK2.0的骨骼结构
将跟踪到的25个关节点按树型结构分层,“髋部中心”作为初始关节点,相邻的关节点逐层向下延伸,如图3.4所示。
髋部中心脊柱左髋左膝颈右肩右肘右髋右膝肩部中心左肩左肘左踝左脚右踝右脚头左腕左手左拇指左手尖右腕右手右拇指右手尖 图3.4 Kinect V2的骨骼层次
为了描述人体的运动状态,使用了全局坐标系和局部坐标系来描述骨骼关节的位置信息,如图3.5所示。全局坐标系是建立在Kinect上的直角坐标系,它以Kinect为坐标原点,以其扫描方向为Z轴正方向,以其正上方为Y轴正方向,
以其正左方为X轴正方向。局部坐标系分别以每个关节点为原点,以其父关节点到它的直线方向为Y轴正方向,以该关节到其子关节点的直线方向为X轴正方向,以全局坐标系Z轴的反方向为Z轴正方向的迪卡尔坐标系。其中根关节点(髋部中心)的局部坐标系的Y轴正方向与全局坐标系相同,Z轴和X轴正方向与全局坐标系相反。局部坐标系用来描述树型结构中父关节点和子关节的旋转位置关系,这种位置信息在Kinect SDK2.0中以四元数的形式存在[31]。全局坐标系用来描述每个关节点的全局位置坐标。
图3.5 Kinect骨骼局部坐标系与全局坐标系
从Kinect提取的数据中,包括人体骨架每个关节点的三维坐标和四元数。三维坐标即全局坐标系下的坐标;四元数的定义是(x,y,z,w),表示子节点与父节点的旋转关系,即局部坐标系间的转换关系,这种关系存储在子关节点的四元数中,其中根关节点的四元数表示全局坐标系与根关节点局部坐标系的旋转关系,四元数常用在三维空间运动分析领域中。
在不能确定人体骨骼和模型骨骼长度是否一致的情况下,单以骨架各关节的全局位置坐标来确定模型姿势会造成模型失真。在驱动模型过程中,先以根关节点的三维位置来确定模型的初始位移,再使用四元数来确定模型骨架中各关节的相对位置来重塑模型的姿势。
Kinect中定义的四元数是单位四元数,即模为1,单位四元数与旋转矩阵的转换关系如下[32]: