人机交互过程中数字手势的识别方法

2020-04-29 06:16贾丙佳李平
关键词:手部手掌手势

贾丙佳, 李平

(华侨大学 信息科学与工程学院, 福建 厦门 361021)

在众多人机交互技术中,手势不失为直接、高效的交互模式,手势输入超越了传统的鼠标和键盘,是与计算机进行交互的新类别.随着计算机相关技术的发展,体感技术的使用突破了平面的约束,可以让用户在不需要任何其他辅助设备的情况下,运用肢体动作对机器发出指令,从而实现用最自然的方式与机器对话[1-3].2010年,微软推出Kinect图像采集设备,能够准确获取复杂环境中人物和背景的深度图像信息,并利用深度信息进行手势识别,为用户提供便捷、无接触式的人机交互方式;同时,还可以利用Kinect进行动作的捕捉,如医疗康复[4]、体感游戏[5]等.

在早期的手势识别中,大多需要借助一些辅助外设,用户需要穿戴颜色手套或特制数据手套等[6-11],确定手部关节,实现手势提取,但这类方法局限于特定的辅助设备,使用不便,并不能给用户带来良好的交互体验.近年来,许多研究者结合Kinect进行算法设计,获得了一定的研究成果.如樊景超等[12]采用改进重心距离法识别指尖,该方法的局限性在于指尖位置不能低于掌心位置,做手势时手掌不能有太大的旋转角度.葛艳茹等[13]采用 Hu 矩阵检测直线交点个数的方式,判断手指个数,但忽略了在指蹼部位与直线的交点问题,可能会造成误检测.方华等[14]利用模板匹配的方法进行4种手势的识别,但这种方法需要事先提供手势模板,对于没有模板的手势无法识别.王松林等[15]利用k曲率算法检测手指指尖,但其所取k值对于不同大小的手掌并不具有普适性.文献[16-17]对手势区域提取相应的特征,运用分类算法进行识别.Keskin等[18]使用深度传感器采集手势三维模型,并对相同手势分不同的部分运用支持向量机(SVM)进行手势识别.文献[19-20]通过提取手部特征向量,运用SVM对预定的手势进行识别.Domini等[21]结合距离和曲率特征,运用多级SVM识别手势.曹皱清等[22]从深度图像中分割出手势区域,并用决策树识别手势,但需要预先采集数据、进行训练,获得的模型和特征复杂,运算量大,并不适合实际操作.

本文为了提高手势识别效率、降低算法复杂度,同时给使用者带来舒适的体验,提出一种基于Kinect融合深度信息和骨骼信息的数字手势识别方法.

1 手部检测与分割

1.1 Kinect获取数据的方式

Kinect是一款能够采集环境深度信息的体感外设3D摄像机.包括彩色摄像机、深度传感器、步进电机、麦克风阵列和发光二极管(LED).Kinect组件,如图1所示.

图1 Kinect组件Fig.1 Kinect components

图1中:彩色摄像机如同普通RGB摄像头一样,从环境中捕获彩色视频数据,在其内部以流的方式进行传输;深度传感器包括红外发射器和红外摄像机,红外发射器在工作时,不断以“伪随机点”模式向镜头外发射红外光,而红外摄像机则捕捉物体反射的红外光,通过内建算法,就可得出Kinect可视范围内的深度数据;在红外发射器和彩色摄像机之间的发光二极管(LED),用于指示Kinect设备的工作状态;盒子底部是由4个相同的麦克风以直线排列组成的麦克风阵列,这样设置不仅可以捕获声音,还可以定位声源的位置;底座和主体部分的连接处安装了一个步进电机,通过控制步进电机调整俯仰角,使Kinect获取可视范围内尽可能多的有效数据.

1.2 人体轮廓的提取与手部区域的分割

