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

2015-07-18 14:47刘啸宇韩格欣王瑞代丽男
物联网技术 2015年5期
关键词:手势识别特征提取

刘啸宇++韩格欣++王瑞++代丽男++薄纯娟

摘 要:手势识别系统有着广阔的应用前景,一套稳定、高效的手势识别算法可以为其后的机器学习提供良好基础。简要分析了计算机图像处理结合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,可以实时跟踪 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;

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)

{

……

}

}

然后,使用YCrCb色彩空间的肤色分割算法在使用者在线模式下,将位于环境矩形内的使用者手部图像提取20组,利用20组内的中心点颜色均值与环境矩形内所有点的关系计算出使用者手部图像的颜色阈值。然后利用二分法依次改变阈值,寻找出环境矩形区域内噪点最少的手部图像值,最后利用这个值进行手势姿态图像二值化处理。将得到的二值化图像进行特征化处理,得到手部特征点。通过对特征点的运算,得到最终手势姿态理解结果。

4 手势视频流的二值化处理

使用Kinect进行手势视频流的二值化处理核心代码如下。获取最近人体部位识别区域(在线检测为手部):

#region Map the CameraJointPoints to DepthJointPoints and find the min-depth joint

IReadOnlyDictionary CameraJointPoints = body.Joints;

// convert the joint points to depth (display) space

Dictionary DepthJointPoints = new Dictionary();

// This is our AIM point

JointType MinDepthJointType = JointType.Head;

foreach (JointType jointType in CameraJointPoints.Keys)

{

// sometimes the depth(Z) of an inferred joint may show as negative

// clamp down to 0.1f to prevent coordinatemapper from returning (-Infinity, -Infinity)

CameraSpacePoint position = CameraJointPoints[jointType].Position;

if (position.Z < 0)

{

position.Z = 0.1f;

}

if (position.Z < CameraJointPoints[MinDepthJointType].Position.Z)

{

MinDepthJointType = jointType;

}

DepthJointPoints[jointType] = this.kinectSensor.CoordinateMapper.MapCameraPointToDepthSpace(position);

}

#endregion

在此特征区域内,围绕中心点绘制出环境矩形,然后调用OPENCV库进行手势姿态运算:

frame = cvQueryFrame( capture );//读取一帧图像

if( !frame ) break;

assert( 0 ==

binary_image_process( frame , mask , high_threshold1 , high_threshold2 , high_threshold3 , &is_get_binary )

);

cvShowImage( “Binary_cam” , mask );

其中,threshold1、threshold2、threshold3均为阈值在YCrCb空间的颜色分量。

结合环境矩形处理后提取的手势识别二值化图形如图3、图4所示。

图3 手势识别二值化图形 图4 手势识别二值化图形

可见,此方法提取的二值化图像清晰准确、轻量速度快、稳定性高。

5 手势姿态特征的识别与理解

首先,我们通过对最小包络圆和手腕的计算得出手掌心位置,然后利用每个点与相邻点做向量外积,计算是否为手指尖点和手缝点,最后可得出手势姿态的全部特征点。

//计算整个手的中心点

for( int i=0 ; i < real_contours_number ; i++ ){

contour_rectangle = cvMinAreaRect2( sort_contours[i] , 0 );

arm_center[i].x = cvRound( contour_rectangle.center.x );

arm_center[i].y = cvRound( contour_rectangle.center.y );

cvCircle( frame , arm_center[i] , 10 , CV_RGB(255,255,255) , -1 , 8 , 0 );

}

//取得轮廓中的凸包,画出手指缝

for( int i=0 ; i < real_contours_number ; i++ ){

get_convex_hull( i );

finger_tip( i );

hand( i );

cvClearSeq( hull );

cvClearSeq( defect );

}

最终,得到的含有全部手势特征点的图像如图5 、 图6所示。

图5 手势特征点

图6 同一算法多人多手识别

6 结 语

Kinect的出现为开发者们提供了强有力的工具,不仅仅是从硬件上,更是从平台层面增加了很多高级别图像处理能力,开发者们可以利于微软官方SDK开发出大量基于图像的应用。结合Kinect自身具备的声音识别技术、利用现行的OpenCV开源视觉库,开发者们不仅能够为PC机开发应用,更可以为嵌入式视频系统、机器人等领域的专业需求提供一系列解决方案。

参考文献

[1] Reuben Fleming.Motion Capture Tutorials[OL].[2012-07-01]. http://www.reubenfleming.co.uk

[2] Microsoft. Introduce to kinect[DB/OL]. https://www.microsoft.com/en-us/kinectforwindows/

[3]赵健, 张冬泉. 基于OpenCV的数字手势识别算法[J]. 计算机应用, 2013, 33(S2):193-196.

[4]郭兴伟,葛元,王林泉.基于形状特征的字母手势的分类及识别算法[J].计算机工程,2004,30(18):130-132.

[5] LEE H-K,KIM J H.An HMM-based threshold model approach for gesture recognition[J].IEEE Transactions on Pattern Analysis and Machine Intelligence, 1999,21( 10) : 961-973.

[6] SURAL S,QIAN G,PRAMANIK S.Segmentation and histogram generation using the HSV color space for image retrieval[C] of the 2002 International Conference on Image Processing.Piscataway: IEEE,2002: 589-592.

猜你喜欢
手势识别特征提取
基于Gazebo仿真环境的ORB特征提取与比对的研究
基于Daubechies(dbN)的飞行器音频特征提取
一种基于LBP 特征提取和稀疏表示的肝病识别算法
基于手势识别的工业机器人操作控制方法
基于DSP的直线特征提取算法
基于MED和循环域解调的多故障特征提取
Walsh变换在滚动轴承早期故障特征提取中的应用