手势跟踪与识别
摘要
对于人机交互系统中的手势识别问题,本文实现了一种基于肤色分割和模板匹配的人手检测的方法,以及在单摄像头条件下进行静态手势识别的方法。首先是用肤色分割和模板匹配的方法进行人手检测,然后把检测结果作为Camshift算法跟踪的一个重要目标进行跟踪。然后通过拟合手势图的外接多边形,找出其对应的手势缺陷图,并建立手势与手势缺陷图的一一映射,利用手势缺陷图的特征来匹配和识别不同的手势。实验表明,该方法能够在简单环境中完成人手的检测与跟踪,并且实现静态手势识别,为进一步开发高效的人机交互系统奠定了基础。
关键词:人手检测;人手跟踪;手势缺陷图;手势识别
随着科学技术的不断发展,人机交互已经成为人们生活中的重要部分。人机交互有着许多丰富的表现形式,常见的有鼠标、键盘、触摸屏、麦克风等。传统的人机交互有着自身的局限性,已经无法满足人们的需要,进而需要开发出更加新颖和方便的人机交互方式。手是人体中使用得十分频繁的部位,手势具有表现方式简单,表达内容丰富,具有生动、形象和直观的特点,自然地成为一种人机交互方式的研究方向。
然而,正因为手势的多义性、多样性以及时空差异性,使得手势识别也面临着巨大的挑战。手势模式是一类复杂多变的模式,手势识别的效果容易受到肤色、光照、附属物和手势多样性的影响[1],这些问题很难同时解决,所以对于手势识别的研究往往针对某个具体的应用场景而给出具体的解决方案。
1 手势识别的关键技术
在人机交互系统中,手势的跟踪与识别应该满足以下几个要求:①实时性好,避免对高维度特征矢量的计算,数据量大的数组处理以及复杂的搜索过程;②足够的鲁棒性。不受识别对象旋转、平移和比例改变以及摄像头视角改变的影响;③手势跟踪的连续性和自动初始化,能够在跟踪失败后自动恢复跟踪,尽量减少人的干预[2]。
手势无论是静态或动态,其实现时首先需进行图像的获取、手的检测和分割、手势的分析,然后进行静态或动态的手势识别。具体流程如图1所示。
图1 手势识别流程
对于手势分割和手势识别这两个重要步骤,目前常用的一些方法[3]总结如下。
1.1 手势分割
手势分割的根本目的就是对前景手势区域和背景区域进行区分,并将手势区域从图像中分割出来,从而为后续的手势特征提取和手势分类提供保证。因此,手势分割是整个静态手势识别的基础,其分割质量的好坏会对最终识别的结果产生直接影响。基于手势目标的颜色、运动、纹理、边缘、亮度等信息[4],可以较为精确的分割出手势。
基于肤色的手势分割 肤色是人的手势最具代表性的特征之一,而基于肤色检测的手势分割也是目前最为常见的手势分割方法。由于基于肤色的方法主要对手势的轮廓、角度、大小、位置等变化并不敏感,同时,其算法复杂度普遍较低,因而具有良好的实用性。根据肤色建模方法的不同,基于肤色的手势分割方法主要分为两种类型,即统计肤色模型方法和物理肤色模型方法。
基于运动信息的手势分割 对于动态目标的分割而言,运动检测是一种常见的方法。运动检测的基本思路就是在二维的动态视频序列中,结合过去时刻的图像信息,来完成当前时刻运动目标的定位和提取。目前常见的基于运动信息的手势分割方法主要有三类,即帧间差分法、背景减除法、光流法等。帧间差分法的基本思想就是选取视频序列中相邻的若干帧,并进行差分运算,然后根据一定的阈值来将运动目标与背景分离,从而实现对运动目标的提取。背景减除法的基本思想与帧间差分法是类似的,首先根据视频序列对背景进行建模,然后通过对当前时刻的图像与背景模型进行差分运算,最后根据一定的阈值来将运动目标与背景分离,从而实现对运动目标的提取。基于光流法的目标分割方法一般通过光流场来估计视频序列中像素在时域和空域中的变化,从而构建出目标的运动模型,进而得到其运动的方向、速度等信息。
基于轮廓信息的手势分割 轮廓与边缘是手势分割的一项重要特征。基于轮廓信息的目标分割方法为手势分割带来了一个新的突破点。目前常见的基于轮廓信息的手势分割方法主要有三类,包括边缘检测算子、模板匹配、活动轮廓模型等。传统的提取目标轮廓的方法是使用边缘检测算子来对图像中的边缘进行检测,进而确定手势的轮廓。模板匹配作为一种经典的目标定位方法,也在手势分割领域中得到过一定程度的应用。模板匹配本质上就是将预设置的模板放在图像的一个点上,然后计算模板此时与图像的匹配程度,然后遍历整幅图像并重复该过程,从而找到最佳匹配点。
1.2 手势识别
手势识别主要有模板匹配、神经网络和隐马尔科夫模型三种方法[5]。模板匹配法主要根据手势的几何特征,即手势的边缘和手势区域特征,自动提取每一帧特征图像与模板库匹配后识别手势,多用于静态手势识别。神经网络在静态手势的识别中应用较多,其特点为抗干扰、自组织、自学习和抗噪声能力强,可处理不完整的模式并进行模式推广,但对时间序列的处理能力不强,因此在静态手势的识别中使用较多,不用于动态手势的识别。隐马尔可夫模型(Hidden Markov Model,HMM)是一种统计分析模型,能非常细致的描述手势信号的时空变化,适用于动态手势的识别。诸多手语识别系统均采用HMM 作为识别技术。HMM拓扑结构具有一般性,使得对手语信号的分析过于复杂,计算量过大,速度过慢,故而大多采用离散HMM。
本文主要实现静态手势的识别,即单帧图像里手势表达的意思,而不对前后帧的手势作进一步的解释。本文将手势跟踪的结果与手势的识别这两个独立的步骤联系起来,将跟踪得到的手势预测的区域设为下一帧图像识别的感兴趣区域(region of interesting,ROI);基于Camshift算法,根据前一帧手势在图像中的位置和颜色信息,对手势在下一帧图片所处的位置进行预测,主要是基于颜色的统计信息。它不仅运算量小,而且跟踪和预测的效果也非常好。通过对ROI区域进行手势的分割和识别,可以排除背景图像对手势的部分干扰,识别过程的计算量也减小很多。由于每种手势的边线都有不同特征。这些不同的特征能很好地反映在手势的外接多边形上,因此,可以对不同手势和外接多边形建立一个一一映射的关系;通过建立不同手势的外接多边形特征库,对分割出来的手势作多边形拟合,只要将提取出来的多边形与特征库中的外接多边形进行匹配就能判断出手势的类型。
2 手势分割与跟踪
2.1 手势分割
为了实现视频中的人手跟踪,首先要定位视频帧中的人手区域,也就是要进行手势分割。人手区域的检测可以采用肤色检测的方法来实现,但是,视频中可能存在人脸及其他与肤色类似的物体,会干扰人手区域定位。因此,本文采用基于肤色分割和模板匹配的人手检测方法,首先根据肤色检测模型检测出肤色区域,然后用预先准备好的人手模板对分割出的肤色区域作匹配,排除非人手区域,从而实现人手检测[6]。
由于 RGB 色彩空间中,三个颜色分量都含有亮度信息,肤色模型容易受到光照变化干扰,为了更好地提取人手的肤色特征,需要将图像帧从RGB空间转换到其他空间,例如:HSV空间。HSV空间是RGB空间的非线性变换,它将相关性很强的R、G、B分量转换成相关性较弱的H、S、V分量,只需要通过H分量的阈值分割,就可以完成肤色区域的定位。
将人手图像从RGB色彩空间转换到HSV色彩空间的效果如图2所示。可以看出,经过色彩空间转换后,人手区域和背景就很容易区分开了。设定H、S阈值将HSV空间图像转换成二值图像。
图2 图像从 RGB 色彩空间转换到 HSV 色彩空间的效果
由于人手肤色和脸部肤色或其他背景具有较大的相似之处,直接有上面的方法确定的肤色部分可能会存在其他非人手部分。为进一步缩小后续搜索范围,可以进行去噪处理,然后将面积较大的肤色区域都列为候选的人手区域。
在进行图像目标检测与识别的过程中,容易受各种各样的噪声干扰,使图像出现质量退化。手势在整幅图像中的大小、位置以及质量容易受焦距大小、距离、远近等方面的影响。由于各摄像机内部处理机制不同,采集的图像在计算机中的显示方法也不同。而且,受噪声干扰,数字成像可能被强度随机变化所破坏。一些常见的噪声模型与真实的噪声类似,如:椒盐、脉冲和高斯噪声。这些噪声都可能会改变已处理数据的分析,或可能导致处理手势识别时出现各种问题。因此,图像预处理这项工作在保证采集图像的质量、格式以及手势大小的一致性上就变得十分重要。经过图像预处理有效地减少噪声而形成较高质量图像,有利于进一步的图像操作。图像预处理主要通过彩色颜色空间的转换,图像滤波和图像缩放处理来完成。
图3 最终得出的人手二值化图像
2.2 手势跟踪
得到人手区域的候选区后就可以利用准备好的人手模板对候选区域进行匹配。模板匹配是为了在图像中识别出已知形状特征的目标物体,使用目标物体的形状特征模板与图像进行匹配,在规定的相应准则下识别出目标物体。将模板图在被搜图上滑动,通过比较模板图与子图的相似度来确定目标位置。检测出人手的位置后就可以使用Camshift算法来跟踪人手。
Camshift算法利用目标的颜色直方图模型将图像转换为颜色概率分布图,初始化一个搜索窗的大小和位置,并根据上一帧得到的结果自适应调整搜索窗口的位置和大小,从而定位出当前图像中目标的中心位置,有效地解决了跟踪目标被遮挡或变形的问题,对系统的要求不高,时间复杂度也不高,在简单背景条件下有较好的跟踪效果。其搜索步骤[7]为:
(1)将整个图像作为搜索区域;
(2)把检测出的人手作为初始化搜索窗口;
(3)计算检测出的人手区域的颜色概率分布图;
(4)调用 Mean Shift 算法,获取搜索窗口新的尺寸以及位置;
(5)在下一帧视频图像中,用(3)中获取的值初始化搜索窗的尺寸和位置;
转存失败重新上传取消转存失败重新上传取消转存失败重新上传取消
(6)跳到(3)继续运行,直到收敛。
图4 跟踪效果
从跟踪效果图可见,本文提出的方法在较为复杂的环境中可以准确的对人手进行跟踪,并且不会被人脸或其它和人手肤色相近的区域干扰。
3 静态手势识别
通过静态手势的识别,使系统能够对被跟踪对象有一个基本的理解。静态手势的识别是基于轮廓特征的识别,对分割出来的人手作边缘检测,得到手势完整的轮廓边缘。通过前面的方法能够得到图像的手势分割的二值图。接着使用一种查找外接边的搜索方法,通过对手势轮廓按轮廓点顺序进行定长扫描,将手势轮廓线的外接多边形拟合出来,再根据几何特征,进行模板匹配,最终完成静态手势识别。
本文使用手势轮廓及手势凸缺陷检测指尖。手势凸缺陷定义为手势凸包与手势外轮廓的差,如图5所示,由虚线组成的多边形表示该轮廓的凸包,灰色多边形表示人手的外轮廓,黑色双向箭头表示该凸缺陷中距离凸包的最大距离,P1转存失败重新上传取消 点表示该凸缺陷开始的轮廓点,P2转存失败重新上传取消 点表示该凸缺陷结束的轮廓点,P3转存失败重新上传取消 点表示该凸缺陷中距离凸包最远的轮廓点。有图可知凸缺陷与手势指尖息息相关,能有效地表达手势。进一步观察可知,指尖一定在手势外轮廓附近;与凸包的最大距离满足一定长度的凸缺陷才是指尖出现的凸缺陷候选集,图中a凸缺陷是满足要求的,而b凸缺陷是不满足要求的;指尖靠近凸缺陷开始及结束的轮廓点,可以将第一凸缺陷开始的轮廓点以及最后一个凸缺陷结束的轮廓点分别作为第一个和最后一个指尖;除了第一个以及最后一个凸缺陷外,以当前凸缺陷结束的轮廓点与下一凸缺陷开始的轮廓点的平均作为指尖坐标。由此,可以得到指尖的个数以及位置。
图5 手势缺陷图
为了得到手势轮廓缺陷图,需要先对手势轮廓进行多边形拟合,得到它的外接多边形。本文根据手势轮廓上相邻两点间的凹凸性来进行拟合,通过一次遍历轮廓上的点,对以下方程进行判定,将适合的点剔除,剩下的点即为外接多边形的候选定点:
ax=pcur.x-pprev.x,ay=pcur.y-pprev.y转存失败重新上传取消
bx=pnext.x-pcur.x,by=pnext.y-pcur.y转存失败重新上传取消
其中,pcur为当前遍历的轮廓线上的点,pprev、pnext分别表示当前点的前一个点和后一个点,ax、ay分别为当前点和前一点的x和y坐标值差,bx、by分别为当前点和后一点指尖的x和y坐标值差。
基于轮廓线凹凸行的拟合算法流程如下:
(1)将所有的轮廓线上的点按x坐标值大小排序,并找出所有的点中y坐标的最大最小值maxY和minY。
(2)将排序后的轮廓点划分为四部分:首先按照y坐标将轮廓线分为上下两个部分,将上半部分以maxY所在的x坐标(即为Xmaxy)划分为两个部分,分别记为topLeft(左上)和topRight(右上);将下半部分以minY所在的x坐标(记为Xminy)划分为两个部分,分别记为bottomLeft(左下)和bottomRight(右下)。
(3)分别对前一步划分的四个部分进行遍历:对区域topLeft将满足式1<0转存失败重新上传取消 ,式2>0转存失败重新上传取消 的点剔除;对区域topRight将满足式1<0转存失败重新上传取消 ,式2<0转存失败重新上传取消 的点剔除;对区域bottomLeft将式1>0转存失败重新上传取消 ,式2>0转存失败重新上传取消 的点剔除;对区域bottomRight将满足式1>0转存失败重新上传取消 ,式2>0转存失败重新上传取消 的点剔除。剔除后剩下的点即为手势轮廓线外接多边形的顶点。
手势缺陷图的谷底以及谷底深度的求解就是建立在拟合外接多边形的基础之上的,还需要对外接多边形的每一条边所对应的轮廓线再进行一次遍历,并将满足以下方程的最大值求出即是该边所对应的谷底:
dx=cur.x=hullcur.x#3转存失败重新上传取消
dy=cur.y-hullcur.y#4转存失败重新上传取消
depth=dy0×dx+dx0×dy×scale#5转存失败重新上传取消
其中,scale为单位化量值,hull_cur和hull_next分别为外接多边形当前遍历的边和下一条边,dx0、dy0分别为外接多边形当前边的x和y坐标的差值,dx、dy分别为当前遍历的轮廓线上的点与hull_cur点之间x和y坐标的差值,depth为遍历点与对应边之间的距离,它的最大值即为该边对应的谷底深度,相应的点位谷底。
有了手势的几何特征之后,只要将提取出来的多边形与特征库中的外接多边形进行匹配就能判断出手势的类型。整个静态手势识别过程如图6所示。
图6 静态手势识别流程
4 实验与分析
本文在windows系统下使用python3 + OpenCV实现了手势识别。实验环境为实验室,可以检验本文算法在普通光照下的准确性。本文共实验了五种手势:A为握拳、B为食指伸长、C为V型手势、D为三指伸开、E为五指张开。
图7 实验过程记录
图8 手势及其对应的几何特征(依次为握手、食指伸开、V型手势、三指伸开、五指伸开)
进一步地,为了测试本文算法的有效性,对五种手势分别测试了100次,记录了对应的识别准确率,如下表所示。可见整体上有一定的识别效果,但是识别的准确率不是非常高,特别是V型手势和三指伸开这两种情况。可见本文目前所使用的算法还有进一步优化的需要。
表1 手势识别结果
手势 |
测试次数 |
正确率 |
A |
100 |
76% |
B |
100 |
84% |
C |
100 |
65% |
D |
100 |
71% |
E |
100 |
83% |
由此可见,本文对于手势识别有了初步的成效,能够进行静态手势识别。进一步地可以考虑具体的人机交互应用场景,如开发一个基于手势的拼图游戏,通过变换手势来完成拼图。A、E手型分别对应抓取与松开。手势为握拳状态时,手对应的图片块被选中(类似鼠标左键按下),此时可以拖动图片,选定位置后可以换成手势E,图片被松开(类似鼠标左键松开),B、C、D手势分别表示将图片放大、缩小和旋转。
5 结束语
本文从基于手势的人机交互系统设计出发,实现了一种基于手势几何特征的手势识别。在进行手势跟踪是,本文使用了基于肤色和模板匹配的改进的 Camshift 人手跟踪算法,以肤色概率分布图中的模板匹配是否成功作为算法迭代的终止条件,解决了场景中存在大面积类肤色干扰时跟踪失误和定位区域不完整的问题。在进行静态手势识别时,使用手势轮廓缺陷图作为手势识别的特征结构,不仅大大减少了计算量,由于缺陷图是从整体结构刻画手势的结构,所以它还增强了手势识别的鲁棒性。实验表明,该方法简单有效,为进一步开发高效的人机交互系统奠定了基础。
参考文献
[1] 赵小川, 赵继鹏, 范炳远, et al. 手势识别技术研究综述与应用展望[C]// 第十一届全国信号和智能信息处理与应用学术会议专刊. 2017.
[2] 徐成, 马翌伦, 刘彦. 一种基于嵌入式系统实时交互的手势识别方法[J]. 计算机应用研究, 2011, 28(7):2782-2785.
[3] 武霞, 张崎, 许艳旭. 手势识别研究发展现状综述[J]. 电子科技, 2013, 26(6):171.
[4] 潘丹丹, 柳灿雄, 聂建华. 复杂背景下的手势分割及掌心检测[J]. 工业控制计算机, 2016, 29(1):109-110.
[5] 冯志全, 蒋彦. 手势识别研究综述[J]. 济南大学学报(自然科学版), 2013, 27(4).
[6] 余鹏飞, 张海科, 李涛. 基于Camshift算法的人手检测与跟踪定位方法研究[J]. 信息工程, 2013(5):99-103.
[7] Exner D, Bruns E, Kurz D, et al. Fast and robust CAMShift tracking[C]// Computer Vision & Pattern Recognition Workshops. IEEE, 2010.
转载:https://blog.csdn.net/qq_24624539/article/details/104637312