利用Kinect 进行深度图像数据采集,通过一系列深度图像帧返回16位灰度格式的深度数据流,运用内建算法可以计算深度图像中每一个像素到摄像头的距离,并以mm为单位返回.当启动骨骼数据流时,在返回的16位数据中,0~7用于表示人体编号的后三位二进制数据有效.如果这3位的数据为0时,代表该像素属于环境,不属于人体;如果这3位的数据为非0时,表明Kinect视野中有人体像素.剩下的13位用于表示该点与传感器的相对距离.Kinect捕获的普通图像和深度图像对比图,如图2所示.图2(b)中:根据灰白程度,对距离摄像头远近的物体进行标示.

针对深度图像中的每一个像素取出人体编号;然后,根据这个编号就可以实现人体像素和非人体像素的分离,能够排除非人体像素对实验造成的干扰.从复杂背景中分离出的人体深度图像,如图3所示.

(a) 普通图像 (b) 深度图像 (a) 环境深度图 (b)人体深度图图2 Kinect捕获图像的对比图 图3 Kinect捕获图像的分离图Fig.2 Comparison of Kinect captured images Fig.3 Separation of Kinect captured images

根据人们日常做手势时,手掌平面近似与水平面保持垂直且位于整个身体最前端的习惯,Kinect采集到手部区域的深度值大都处于同一深度范围内,利用深度阈值法粗略提取手部区域的深度数据.按照所采集到人体数据的最小深度值(Dmin)加深度阈值(T)的方法,就可分割出手部区域.根据实际测试,取80 mm

上式中:H(B,G,R)为提取的手部区域像素值;S(B,G,R)为人体像素值,其他区域为0;d为摄像头到人体轮廓每个像素的距离.根据深度阈值法,对分割出的手部区域进行二维空间的投影,重建二维图像.提取的手部区域分割图,如图4所示.

图4 手部区域分割图Fig.4 Hand region segmentation map

图4是重建的二维RGB图像,在进行手指数字识别时,可以对R,G和B任一通道中的数据进行处理.对于这3个通道的数据取值并没有特殊要求,文中取R,G和B三个通道的数值分别为115,169和9.掌心圆的边界同样是提取B通道的数据进行手指数字识别.在采集手部数据时,采用了人体轮廓距摄像头最近距离Dmin+T的方式,达到不限定人体必须位于摄像头前的某一固定位置的目的.

1.3 手掌分割

根据Kinect骨骼追踪系统,实时读取出手腕和手掌处的骨骼信息,并将其映射到手部区域的二维图像中,计算过这两点的直线l1的斜率.根据该斜率的负倒数和手腕点坐标,运用直线点斜式方程创建另一条垂直于l1的直线l2.具体有以下2个步骤.

利用创建的直线方程l2,将手掌二维坐标点带入,判断该点相对于直线的位置,即

当f1取值为0时,表明该点在直线上;当f1取值为大于或小于0时,表明该点不在直线上.在判断出手掌点p1的取值情况f1后,对整个手部区域的像素坐标进行遍历,保留和p1点的f1取值相同的像素点,即

上式中:H(i,j)为原始手部区域图像的像素坐标;dst(i,j)为分割后的手掌区域图像的像素坐标.

(a) 手部分割图 (b) 分割结果 图5 手掌分割图Fig.5 Palm segmentation map

手掌区域被准确分割.手掌分割图,如图5所示.图5(a)中:部分手臂像素对后续的处理造成一定的干扰,需将其分割掉;两个蓝色圆点为Kinect骨骼追踪系统追踪到的手掌和手腕骨骼点;区域分割线l2为这两点建立的倾斜直线.图5(b)为图5(a)的分割结果.由图5(b)可知:手掌区域被单独分割出来,去除了手臂上的干扰像素,进行了边缘平滑处理.

2 特征的提取与手指个数的识别

对分割出来的图像进行形态学开运算,在保持手掌区域面积大体不变的情况下,分割掉手指处的纤细部分,这时计算分割后图像的最小包围圆;然后,对最小包围圆的半径适当延长5到10个像素单位,得到的同心圆作为掌心圆;最后,统计掌心圆边界和图5(b)所示的手掌区域分割图中手指的相交次数,将其作为一种特征识别手指个数.

