本发明涉及一种基于形状上下文的手势识别方法。
背景技术:
:目前手势识别的方法有多种,例如王海等提出了基于Hu矩的图像旋转识别法,通过一系列数学方法将手部的图像数据映射到特征空间,其缺点是不直观,并且计算量一般都很大。DardasNH等通过对图像进行尺度不变性特征变换和矢量化特征提取,然后用特征包和多类支持向量机对手势进行识别,该方法可以得到较好的手势识别效果,但是由于SIFT算法的计算复杂度高导致识别速度较慢,实时性差。王修晖等提出Tortoise模型表征人手部的基本特征,结合遗传算法在几何与纹理混合特征空间内实现手势识别,其方法提高了实时性,但其只对几种区分度较大的手势进行了实验。Lin等提出一种基于梯度方向直方图(HOG)和手势运动轨迹的手势识别方法,首先用HOG和支持向量机算法把手从视频流中检索出来,然后提取手势运动轨迹的时空特征信息并建立标准手势库,最后用马氏距离进行手势识别。该方法有良好的识别率,但是对复杂手势识别率较差。Kuremoto等提出了一种基于动态规划(DP)的手势识别方法,首先用hsv-rgb滤波器对肤色区域进行分割,然后用retina-v1模型在8邻域内对手势进行简单的运动估计,最后用DP算法进行手势识别。何力等提出一种基于最大似然准则Hausdorff距离的手势识别算法,搜索策略采用类似于Rucklidge提出的多分辨率搜索方法,缩短了搜索时间,同时也能较好地识别字母手势,但是对部分变形(旋转和缩放)手势识别效果不好。蔡军等提出了一种改进的有向无环图支持向量机(DAGSVM)手势识别方法。利用Kinect获取手势图像,提取手势特征并训练SVM分类器。并采用改进后的方法得到DAGSVM分类器。与其他支持向量机多分类器相比,改进后的DAGSVM分类器能够达到更高的识别率。闯跃龙等提出一种名为层次化Bag-of-Features(BoF)的模型。该模型通过对人手区域进行划分和对图像特征分别向水平和垂直轴投影来提取图像特征的空间分布信息。充分利用层次化BoF模型,构建了一种基于直方图交叉核的手势识别分类算法。对于简单背景下的手势识别准确率可达99.79%,而对于复杂背景下的识别准确率为80.01%。张良国等[12]提取手势区域轮廓特征点,利用Hausdorff距离模板匹配的思想,实现了30个中国手语手指字母的识别,但未考虑手势旋转、缩放、肤色干扰时的手势识别。张汗灵等提出一种基于压缩感知理论的手势识别方法,利用Zernike矩和HOG描述符从全局和局部角度描述手势外观和形状。通过融合两种形状特征,对光照、尺度、旋转等变化具有良好的鲁棒性。董立岩等提出了一种基于网格采样的手势识别算法。该算法通过对用户输入的点集合进行旋转、平移、放缩、采样以及模板对比等操作实现手势识别。与传统识别算法相比,该算法的准确率有明显提高,而时间消耗增加很小。Zhou等提出了一种基于核稀疏表示的手势识别方法,通过核化技术,将字典原子分解为稀疏编码算法并且在内核空间中将非线性数据转化为线性关系,从而实现更有效的分类。该特征可以克服在多变量时间序列中长度不一致问题和提高手势变化的鲁棒性。Wang等利用深度传感器捕获的深度图进行手势识别,该方法能够实时操纵投影内容。为了克服深度传感器有限的测量精度,分别用背景相减法和距离图分割人体和人手。利用潜在的活性区(PAR)保证有效的手轨迹以避免额外的时间消耗和三种不同的检测模式降低复杂度。该方法的手势识别率达到90%。杨波等提出一种空间分布特征的手势识别算法,将手势的整体表观特征与手势的关节变化特性结合起来提取手势的空间分布特征(HDF),该方法对差异较大的手势有较高的识别率,但对区分度较小的手势,识别率不高。技术实现要素:为解决以上技术上的不足,本发明提供了一种识别效率高的基于形状上下文的手势识别方法。本发明是通过以下措施实现的:本发明的一种基于形状上下文的手势识别方法,包括以下步骤:步骤1,构建手势数据库,选取m种手势,每种手势选取n幅手势图像,首先找出每幅手势图像中的手势点,并计算出手势重心以及手势重心与手势点之间的最大距离,将该最大距离作为最大半径做圆,然后将该最大半径平均分成k份,以此做k个同心圆,相邻的两个同心圆之间形成圆环;统计落在每个圆环内的手势点,然后计算出每个圆环的中心点,以此作为手势特征点;在手势特征点和手势点的基础上提取形状上下文特征,最后将形状上下文特征写入文本文件存储在手势数据库;步骤2,从视频流中连续选取F帧待识别手势图像,采用与步骤1相同的方法实时计算出每帧待识别图像的形状上下文特征;步骤3,计算步骤2中每帧待识别手势图像的形状上下文特征分别与手势数据库中m*n幅手势图像的形状上下文特征之间的χ2距离,然后将手势数据库中每幅手势图像参与计算得出的所有χ2距离加起来保存在一个数组中,每帧待识别手势图像共对应保存m*n个χ2距离和数组,采用Sort函数求取m*n个χ2距离和数组的最小值A;步骤4,按照步骤3的方法,分别计算得出F帧待识别手势图像对应的F个χ2距离和数组的最小值A,然后采用Sort函数对F个χ2距离和数组的最小值A再求最小值B,该最小值B所对应存储在手势数据库中的手势即为识别出来的手势。在步骤1、3中,m=5、n=10;即选取5种手势,每种手势选取10幅手势图像。本发明的有益效果是:该发明对于手势的缩放、平移和旋转可以有效识别,识别率高,尤其对于远距离条件下(摄像头距离手势3米~4米)的低分辨率(30像素)手势图像的识别率可以达到97%以上。目前一般手势识别方法很难达到这种效果。具体实施方式本发明的一种基于形状上下文的手势识别方法,是通过手势图像上手势点对应的形状上下文特征进行比对,实现手势识别的。首先构建手势数据库。(1)选取m种手势,每种手势选取n幅手势图像,m=5、n=10;即选取5种手势,每种手势选取10幅手势图像。(2)找出每幅手势图像中的手势点;遍历整幅图像,若为黑色则认为是背景;否则则认为是手势点,同时记录下手势点的坐标和手势点的个数。(3)计算出手势重心以及手势重心与手势点之间的最大距离;(4)将该最大距离作为最大半径做圆,然后将该最大半径平均分成k份,以此做k个同心圆,k取12,相邻的两个同心圆之间形成圆环;统计落在每个圆环内的手势点,然后计算出每个圆环的中心点,以此作为手势特征点;(5)在手势特征点和手势点的基础上提取形状上下文特征,最后将形状上下文特征写入文本文件存储在手势数据库;手势数据库共有50个文件,每种手势10个文件。其中,统计手势点函数voidHandsDetection(D2POINTedgepoint[],BYTE*image,int*HandpointsNO)该函数的主要功能是在分割出来的手势图像基础上统计手势点,记录其坐标,并返回手势点的个数。D2POINT为结构体类型,该结构体类型的定义为:structD2POINT{intx;inty;};输入:指向待处理图像的指针image。输出:函数的返回值为存放手势点坐标的edgepoint[]和用来记录手势点的个数的HandpointsNO。具体步骤:①按照从上到下、从左到右的顺序遍历图像上每个像素点。②若该像素点为黑色,则结束本次循环,然后继续遍历;若不为黑色,则把该像素的x坐标和y坐标存储在数组edgepoint[]中,并使手势点个数HandpointsNO加1。③重复执行步骤②,直到图像遍历结束。④返回手势点个数HandpointsNO。统计圆环中心点函数voidCountRing(D2POINTedgepoint[],D2POINTfeaturedot[],D2POINTsumpoints[],intHandpointsNO,intcircleno)该函数的功能是计算每个圆环的中心点。输入:存储手势点坐标的edgepoint[],存储手势点个数的HandpointsNO,存储圆环份数的circleno,circleno的值为12。输出:返回存储圆环中心点坐标的数组featuredot[],存储圆环中心点和手势点坐标的数组sumpoints[],具体步骤:①由手势点坐标edgepoint[]和HandpointsNO的值,求手势的重心坐标weight。②求重心到手势点数组edgepoint[]的最大距离maxjuli。③由最大距离maxjuli为最大半径,并将此半径平均分成12份,以此确定12个圆。④根据半径的范围统计每个圆环内手势点的坐标和落在此圆环内手势点的个数,分别存放在数组ring[12]的成员变量D2POINTshixinpoint[200]和no中。数组ring[12]的类型为结构体CircleRing。该结构体类型的定义为:structCircleRing{D2POINTshixinpoint[200];//圆环内的点坐标intno;//圆环内点的数目D2POINTavg;//圆环中心点坐标};⑤在第四步的基础上,计算每个圆环的中心点。若该圆环内点的个数即no的值不为0,则通过落在该圆环内的点计算该圆环的中心点,存储在数组ring[12]的成员变量D2POINTavg中。若no的值为0则将该圆环中心点的x、y坐标均置为0。⑤将每个圆环的中心点复制到数组featuredot[]中,作为手势特征点。将圆环中心点和手势点复制到数组sumpoints[]中,为之后的形状上下文特征提取做准备。形状上下文特征提取函数voidShapeContext(intFeatureNo[][60],D2POINTfeaturedots[],D2POINTsumpoints[],intHandpointsNO,intcircleno)该函数的主要功能是求取手势特征点的形状上下文特征。输入:featuredots[]为手势特征点即圆环中心点,sumpoints[]为手势特征点和手势点的集合,HandpointsNO为手势点的个数,circleno为圆环份数。输出:用来存储每个手势特征点的形状上下文特征的数组FeatureNo[][60]。具体步骤:对每个手势特征点进行如下的操作。①求当前手势特征点到数组sumpoints[]中点的最大距离maxdistance。②若该手势特征点的x、y坐标均不为0,则执行下面的算法。以当前手势特征点为极点,最大距离maxdistance为半径,将平面空间划分为60个区域。具体划分方法如下:以当前手势特征点为极点构造极坐标系,将整个平面空间从方向上平均划分出12个方向,同时在半径上则均匀划分5份。所以,整个平面空间就自然被划分为60个区域。在相同的环上,每个区域的面积是相等的,然后统计数组sumpoints[]中的点落在每一个区域中的个数。第i个手势特征点的60个属性值能够构成一个序列(ai,1,ai,2,...,ai,60),所以可以用一个n*60形状矩阵来对图像形状进行描述:该矩a1,1a1,2a1,3...a1,60...............ai,1ai,2ai,3...ai,60...............an,1an,2an,3...an,60]]>阵的含义为:对于每个矩阵元素ai,j,i代表第i个特征点,j代表60个区域中的第j个区域,ai,j的含义为:以第i个特征点为极点,建立极坐标系,落在第j个区域内点的个数。n的值为特征点的总个数,这里n的值为12,因为共有12个圆环中心点,即手势特征点。该矩阵即代表该图像的形状的上下文特征。将此矩阵的值保存在二维数组FeatureNo[][60]中。若该手势特征点的x、y坐标均为0,则将该特征点的60个属性值全置为0。然后进行手势识别。(1)顺序读取50个手势数据库文件并将其保存在数组中。(2)从视频流中连续选取F帧待识别手势图像,F取10,从第十帧开始,从视频流中连续取10帧图像,作为待识别手势图像。(3)采用与上述相同的方法实时计算出每帧待识别图像的形状上下文特征;(4)计算每帧待识别手势图像的形状上下文特征分别与手势数据库中m*n幅手势图像的形状上下文特征之间的χ2距离,然后将手势数据库中每幅手势图像参与计算得出的所有χ2距离加起来保存在一个数组中,每帧待识别手势图像共对应保存m*n个χ2距离和数组,采用Sort函数求取m*n个χ2距离和数组的最小值A;(5)按照上述方法,分别计算得出F帧待识别手势图像对应的F个χ2距离和数组的最小值A,然后采用Sort函数对F个χ2距离和数组的最小值A再求最小值B,该最小值B所对应存储在手势数据库中的手势即为识别出来的手势。读手势模板库文件函数voidreadfile(inttemplet[50][20][60])该函数的功能是读取已经建好的手势数据库文件,并将其保存在数组templet[50][20][60]中。其中第一维数值的大小为文件标号,共有5种手势,每种手势共10个手势库文件;第二维数值的大小代表手势特征点的个数;第三维数值的大小代表每个手势特征点所对应的60个特征的值。输出:保存所有模板库文件的数组templet[50][20][60]。具体步骤:①共有5种手势,每种手势10个文件,所以共有50个手势库文件。按照顺序依次将每个文件读进数组templet[50][20][60]中。数组templet[50][20][60]第一维的数值代表不同的手势。其中0-9为包袱,10-19为剪刀,20-29为ok手势,30-39为拳头,40-49为大拇指。②顺序读取每个文件。若读出来的值为-1,则认为是该文件读取结束,将flag置为1,作为该文件读取结束标志。手势识别函数voidIdensitify(intfeaturecon[][60],floatchengben[],intn,inttemplet[50][20][60],intcircleno)此函数的功能是将待识别手势帧图像的形状上下文特征与手势库中某种手势的10个库文件中的某个文件中的形状上下文特征进行比较,求匹配代价。输入:featurecon[][60]是求得的待识别手势帧图像的形状上下文特征,templet[50][20][60]用来存储从手势库文件中读取的形状上下文特征的值。n为文件的标号,代表待识别手势与第n个手势库文件进行比较。因为共有50个文件所以n的值取0-49。circleno为圆环的个数。输出:返回存储匹配代价的数组chengben[]。因为共有12个手势特征点,所以该数组共有12个值。具体步骤:①按行遍历指向待识别手势形状上下文特征的数组featurecon[][60],同时遍历存储手势库形状上下文特征的数组templet[50][20][60]。②若该手势特征点的60个属性值全为0,则将该手势库文件中对应手势特征点的60个属性值赋值予它。然后将该手势特征点的60个属性值与该手势库文件中每个特征点的形状上下文特征进行比较,因为该特征点与手势库中每个特征点的特征之间都有一个匹配代价,所以共得到12个匹配代价值,然后在这12个值中取最小值,作为数组chengben[]的某个元素值。匹配代价用χ2距离来定义。χ2距离的定义为:Cij=12Σk=1K[hi(k)-hj(k)]2hi(k)+hj(k)]]>公式中的hi(k)为待识别手势中第i个手势特征点的形状上下文特征值,hj(k)为某个手势库文件中第j个手势特征点的形状上下文特征值,这里k的值为1-60,代表60个属性值中的某一个。经过此公式得到匹配代价值Cij,即i、j两个特征点之间的匹配代价。③按照以上方法对每个手势特征点进行遍历,所以最终得到12个匹配代价值,存放在数组chengben[]中。排序函数IdensityFlagSort(IdensityFlaggross[],intn)该函数的功能是对求得的χ2距离和求取最小值。IdensityFlag为结构体类型,定义如下:tructIdensityFlag{floatsum;intflag;};输入:数组gross[]中的成员变量sum为总的匹配代价,即待识别手势与某个手势库文件之间的匹配代价总和。成员变量flag代表手势标号。0为包袱,1为剪刀,2为ok,3为拳头,4为大拇指。输出:返回的是类型为IdensityFlag的变量mark。mark是所有匹配代价值中最小的。具体步骤:①定义一个IdensityFlag类型的变量mark来存储匹配代价和的最小值,并将数组gross[]中的第一个元素值赋值给mark。②依次遍历数组gross[],若该元素的成员变量sum值小于mark成员变量的sum值,则将该元素赋值给mark。③反复执行②直到遍历结束。返回mark的值。voidCMainFrame::TotalIdensity(BYTE*lpImgData[],inttemplet[50][20][60])该函数的主要功能是对实时得到的10帧手势图像的一个识别总过程。输入:BYTE*lpImgData[]指向得到的10帧图像,inttemplet[50][20][60]存储手势模板值。具体步骤:对于每帧图像分别进行如下的操作:①通过HandsDetection函数求取手势点。若该帧手势点个数为0,则舍弃该帧.若不为0则为有效帧,用frameNo来表示有效帧的个数。然后进行下面的计算。②通过CountRing函数统计每个圆环内的中心点。③通过ShapeContext函数计算该帧手势图像的形状上下文特征。④通过Idensitify函数将该帧手势图像的形状上下文特征与所有模板库中的形状上下文特征进行比较,以此得到50个χ2距离和。⑤在这50个χ2距离和中通过Sort函数求取最小值。循环执行步骤①-⑤,对10帧图像分别进行处理。因为每帧有效帧对应一个χ2距离和的最小值,所以n个有效帧对应n个χ2距离。在这n个χ2距离中通过Sort函数再取最小值。该最小值所对应的手势即为识别出来的手势。以上所述仅是本专利的优选实施方式,应当指出,对于本
技术领域:
的普通技术人员来说,在不脱离本专利技术原理的前提下,还可以做出若干改进和替换,这些改进和替换也应视为本专利的保护范围。当前第1页1 2 3