APP下载

基于Kinect和改进DTW算法的动态手势识别*

2021-11-24魏秋月刘雨帆

传感器与微系统 2021年11期
关键词:手势识别率编码

魏秋月, 刘雨帆

(西安邮电大学 自动化学院,陕西 西安 710121)

0 引 言

手势识别是一种人机交互技术, 通过手部的动作直接控制计算机的输入, 和传统的输入设备相比具有自然、直观、便于学习等优势,一直是国内外研究的前沿和热点[1]。如今,手势识别应用热点领域主要集中在机器人控制[2,3]、虚拟鼠标、体感游戏[4]和PC控制。

传统的基于单目视觉的手势识别需要从彩色图像中分割出手部区域,容易被光照变化和复杂背景所影响[5]。深度图像可以大幅度降低光照变化以及复杂背景的影响。近年来,微软公司发布的Kinect体感设备使得深度图像信息的获取更加高效、便捷,基于Kinect传感器的手势识别成为时下研究热点[6,7]。

动态手势识别方法中常用的有动态时间规整(dynamic time warping,DTW)算法和隐马尔科夫模型(hidden Markov model,HMM)等方法[8,9]。HMM算法需要大量的手势数据来进行模板训练,在多次训练计算后获得合适的模型参数,DTW算法不需要额外的训练,同时算法简单、快速且易于实现。

本文利用Kinect传感器获取关节点坐标,采用了一种确定手势起始和停止的方法,并构造矢量特征用于描述手势的运动轨迹,使用一种改进的DTW算法进行模板匹配,实时地识别动态手势,提高了手势识别的正确率。

1 手势特征提取

1.1 Kinect数据获取

Kinect传感器会根据不同的人体部位识别出人体的20个骨骼节点,如图1所示。

图1 Kinect实时跟踪的20个骨骼节点

为避免复杂环境对手势识别的影响,参照文献[10]从Kinect传感器获取的20个骨骼节点中选取手部节点作为特征参考点,手部节点坐标结合矢量特征数据为文的主要研究内容之一。

1.2 矢量特征构造

由Kinect获得一个点序列,在采集到的点序列中,前后两帧依次求向量,得到向量序列。由文献[11]可知,向量序列能够很好地保存时序信息和空间信息,克服人与传感器的相对位置不同带来的影响。对方向向量做编码矢量化处理,可以使方向向量序列的表示更加简化,一定程度上减少模板匹配时的计算量。编码的步骤如下:

1)相邻两帧图像中手节点的坐标记作Q1(x1,y1),Q2(x2,y2)。

2)计算两节点连线的方向角,如式(1)所示

3)对方向角角φ进行编码,结果用v表示。编码规则如式(2)所示,其中mod为取余数运算

4)编码矢量化。对于任意一个向量vx,其编码可以由式(3)确定

fx=argmaxn{vx·en};n=0,1,…,15

(3)

式中 “•”为向量的内积运算。

1.3 矢量编码的距离意义

模板匹配是将预识别的手势和保存好的手势模板进行相似度的对比,把之间相似度较高的模板识别作为识别结果。本文定义两个编码f1和f2之间的距离为

d(f1,f2)=min{|f1-f2|,16-|f1-f2|};

f1,f2∈{0,1,…,15}

(4)

2 基于DTW算法的动态手势识别

2.1 经典DTW算法原理

DTW算法是一种将时间规划与间距测量相结合的非线性规整技术,采用动态规划(dynamic programming,DP)的算法思想。

考虑帧数分别为n和m的测试手势B={b1b2…bn}和参考手势A={a1a2…am},其中,m和n不一定相等。当m=n时,直接计算两个序列的距离即可;当m≠n时,不是通过简单的局部或全局缩放后计算距离,而是采用动态规划的办法,寻找一条最优路径对A,B两个模板序列进行匹配。构造一个m×n的矩阵用来存储B和A各帧之间的距离,即矩阵中为(i,j)的元素表示的是A的第i帧与B的第j帧之间的距离,以dij来表示。求解这两个手势样本的相似度问题就转变成在该矩阵中寻找一条使得A和B之间距离最小的规整路径,该路径起始于(1,1)终止于(m,n),如图2所示。

图2 DTW算法示意

累加距离Dij即为当前格的距离dij与可以达到该点的最小的邻近元素的累加距离之和,其计算公式如式(5)

Dij=dij+min{D(i,j-1),D(i-1,j-1),D(i-1,j)}

(5)

2.2 改进的DTW算法

2.2.1 增加全局限制条件

DTW算法采用的是逐点匹配的方式来计算累加距离,并利用动态规划的方法来寻找最优路径。文献[12]中是通过斜率限制(斜率选0.5~2)的方法将搜索区域限定在一个平行四边形区域,如图3所示,但在使用DTW算法匹配计算时,搜索的格点每往前推进一格,就要进行上下边界的计算,计算量仍然较大,尤其是当两个匹配的序列较长的时候,这种重复性的操作就越多。

图3 全局路径限制

文献[12]中将图3中的计算弯折区域分为3段:(1,Xa),(Xa+1,Xb),(Xb+1,N),由于直线A,B的斜率为2和0.5,得到式(6),计算得横坐标Xa,Xb如式(7)

Xa,Xb都为整数,得到对M和N的限制条件式(8)

当不满足限制条件时,认为两模板差别太大,无法进行匹配。文献[12]中提出采用这种方法,在X轴上的每一帧数据不需要与Y轴上的每一帧数据进行比较,而只用与Y轴上[ymin,ymax]之间的帧进行比较

