一种基于Kinect的手势识别系统 下载本文

内容发布更新时间 : 2024/11/15 15:19:46星期一 下面是文章的全部内容请认真阅读。

龙源期刊网 http://www.qikan.com.cn

一种基于Kinect的手势识别系统

作者:刘啸宇 韩格欣 王瑞 代丽男 薄纯娟 来源:《物联网技术》2015年第05期

摘 要:手势识别系统有着广阔的应用前景,一套稳定、高效的手势识别算法可以为其后的机器学习提供良好基础。简要分析了计算机图像处理结合Kinect在手势识别领域的应用,并提出了一种结合Kinect深度信息的可行的手势识别方法,最后通过实验验证了该算法的稳定性和效率。

关键词:Kinect;手势识别;特征提取;计算机图像处理

中图分类号:TP368 文献标识码:A 文章编号:2095-1302(2015)05-00-03 0 引 言

人机交互方式多年来都停留在以键盘和鼠标为中心的传统方式上,然而,随着科技进步,特别是传感器技术和芯片制造技术的进步,工程师们正在不停的探索新的人机交互体验。已知的人机交互体验包括声音交互、脑电波交互、人体肢体姿态交互、手势交互等。这其中,基于计算机图像处理技术的手势识别已经拥有了广阔的应用。

手势识别技术可以利用在医疗领用,用于孤独症儿童的治疗;可以应用在沟通领域,用于聋哑患者的手语交流;也可以应用在游戏领域,创造新的游戏人机交互体验。但是,现行的手势识别系统之所以不够普及,很大一部分在于识别算法的稳定性和快速性得不到保证。这是因为使用计算机图像处理手段的手势识别系统受到计算机图像处理能力的极大制约。图像处理,特别是实时图像处理,在实际操作中会受到光照、遮蔽、阴影等因素的制约,每一种因素的变化都会对最终的识别结果造成影响。因此,如何得到稳定且置信度高的手势识别结果就成了各国计算机图像处理工程师的重要攻克方向。

幸运的是,在2009年6月1日E3 2009大会上首次公布的Kinect设备为这种要求提供了更进一步的保障。利用Kinect提供的深度信息,结合在计算机图像处理和机器学习领域早已颇有建树的开源计算机图形处理库OPENCV,开发者可以将制约图像处理的环境光因素降到最低,从而开发出稳定可靠的手势识别系统。 1 Kinect简介

Kinect 是微软为Xbox研发的一款体感周边外设产品。Kinect一经提出就因其革命性的超前构想和颠覆性的人体姿态操作方式[1]受到了众多玩家和开发者的追捧。Kinect精确的空间定位性能结合先进的计算机视觉处理算法,可以为人机交互领域提供广阔的发展空间。如图1所示,Kinect通过高分辨率深度信息,能够分辨空间物体细小的变动;支持录制1080p高清视频,在不失去保真度的情况下可支持6人同时操作;Kinect套件自带骨骼追踪SDK,可以实时

龙源期刊网 http://www.qikan.com.cn

跟踪 6 个完整骨骼和每套骨骼的 25 个关节。更重要的是,红外线传感器给Kinect赋予了黑暗中识别动作的能力,这大大降低了对用户操作环境的要求,使人们可以在没有照明的情况下使用Kinect,大大解放了对用户和开发者对场地的要求,从而让机器学习变得更简单[2]。 图1 Kinect图示

2 计算机图像处理中的手势识别

基于计算机图像处理的手势识别系统大体上分为:手势采集、手势分割、手势提取及手势理解四个步骤[3]。手势识别的方法见表1。 表1 手势识别静态识别[4] 动态识别[5] 模板匹配法(TM) 动态时间规整法(DTW) 神经网络法(NN) 隐马尔可夫模型法(HMM)

在大量手势识别系统的实际开发过程中,开发者都面临着一个基本的问题:使用不同算法过滤系统来获取手势的二值化图像。常用的获取方法是基于肤色来过滤手势轮廓。

手势姿态二值化图像的获取关系到后期手势姿态理解的稳定性和准确性,但是人体的手部颜色受到个体差异、光源颜色以及光照角度的影响,其中任何一个因素变化都将造成阴影、遮蔽等不良影响[6]。Kinect的出现弥补了这个缺陷。利用Kinect的深度和红外信息,使得Kinect的开发者可以在不考虑光照的情况下通过深度分辨出位于摄像头前方的手势姿态,而被遮蔽的手势则可以轻易的被系统识别出来过滤掉,防止影响最终结果。 3 Kinect在手势识别中的应用

本文首先使用Kinect官方SDK中的人体骨骼识别功能识别出人体骨骼模型,如图2所示。

图2 SDK人体骨骼识别

在人体手部部位,创建一个包络矩形,这个矩形称为环境矩形。Kinect初始化代码如下: private void BodyReader_FrameArrivedEvent(object sender, BodyFrameArrivedEventArgs e) {

bool t_BodyFrameProcessed = false;

龙源期刊网 http://www.qikan.com.cn

using (BodyFrame bodyFrame = e.FrameReference.AcquireFrame()) {

if (bodyFrame != null) {

if (this.bodies == null) {

this.bodies = new

Body[bodyFrame.BodyCount]; }

/* The first time

GetAndRefreshBodyData is called, Kinect will allocate each Body in the array. As long as those body objects are not disposed and not set to null in the array, those body objects will be re-used. */

bodyFrame.GetAndRefreshBodyData(this.bodies); t_BodyFrameProcessed = true; } }

if (t_BodyFrameProcessed) { …… } }