一种基于手势的数字输入方法_3

文档序号:9452633阅读:来源:国知局
分别存放在数组1';11^[12]的成员变量02?011^181111;[即0;[111:[200]和11〇中。数组1';[1^[12] 的类型为结构体CircleRing。该结构体类型的定义为:structCircleRing{D2P0INT shixinpoint[200] ;//圆环内的点坐标intno;//圆环内点的数目D2P0INTavg;//圆环中 心点坐标};
[0127] ⑤在第四步的基础上,计算每个圆环的中心点。若该圆环内点的个数即no的值 不为0,则通过落在该圆环内的点计算该圆环的中心点,存储在数组ring[12]的成员变量 D2P0INTavg中。若no的值为0则将该圆环中心点的x、y坐标均置为0。
[0128] ⑤将每个圆环的中心点复制到数组featuredot□中,作为手势特征点。将圆环中 心点和手势点复制到数组sumpoints□中,为之后的形状上下文特征提取做准备。
[0129]形状上下文特征提取函数voidShapeContext(intFeatureNo[] [60],D2P0INTfe aturedots[],D2P0INTsumpoints[],intHandpointsN0,intcircleno)该函数的主要功 能是求取手势特征点的形状上下文特征。
[0130] 输入:featuredots□为手势特征点即圆环中心点,sumpoints□为手势特征点和 手势点的集合,HandpointsNO为手势点的个数,circleno为圆环份数。
[0131] 输出:用来存储每个手势特征点的形状上下文特征的数组FeatureNo[] [60]。
[0132] 具体步骤:
[0133] 对每个手势特征点进行如下的操作。
[0134] ①求当前手势特征点到数组sumpoints□中点的最大距离maxdistance。
[0135] ②若该手势特征点的x、y坐标均不为0,则执行下面的算法。
[0136] 以当前手势特征点为极点,最大距离maxdistance为半径,将平面空间划分为60 个区域。具体划分方法如下:以当前手势特征点为极点构造极坐标系,将整个平面空间从方 向上平均划分出12个方向,同时在半径上则均匀划分5份。所以,整个平面空间就自然被 划分为60个区域。在相同的环上,每个区域的面积是相等的,然后统计数组sump〇ints[] 中的点落在每一个区域中的个数。
[0137] 第i个手势特征点的60个属性值能够构成一个序列(aiil,ali2,...,ali6。),所以可 以用一个n*60形状矩阵来对图像形状进行描述:
[0138]
:矩阵的含义为:对于每个矩阵元素a^,i代表第i个 特征点,j代表60个区域中的第j个区域,' ,的含义为:以第i个特征点为极点,建立极坐 标系,落在第j个区域内点的个数。n的值为特征点的总个数,这里n的值为12,因为共有 12个圆环中心点,即手势特征点。该矩阵即代表该图像的形状的上下文特征。将此矩阵的 值保存在二维数组FeatureNo[] [60]中。若该手势特征点的x、y坐标均为0,则将该特征 点的60个属性值全置为0。
[0139] 然后进行手势识别。
[0140] (1)顺序读取50个手势数据库文件并将其保存在数组中。
[0141] (2)从视频流中连续选取F帧待识别手势图像,F取10,从第十帧开始,从视频流 中连续取10帧图像,作为待识别手势图像。
[0142] (3)采用与上述相同的方法实时计算出每帧待识别图像的形状上下文特征;
[0143] (4)计算每帧待识别手势图像的形状上下文特征分别与手势数据库中m*n幅手势 图像的形状上下文特征之间的x2距离,然后将手势数据库中每幅手势图像参与计算得出 的所有x2距离加起来保存在一个数组中,每帧待识别手势图像共对应保存m*n个x2距离 和数组,采用Sort函数求取m*n个x2距离和数组的最小值A;
[0144] (5)按照上述方法,分别计算得出F帧待识别手势图像对应的F个x2距离和数组 的最小值A,然后采用Sort函数对F个x2距离和数组的最小值A再求最小值B,该最小值 B所对应存储在手势数据库中的手势即为识别出来的手势。
[0145]读手势模板库文件函数voidreadfile(inttemplet[50] [20] [60])
[0146] 该函数的功能是读取已经建好的手势数据库文件,并将其保存在数组 templet[50] [20] [60]中。其中第一维数值的大小为文件标号,共有5种手势,每种手势共 10个手势库文件;第二维数值的大小代表手势特征点的个数;第三维数值的大小代表每个 手势特征点所对应的60个特征的值。
[0147] 输出:保存所有模板库文件的数组templet[50] [20] [60]。
[0148] 具体步骤:
[0149] ①共有5种手势,每种手势10个文件,所以共有50个手势库文件。按照顺序依次 将每个文件读进数组templet[50] [20] [60]中。数组templet[50] [20] [60]第一维的数值 代表不同的手势。其中0-9为包袱,10-19为剪刀,20-29为ok手势,30-39为拳头,40-49 为大拇指。
[0150] ②顺序读取每个文件。若读出来的值为-1,则认为是该文件读取结束,将flag置 为1,作为该文件读取结束标志。
[0151]手势识别函数voidIdensitify(intfeaturecon[] [60],floatchengben[],int n,inttemplet[50][20][60],intcircleno)
[0152] 此函数的功能是将待识别手势帧图像的形状上下文特征与手势库中某种手势的 10个库文件中的某个文件中的形状上下文特征进行比较,求匹配代价。
[0153] 输入:featurecon[] [60]是求得的待识别手势帧图像的形状上下文特征, templet[50][20][60]用来存储从手势库文件中读取的形状上下文特征的值。n为文件的 标号,代表待识别手势与第n个手势库文件进行比较。因为共有50个文件所以n的值取 0_49。circleno为圆环的个数。
[0154] 输出:返回存储匹配代价的数组chengben□。因为共有12个手势特征点,所以该 数组共有12个值。
[0155] 具体步骤:
[0156]①按行遍历指向待识别手势形状上下文特征的数组featurecon[] [60],同时遍历 存储手势库形状上下文特征的数组templet[50] [20] [60]。
[0157] ②若该手势特征点的60个属性值全为0,则将该手势库文件中对应手势特征点的 60个属性值赋值予它。然后将该手势特征点的60个属性值与该手势库文件中每个特征点 的形状上下文特征进行比较,因为该特征点与手势库中每个特征点的特征之间都有一个匹 配代价,所以共得到12个匹配代价值,然后在这12个值中取最小值,作为数组chengben[] 的某个元素值。匹配代价用X2距离来定义。x2距离的定义为:
[0158]
[0159] 公式中的h (k)为待识别手势中第i个手势特征点的形状上下文特征值,hj(k)为 某个手势库文件中第j个手势特征点的形状上下文特征值,这里k的值为1-60,代表60个 属性值中的某一个。经过此公式得到匹配代价值,即i、j两个特征点之间的匹配代价。
[0160] ③按照以上方法对每个手势特征点进行遍历,所以最终得到12个匹配代价值,存 放在数组chengben□中。
[0161]排序函数IdensityFlagSort(IdensityFlaggross[],intn)
[0162] 该函数的功能是对求得的x2距离和求取最小值。
[0163] IdensityFlag为结构体类型,定义如下:
[0164] truct IdensityFlag {floa
当前第3页1 2 3 4 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1