上述分析一直考虑的是Xa

基于此算法,改进经典DTW算法:根据Xa和Xb坐标,在进行算法之前的离线状态下,创建一张用于查找的数据表并将其保存到系统里,它可以大幅度较小匹配时间因为它的作用主要是存储搜索范围的边界值大小。这样就可以将后面用到的搜索范围的上下边界的坐标值提前保存到二维数组里。不用再进行之前耗费时间的重复性计算,只需要以查找数据表的方式即可以完成匹配的过程,在一定程度上提升了DTW的计算效率。而且由于这张表是在离线状态下创建并保存的,使用时需要耗费的时间非常短,也就是一个周期指令的时间。通过这样的改进,大大提高了DTW算法路径匹配速度。

2.2.2 设定有效匹配阈值

在使用DTW算法进行序列相似度匹配时,并计算两个序列匹配时的累加距离,其距离中的最小值就是有效匹配阈值。当符合输入要求的手势序列与模板匹配,并且计算的匹配累加距离为有效匹配阈值时,就认为该手势序列与参考模板中的序列匹配上了,即能正确识别出该动态手势,可以让匹配计算提前结束,提高了识别效率。

3 算法验证

3.1 可行性验证

为了验证算法的可行性,搭建了基于Kinect和机器人操作系统(robot operating system,ROS)的机器人控制仿系统。机器人控制仿真系统运行在Linux Ubuntu16.04操作系统平台上,所用ROS版本ROS Kinetic Kame(目前推荐稳定使用版本),所用设备的处理器为Inter®Pentium®CPU G3250 3.20 GHz,安装内存为4GB,程序开发语言为 C++。

首先,自定义了七种动态手势,将其与机器人动作一一对应。然后创建一个名为Dynamic-Hand-Gesture的功能包,编写控制机器人动作的程序存入Dynamic-Hand-Gesture/src/ctrl_speed.cpp文件。控制机器人运动的消息为/ctrl_speed话题下,在动态手势识别后,对每一个静态手势编码并通过通信发布到机器人运动的话题中。机器人根据接收到的手势指令与编写好的程序匹配,然后做出程序中设定的效果。

图4中(a)和(b)为机器人对向左手势做出左转动作和对向右手势做出右转动作。用户面对 Kinect操作分别做出向左和向右手势,使用已实现的动态手势识别模块进行动态手势识别,识别完成后通过分布式通信模块发布到机器人运动的话题,机器人分别做出向用户左手和右手操作,即为左转和右转效果。为体现实验效果,本次实验首先进行向上动态手势,机器人由初始位置面向用户行驶,到开阔区域分别进行左转和右转实验,达到了预期的要求。

图4 机器人对向左和向右手势做出反应

由表1所示,在机器人控制系统交互测试中,共运行了5次场景来对手势和识别动作进行测试和评估,测试结果显示,在动态手势操作过程中,个别手势偶尔一两次不能识别之外,其他手势均能有效识别,且具有较高的识别率,在识别速率方面,在碰到障碍物时手势向上反应变缓,机器人不能迅速识别,其他手势均能实时响应。

表1 动态手势测试结果

3.2 识别率验证

为验证系统的性能,定义了14种常用于人机交互领域且具有较强方向性变化的手势,分别为向上、向下、向左、向右4个日常使用次数频繁的手势和0~9这10个常用阿拉伯数字的手写手势,每个手势有一个标准模板,每个动态手势进行150次识别测试,“向上”手势识别结果如图5所示,所有手势测试结果如表2所示。

图5 采集图像和识别结果

表2 手势识别率表

表2的实验结果表明:采用本文改进的DTW算法对动态手势进行识别,能获得较经典DTW算法更高的识别率,改进后的DTW算法整体平均识别率达到98.7 %。实验中,发现数字“0”和数字“9”容易识别错误,这是因为手写的相似度较高,易出现识别错误的情况。针对这种情况,增加对手势起始点和终止点的距离判断能有效区分数字0和数字9的手势。

3.3 鲁棒性验证

本文选取两种实验条件,一种是光线充足且背景相对简单,另一种是光线较暗背景相对复杂,在两种截然不同的条件下进行鲁棒性实验,同时以四个手势分别是向上、向下、向左和向右四种手势为例,在两种环境下每种手势各进行100次实验,手势识别结果如图6所示。

图6 两种环境下四种手势的识别结果

从图6中(a)和(b)对比结果可以发现,本文算法在光线较暗、背景相对复杂的环境下依然可以对定义的手势进行准确地识别。

4 结 论

本文提出一种利用Kinect传感器结合改进的DTW算法进行动态手势识别的方法。采用了单手舒张和单手收缩表示手势起始和停止的方法,利用手部节点结合矢量特征数据,使用一种改进的DTW方法进行动态手势识别。实验结果表明:本文采用的方法不仅对自定义的手势具有较高的识别率,平均识别率达到98.7 %,而且在复杂背景及光照强度变化的环境下也具有良好的识别效果。

猜你喜欢

手势识别率编码
基于SAR-SIFT和快速稀疏编码的合成孔径雷达图像配准
《全元诗》未编码疑难字考辨十五则
基于类图像处理与向量化的大数据脚本攻击智能检测
子带编码在图像压缩编码中的应用
挑战!神秘手势
基于真耳分析的助听器配戴者言语可懂度指数与言语识别率的关系
V字手势的由来
Genome and healthcare
提升高速公路MTC二次抓拍车牌识别率方案研究
胜利的手势