2.1 掌心圆的计算

Kinect骨骼追踪系统可以直接定位手掌心坐标,但由于骨骼追踪系统测量存在误差,如果直接使用该结果,会严重影响最终识别精度.文中通过处理手掌区域图像,获得掌心位置的准确坐标,具体分为以下两个步骤.

步骤1利用图像处理中的形态学开运算,对手指区域的像素进行分割处理.

步骤2对保留的图像区域计算最小包围圆,手掌区域最小包围圆,如图6所示.

形态学开运算的实质是对图像进行先腐蚀后膨胀,这样可以消除图像上一些小的噪点,还能在纤细点处分离物体,且不会明显改变图像的有效面积.文中正是利用这一特性,将手指部位全部去除,保留不含手指的手掌区域像素.接着对该区域像素坐标进行遍历,找出手掌区域距离图像4个边界最近的4个像素坐标值.边界点像素坐标,如图7所示.图7中:A,B,C和D四点是满足条件的手掌区域距离图像边界最近的4个像素点.

(a) 手指分割图 (b) 最小包围圆 图6 手掌区域最小包围圆 图7 边界点像素坐标 Fig.6 Minimum surrounding circle in palm area Fig.7 Pixel coordinates of boundary points

在获得4个边界像素坐标值后,寻找相邻且相互之间距离最远的3个点.AB,BC,CD和DA之间的距离为

过A,B和C这3个点的圆的方程为

(x-x0)2-(y-y0)2=r2.

将A,B和C三个点依次带入上式,得到的方程组为

联立以上方程组,求得圆心为

将x0和y0代入方程组中的任何一个式子,便可以求出半径r,画出最小包围圆.由于手掌区域图像是RGB图,包含3个通道,所以圆的边界也用3个通道画出,并选用像素值为S(9,0,255),这里B通道的取值为第一个值9,其与图5(b)图的B通道取值保持一致,同时,圆边界的宽度仅用一个像素值表示,从而为后续处理做铺垫.

2.2 手指数字的识别

最小包围圆包围了不含手指的全部像素(图6(b)),此时,仅需要对该最小包围圆的半径进行适当的延长,以避免和手掌部分像素相交,并映射到图5(b)中,就可获得仅和手指相交的圆.经过多次试验,取r′=r+6,然后,以该半径r′和掌心点(x0,y0)画出另一个圆.手掌区域映射图,如图8所示.

扩大半径的圆映射到手掌区域分割图,如图8(b)所示.图8(b)中:圆的边界仅和手指部分相交.通过计算出相交次数,便可以识别出手指个数,有以下4个步骤.

步骤1遍历图8(b)所示的图像.圆的边界像素坐标值为

上式中:C1=(i,j)表示将符合条件的像素坐标赋值给集合C1;disi,j(B,G,R)为B,G和R三个通道的像素值;disi,j(9,0,255)为节2.1画掌心圆时的像素取值.

步骤2坐标排序.由于步骤1获取的圆边界坐标值是按照从左到右、从上到下排列的,并不符合圆按照顺时针或者逆时针画的规律,这时需要对这些坐标点进行排序.

步骤3运用“十字形”搜索窗口,沿着排序后的圆边界坐标进行遍历.“十字形”搜索窗口,如图9所示.图9中:中心点坐标(i,j)为像素坐标的位置.中心点坐标沿着圆的边界进行遍历,每遍历一个坐标值,依次取出周围相邻4个坐标的像素值进行判断.如果4个像素值都和手势分割图B通道的数值相等,则记录下这个特征,并将这个特征存储到另一个集合C2中,以便后续处理.

(a) 最小包围圆 (b) 掌心圆 图8 手掌区域映射图 图9 “十字形”搜索框 Fig.8 Palm area map Fig.9 Cross search box

