人机交互过程中数字手势的识别方法
2020-04-29贾丙佳李平
贾丙佳, 李平
(华侨大学 信息科学与工程学院, 福建 厦门 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的方式,达到不限定人体必须位于摄像头前的某一固定位置的目的. 根据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)可知:手掌区域被单独分割出来,去除了手臂上的干扰像素,进行了边缘平滑处理. 对分割出来的图像进行形态学开运算,在保持手掌区域面积大体不变的情况下,分割掉手指处的纤细部分,这时计算分割后图像的最小包围圆;然后,对最小包围圆的半径适当延长5到10个像素单位,得到的同心圆作为掌心圆;最后,统计掌心圆边界和图5(b)所示的手掌区域分割图中手指的相交次数,将其作为一种特征识别手指个数. 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通道取值保持一致,同时,圆边界的宽度仅用一个像素值表示,从而为后续处理做铺垫. 最小包围圆包围了不含手指的全部像素(图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 为了对提出的方法进行验证,使用的计算机配置为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这种连续手势的识别,须建立多分类支持向量机解决,这无疑增加了算法的计算复杂度. 利用Kinect采集的深度数据融合追踪到的骨骼数据研究手指数字识别方法,对采集到的深度图像进行一系列处理,得到掌心圆,根据掌心圆和手指相交的次数,识别出手指个数.实验结果证明:该方法准确、高效,同时复杂度低,准确率高,适用于很多简单的人机交互现实场景.对动态手势如手势轨迹进行跟踪识别将会是下一步的工作.1.3 手掌分割
2 特征的提取与手指个数的识别
2.1 掌心圆的计算
2.2 手指数字的识别
3 实验结果与分析
4 结束语