步骤4统计特征,识别出手指个数.对步骤3得到的集合C2进行从0~1或者从1~0变化次数的统计.如统计的次数为5,说明圆的边界和手指相交了5次,进一步说明使用者伸出了5个手指,传达的意思是数字5.集合C2为

至此,一帧手掌二维图像数据处理完毕.重复以上步骤,可以实现对0~5任意输入的手指数字图像数据的处理,手指数字识别流程图,如图10所示.

采用掌心圆和手指相交的方式,只在于识别出手指个数,并不涉及语义识别.对于任意组合的手指,均以手指个数作为数字识别结果,如若识别更多的数字,需用伸出更多根手指进行组合,只要获得的掌心圆能够和手指相交,就能准确识别出结果.另外,相对于传统的各种触摸接触式人机交互方式,文中采用的是基于Kinect的非接触式交互方式,使用者无需用身体的任何部位触碰实际物体,仅仅依据动作手势进行交互,更接近于人与人之间的交互模式,给使用者带来自然、舒适的体验.

图10 手指数字识别流程图Fig.10 Flow chart of finger digital recognition

3 实验结果与分析

为了对提出的方法进行验证,使用的计算机配置为Inert(R) Core(TM) i3-3220 CPU、4.00 GB安装内存、3.30 GHz主频和Windows 7操作系统,实验数据来自Kinect for XBOX摄像头.利用微软Microsoft Visual Studio 2013作为开发平台,并结合微软官方Kinect for Windows SDK开发工具包.图像的分辨率设置为640 px×480 px,视频帧率为30 帧·s-1,进行手指数字识别实验.文中要识别的6种数字手势图,如图11所示.

(a) 数字0 (b) 数字1 (c) 数字2

(d) 数字3 (e) 数字4 (f) 数字5图11 数字手势图Fig.11 Digital gesture map

表1 手势识别结果Tab.1 Gesture recognition result

为了验证该方法的实时性和准确性,在室内的正常光照条件下,邀请了6位实验者,对每个手势采集600帧图像,手指数字识别结果,如表1所示.表1中:η为识别率.

数字手势识别界面,如图12所示.图12中:设计的界面实时显示了手势的识别结果;红色圆圈即是掌心圆;右侧是手指数字的识别结果和准确率;右下角是开始和停止识别按钮.由图12可知:文中方法对于0~5等6种数字手势的识别率均达到100%,进一步说明了文中方法实时、准确.

对不同方法识别同种数字手势0~5的结果进行列举比较,不同方法的识别率,如表2所示.表2中:文献[18-19]均采用SVM对提取的手势特征进行训练.

(a) 数字0 (b) 数字1 (c) 数字2

(d) 数字3 (e) 数字4 (f) 数字5 图12 数字手势识别界面Fig.12 Digital gesture recognition map

表2 不同方法识别率Tab.2 Recognition rate in different methods %

由表2可知:虽然SVM是用于处理小样本数据的一种机器学习方法,但需先给定一定量的样本进行训练,而文中方法并不是基于样本数据特征,无需给定任何样本;对于1~5这种连续手势的识别,须建立多分类支持向量机解决,这无疑增加了算法的计算复杂度.

4 结束语

利用Kinect采集的深度数据融合追踪到的骨骼数据研究手指数字识别方法,对采集到的深度图像进行一系列处理,得到掌心圆,根据掌心圆和手指相交的次数,识别出手指个数.实验结果证明:该方法准确、高效,同时复杂度低,准确率高,适用于很多简单的人机交互现实场景.对动态手势如手势轨迹进行跟踪识别将会是下一步的工作.

猜你喜欢
手部手掌手势
手部皮肤软组织缺损修复的皮瓣选择
尺动脉腕上皮支逆行岛状皮瓣修复手部皮肤软组织缺损
封闭负压吸引技术联合游离股前外侧穿支皮瓣修复手部大面积软组织缺损
挑战!神秘手势
摊开手掌
手掌上的童话
胜利的手势
把手掌放在画纸上描一描,画出一只考拉吧
认手势说数字