一种基于视频输入的获取隔空手势轨迹的方法转让专利

申请号 : CN201510279504.6

文献号 : CN104881119B

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 冯志全

申请人 : 济南大学

摘要 :

本发明提供了一种基于视频输入的获取隔空手势轨迹的方法,属于计算机人机交互界面领域。所述方法包括:(1)输入总帧数m,用摄像头捕获n帧图像的数字序列,并且放到n帧摄像头捕获的图像数据pBG Buffer[n]中;(2)获取对应手势运动轨迹的白点的坐标集合白点数;(3)获取每一帧手势的坐标值X,Y;(4)判断帧数n>=m,如果是,则根据(2)利用B样条画出轨迹,然后转入步骤(5);否则,返回到(1)继续执行;(5)结束。

权利要求 :

1.一种基于视频输入的获取隔空手势轨迹的方法,其特征在于:所述方法包括:(1)输入总帧数m,用摄像头捕获n帧图像的数字序列,并且放到n帧摄像头捕获的图像数据pBG_Buffer[n]中;

(2)获取对应手势运动轨迹的白点的坐标集合白点数;

(3)获取每一帧手势的坐标值X,Y;

(4)判断帧数n>=m,如果是,即捕获帧数m的值与总帧数相等,则根据(2)利用B样条画出轨迹,然后转入步骤(5);否则,返回到(1)继续执行,重新捕获n帧图像并累计总帧数;

(5)结束;

所述步骤(2)是这样实现的:

(21)获取n帧中首帧图像的灰度信息,设为Gray1(i)(j);

(22)获取其他n-1帧图像的灰度信息,设为Gray(i)(j),并判断fabs(Gray(i)(j)-Gray1(i)(j))<阈值是否成立;

(23)如果fabs(Gray(i)(j)-Gray1(i)(j))<阈值则Gray(i)(j)=0,否则Gray(i)(j)保持不变;

(24)ZongGray(i)(j)=ZongGray(i)(j)+Gray(i)(j),ZongGray(i)(j)记录叠加后图像对应的各个像素的灰度值;

(25)判断n帧是否执行完毕,如果否,则返回步骤(22),如果是,则判断ZongGray(i)(j)>255是否成立,若是,则ZongGray(i)(j)=255,否则ZongGray(i)(j)=0;

(26)根据ZongGray(i)(j)的信息生成灰度图;

(27)对所述灰度图进行膨胀;

(28)对灰度图进行细化;

(29)获取细化后生成白点的坐标X,Y值,并统计细化后的轨迹的白点的坐标X,Y值,并记下这n帧的白点数,然后进行B样条拟合。

2.根据权利要求1所述的基于视频输入的获取隔空手势轨迹的方法,其特征在于:所述步骤(26)是这样实现的:(A1)输入图像叠加处理完后的各个像素点的灰度值,定义位图文件头、位图信息头和调色板和位图数据信息;

(A2)新建由灰度值对应的灰度图;

(A3)依次对位图文件头、位图信息头和调色板进行赋值;

(A4)依次判断图像的灰度值,最后置成二值化,即若灰度值是0则为0,否则是255;

(A5)将经过(A4)处理后的各个像素点的灰度值写入到(A2)所建的灰度图中。

3.根据权利要求2所述的基于视频输入的获取隔空手势轨迹的方法,其特征在于:所述步骤(27)是这样实现的:(B1)输入指向图像序列的指针,宽,高,一行所占的字节数获得图像的首地址和图像的高和宽;

(B2)开辟一块内存缓冲区;

(B3)定义一个一维数组:

int B[9]={1,0,1,

        0,0,0,

          1,0,1};

(B4)为防越界,不处理最左边、最右边、最上边和最下边四边的像素,从第2行第2列开始,将指向的目标图像的像素的值赋值给目标点像素点,检查这个像素点,利用结构元素数组判断该像素点的前一点、后一点、上一点、下一点这四点中是否有相交点,如果有,则将检查的像素点的灰度值赋值为0,否则保持不变,或者定义不同形状的结构元素来进行膨胀,即检查结构元素中为1所对应的像素点是否与物体相交不为空,如果是,则保留该点,否则置为255;

(B5)循环步骤(B4),直到处理完原图的全部像素点;

(B6)将经过(B5)处理后的结果暂存在内存缓冲区中;

(B7)将结果从内存缓冲区复制到原图的数据区。

4.根据权利要求3所述的基于视频输入的获取隔空手势轨迹的方法,其特征在于:所述(28)是这样实现的:(C1)输入指向图像序列的指针pImageBuffer,获取图像的首地址及图像的高和宽、5×

5相邻区域像素值S模板;

(C2)开辟一块内存缓冲区,并初始化为0;

(C3)如果当前像素值小于255则跳过该像素;

(C4)如果当前像素为255,则是手势轨迹,则定义一个5×5的结构元素,计算5×5的结构元素中各个位置上的值,为防越界,不处理外围的2行、2列像素,从第3行第3列开始判断,将S模板中心覆盖在待判断的像素上,如果S模板所覆盖的位置下,像素小于255,则为背景,则将S模板同样的位置置为1,否则置成0;

(C5)依次判断S模板点是否同时满足4个判断条件,如果满足以上4个条件,则删除该点,否则保留像素点,并置该点的像素值为255,直至所有的像素点处理完一遍;

(C6)循环执行(C5)直至没有需要删除的点为止;

(C7)将结果保存到内存缓存区;

(C8)将结果由内存缓冲区复制到原图的数据区。

5.根据权利要求4所述的基于视频输入的获取隔空手势轨迹的方法,其特征在于:所述步骤(C5)中的4个判断条件为:条件1:2<=N(S[2][2])<=6;

条件2:T(S[2][2])=1;

条件3:S[1][2]*S[2][1]*S[2][3]=0同时T(S[1][2])!=1;

条件4:S[1][2]*S[2][1]*S[3][2]=0同时T(S[2][1])!=1;

其中,N(S[2][2])表示以S[2][2]为中心的3×3领域内目标像素的个数;取其中的3×3领域以S[2][2]为中心点,则T(S[2][2])表示序列S[2][2]周围8领域元素首尾相接形成序列中从0到1的变化次数,其它依此类推。

6.根据权利要求5所述的基于视频输入的获取隔空手势轨迹的方法,其特征在于:所述步骤(29)中的获取细化后生成白点的坐标X,Y值是这样实现的:(D1)输入指向细化后图像的指针pImageBuffer,根据当前图像的指针对图像的每行每列进行扫描操作;

(D2)如果扫描到的像素值是255,则记录下该点的像素坐标,并且将白点数加一;

(D3)依次执行(D2)的操作,直到所有的像素值都扫描完为止;

(D4)输出当前图像的白点的个数。

7.根据权利要求6所述的基于视频输入的获取隔空手势轨迹的方法,其特征在于:所述步骤(29)中进行B样条拟合是这样实现的:(E1)首先使得端点处的导数和端点的两个控制点的连线平行,根据白点的坐标来更新第一个点和最后一个点的坐标X,Y,间隔取t=1.0/1000;

(E2)每两个点进行均等插值,根据三次B样条的基函数的公式来计算基函数a,b,c,d;

(E3)利用给定的白点的坐标X,Y和基函数,根据B样条插值曲线的公式分别计算出插值点的坐标X,Y,其中用到了三次B样条曲线的公式,利用上面的公式,取n=3,则有三次B样条曲线的基函数如下:(E4)将计算出的X,Y值进行连线;

(E5)如果所有的白点都遍历完成,则结束,否则返回步骤(E2)。

8.根据权利要求7所述的基于视频输入的获取隔空手势轨迹的方法,其特征在于:所述步骤(3)是这样实现的:(F1)输入帧数n,n帧图像序列,获取n帧中首帧图像的灰度信息,设为Gray1(i)(j);

(F2)获取其他n-1帧图像的灰度信息,设为Gray(i)(j),并判断fabs(Gray(i)(j)-Gray1(i)(j))<阈值是否成立;

(F3)如果fabs(Gray(i)(j)-Gray1(i)(j))<阈值,则Gray(i)(j)=0,否则Gray(i)(j)保持不变;

(E4)ZongGray(i)(j)=ZongGray(i)(j)+Gray(i)(j),ZongGray(i)(j)记录叠加图像对应的各个像素的灰度值;

(F5)判断n帧是否执行完毕,如果否,则返回步骤(F2),如果是,则判断ZongGray(i)(j)>255是否成立,若是,则ZongGray(i)(j)=255,否则ZongGray(i)(j)=0;

(F6)根据ZongGray(i)(j)的信息生成灰度图;

(F7)对灰度图进行膨胀;

(F8)对灰度图进行细化;

(F9)统计细化后的轨迹的最后白点的坐标X,Y值和统计的点数;

(F10)记录这n帧处理完成的最后一个白点的坐标:X,Y,即获得当前手势坐标。

说明书 :

一种基于视频输入的获取隔空手势轨迹的方法

技术领域

[0001] 本发明属于计算机人机交互界面领域,具体涉及一种基于视频输入的获取隔空手势轨迹的方法。

背景技术

[0002] 在像平面上,每帧手势有一个重心位置,当手运动时,各帧手势重心位置形成一个轨迹,该轨迹就是手势轨迹。目前获取手势轨迹主要方法是采用卡尔曼滤波器或粒子滤波器等跟踪器跟踪每帧手势重心位置,进而得到手势轨迹。该方法存在的主要问题是:它们需要逐帧处理,所以速度慢,延迟严重,影响手势轨迹的实用性。

发明内容

[0003] 本发明的目的在于解决上述现有技术中存在的难题,提供一种基于视频输入的获取隔空手势轨迹的方法,利用摄像头输入用户手势,获取手势重心位置在像平面上形成的二维轨迹。
[0004] 本发明是通过以下技术方案实现的:
[0005] 一种基于视频输入的获取隔空手势轨迹的方法,包括:
[0006] (1)输入总帧数m,用摄像头捕获n帧图像的数字序列,并且放到n帧摄像头捕获的图像数据pBG_Buffer[n]中;
[0007] (2)获取对应手势运动轨迹的白点的坐标集合白点数;
[0008] (3)获取每一帧手势的坐标值X,Y;
[0009] (4)判断帧数n>=m,当捕获帧数m的值与总帧数相等时,满足n>=m,此时则根据(2)利用B样条画出轨迹,然后转入步骤(5);否则,返回到(1)继续执行,重新捕获n帧图像并累计总帧数;
[0010] (5)结束;
[0011] 所述步骤(2)是这样实现的:
[0012] (21)获取n帧中首帧图像的灰度信息,设为Gray1(i)(j);
[0013] (22)获取其他n-1帧图像的灰度信息,设为Gray(i)(j),并判断fabs(Gray(i)(j)-Gray1(i)(j))<阈值是否成立;
[0014] (23)如果fabs(Gray(i)(j)-Gray1(i)(j))<阈值则Gray(i)(j)=0,否则Gray(i)(j)保持不变;
[0015] (24)ZongGray(i)(j)=ZongGray(i)(j)+Gray(i)(j),ZongGray(i)(j)记录叠加后图像对应的各个像素的灰度值;
[0016] (25)判断n帧是否执行完毕,如果否,则返回步骤(22),如果是,则判断ZongGray(i)(j)>255是否成立,若是,则ZongGray(i)(j)=255,否则ZongGray(i)(j)=0;
[0017] (26)根据ZongGray(i)(j)的信息生成灰度图;
[0018] (27)对所述灰度图进行膨胀;
[0019] (28)对灰度图进行细化;
[0020] (29)获取细化后生成白点的坐标X,Y值,并统计细化后的轨迹的白点的坐标X,Y值,并记下这n帧的白点数,然后进行B样条拟合。B样条拟合是通过计算机图形学技术实现的,通过B样条进行拟合可以使隔空手势运动轨迹平滑。
[0021] 所述步骤(26)是这样实现的:
[0022] (A1)输入图像叠加处理完后的各个像素点的灰度值,定义位图文件头、位图信息头和调色板和位图数据信息;
[0023] (A2)新建由灰度值对应的灰度图;
[0024] (A3)依次对位图文件头、位图信息头和调色板进行赋值;
[0025] (A4)依次判断图像的灰度值,最后置成二值化,即若灰度值是0则为0,否则是255;
[0026] (A5)将经过(A4)处理后的各个像素点的灰度值写入到(A2)所建的灰度图中。
[0027] 所述步骤(27)是这样实现的:
[0028] (B1)输入指向图像序列的指针,宽,高,一行所占的字节数获得图像的首地址和图像的高和宽;
[0029] (B2)开辟一块内存缓冲区;
[0030] (B3)定义一个一维数组:
[0031] int B[9]={1,0,1,
[0032]      0,0,0,
[0033]        1,0,1};
[0034] (B4)为防越界,不处理最左边、最右边、最上边和最下边四边的像素,从第2行第2列开始,将指向的目标图像的像素的值赋值给目标点像素点,检查这个像素点,利用结构元素数组判断该像素点的前一点、后一点、上一点、下一点这四点中是否有相交点,如果有,则将检查的像素点的灰度值赋值为0,否则保持不变,或者定义不同形状的结构元素来进行膨胀,即检查结构元素中为1所对应的像素点是否与物体相交不为空,如果是,则保留该点,否则置为255;
[0035] (B5)循环步骤(B4),直到处理完原图的全部像素点;
[0036] (B6)将经过(B5)处理后的结果暂存在内存缓冲区中;
[0037] (B7)将结果从内存缓冲区复制到原图的数据区。
[0038] 所述(28)是这样实现的:
[0039] (C1)输入指向图像序列的指针pImageBuffer,获取图像的首地址及图像的高和宽、5×5相邻区域像素值S模板;
[0040] (C2)开辟一块内存缓冲区,并初始化为0;
[0041] (C3)如果当前像素值小于255则跳过该像素;
[0042] (C4)如果当前像素为255,则是手势轨迹,则定义一个5×5的结构元素,计算5×5的结构元素中各个位置上的值,为防越界,不处理外围的2行、2列像素,从第3行第3列开始判断,将S模板中心覆盖在待判断的像素上,如果S模板所覆盖的位置下,像素小于255,则为背景,则将S模板同样的位置置为1,否则置成0;
[0043] (C5)依次判断S模板点是否同时满足4个判断条件,如果满足以上4个条件,则删除该点,否则保留像素点,并置该点的像素值为255,直至所有的像素点处理完一遍;
[0044] (C6)循环执行(C5)直至没有需要删除的点为止;
[0045] (C7)将结果保存到内存缓存区
[0046] (C8)将结果由内存缓冲区复制到原图的数据区。
[0047] 所述步骤(C5)中的4个判断条件为:
[0048] 条件1:2<=N(S[2][2])<=6;
[0049] 条件2:T(S[2][2])=1;
[0050] 条件3:S[1][2]*S[2][1]*S[2][3]=0同时T(S[1][2])!=1;
[0051] 条件4:S[1][2]*S[2][1]*S[3][2]=0同时T(S[2][1])!=1;
[0052] 其中,N(S[2][2])表示以S[2][2]为中心的3×3领域内目标像素的个数;取其中的3×3领域以S[2][2]为中心点,则T(S[2][2])表示序列S[2][2]周围8领域元素首尾相接形成序列中从0到1的变化次数,其它依此类推。
[0053] 所述步骤(29)中的获取细化后生成白点的坐标X,Y值是这样实现的:
[0054] (D1)输入指向细化后图像的指针pImageBuffer,根据当前图像的指针对图像的每行每列进行扫描操作;
[0055] (D2)如果扫描到的像素值是255,则记录下该点的像素坐标,并且将白点数加一;
[0056] (D3)依次执行(D2)的操作,直到所有的像素值都扫描完为止;
[0057] (D4)输出当前图像的白点的个数。
[0058] 所述步骤(29)中进行B样条拟合是这样实现的:
[0059] (E1)首先使得端点处的导数和端点的两个控制点的连线平行,根据白点的坐标来更新第一个点和最后一个点的坐标X,Y,间隔取t=1.0/1000;
[0060] (E2)每两个点进行均等插值,根据三次B样条的基函数的公式来计算基函数a,b,c,d;
[0061] (E3)利用给定的白点的坐标X,Y和基函数,根据B样条插值曲线的公式分别计算出插值点的坐标X,Y,其中用到了三次B样条曲线的公式,利用上面的公式,取n=3,则有三次B样条曲线的基函数如下:
[0062]
[0063] (E4)将计算出的X,Y值进行连线;
[0064] (E5)如果所有的白点都遍历完成,则结束,否则返回步骤(E2)。
[0065] 所述步骤(3)是这样实现的:
[0066] (F1)输入帧数n,n帧图像序列,获取n帧中首帧图像的灰度信息,设为Gray1(i)(j);
[0067] (F2)获取其他n-1帧图像的灰度信息,设为Gray(i)(j),并判断fabs(Gray(i)(j)-Gray1(i)(j))<阈值是否成立;
[0068] (F3)如果fabs(Gray(i)(j)-Gray1(i)(j))<阈值,则Gray(i)(j)=0,否则Gray(i)(j)保持不变;
[0069] (E4)ZongGray(i)(j)=ZongGray(i)(j)+Gray(i)(j),ZongGray(i)(j)记录叠加图像对应的各个像素的灰度值;
[0070] (F5)判断n帧是否执行完毕,如果否,则返回步骤(F2),如果是,则判断ZongGray(i)(j)>255是否成立,若是,则ZongGray(i)(j)=255,否则ZongGray(i)(j)=0;
[0071] (F6)根据ZongGray(i)(j)的信息生成灰度图;
[0072] (F7)对灰度图进行膨胀;
[0073] (F8)对灰度图进行细化;
[0074] (F9)统计细化后的轨迹的最后白点的坐标X,Y值和统计的点数;
[0075] (F10)记录这n帧处理完成的最后一个白点的坐标:X,Y,即获得当前手势坐标。
[0076] 与现有技术相比,本发明的有益效果是:本发明方法速度快,与现有方法相比较,降低了时延,缓解了轨迹生成的滞后现象。

附图说明

[0077] 图1本发明方法的总体步骤框图。
[0078] 图2本发明方法中的int GestureTrajectory(int n,BYTE*pBG_Buffer[n],double xxin[],double yxin[])函数的执行步骤框图的上部分。
[0079] 图3本发明方法中的int GestureTrajectory(int n,BYTE*pBG_Buffer[n],double xxin[],double yxin[])函数的执行步骤框图的下部分。
[0080] 图4本发明方法中的void CurrentCoordinates(int n,BYTE*pBG_Buffer[])函数的执行步骤框图的上部分。
[0081] 图5本发明方法中的void CurrentCoordinates(int n,BYTE*pBG_Buffer[])函数的执行步骤框图的下部分。

具体实施方式

[0082] 下面结合附图对本发明作进一步详细描述:
[0083] 假设程序一共运行了m帧,要再现这m帧的轨迹;而获取每一次轨迹的点的帧数假设是n帧,其中pBG_Buffer[n]指的是n帧摄像头捕获的图像数据。
[0084] 其中在实现轨迹时涉及到两个函数:
[0085] 1)GestureTrajectory(int n,BYTE*pBG_Buffer[n],double xxin[],double yxin[])这个最终可以获取这n帧图像的拟合后的白点坐标值和白点数,其中xxin[]和yxin[]分别保存的是每次手运动后细化的白点的X,Y坐标
[0086] 2)CurrentCoordinates(n,pBG_Buffer[n])实现每一帧图像的手势坐标X,Y值。
[0087] 总流程如图1所示,具体实现步骤如下:
[0088] (1)输入总帧数m,用摄像头捕获n帧图像的数字序列,并且放到pBG_Buffer[n]中;
[0089] (2)调用函数GestureTrajectory(int n,BYTE*pBG_Buffer[n],double xxin[],double yxin[])得到对应手势运动轨迹的白点的坐标集合白点数;
[0090] (3)调用函数CurrentCoordinates(n,pBG_Buffer[n])得到每一帧手势的坐标值X,Y;
[0091] (4)判断帧数n>=m,如果是,则根据(2)利用B样条画出轨迹,否则,返回到(1)继续执行。
[0092] 现有方法是从每个手势图像序列中跟踪得到一个点,所有点组成的位置序列形成手势轨迹;本发明方法是每次处理多个(n个)手势图像序列,把n个手势图像序列叠加为一个图,再求该叠加图的“中心线”,该“中心线”就是这n帧手势图像的轨迹。
[0093] 关于int GestureTrajectory(int n,BYTE*pBG_Buffer[n],double xxin[],double yxin[])函数的说明如下:
[0094] 输入:帧数n,n帧的图像序列
[0095] 输出:这个n帧进行叠加处理后的轨迹点的坐标X,Y
[0096] 其中的n是指每次处理手势运动轨迹的帧数
[0097] pBG_Buffer[n]是指向这n帧的图像序列的指针
[0098] xxin[]是指保存这n帧轨迹的细化后的白点集的X坐标
[0099] yxin[]是指保存这n帧轨迹的细化后的白点集的X坐标
[0100] 这个函数主要实现画轨迹的,它执行的流程图如图2和图3所示,实现的具体步骤是:
[0101] (1)获取n帧中首帧图像的灰度信息,假设是Gray1(i)(j)
[0102] (2)获取其他n-1帧图像的灰度信息假设是Gray(i)(j),并判断fabs(Gray(i)(j)-Gray1(i)(j))<阈值是否成立(阈值设置是38)
[0103] (3)如果fabs(此函数表示求数x的绝对值)(Gray(i)(j)-Gray1(i)(j))<阈值则Gray(i)(j)=0,否则Gray(i)(j)保持不变
[0104] (4)ZongGray(i)(j)=ZongGray(i)(j)+Gray(i)(j)
[0105] (5)判断n帧是否执行完毕,如果否,则返回步骤(2),如果是,则判断ZongGray(i)(j)>255,若是,则ZongGray(i)(j)=255,否则ZongGray(i)(j)=0;
[0106] (6)根据ZongGray(i)(j)的信息,利用GreyValuetoImage(double ZongGray[][400])生成灰度图;
[0107] (7)利用QuanFangXiangPengZhang(BYTE*pImageBuffer,int width,int height,int bytesPerLine)对灰度图进行膨胀;
[0108] (8)利用Thining(BYTE*pImageBuffer)对灰度图进行细化;
[0109] (9)利用int ExtractFittingPoint(BYTE*pImageBuffer,int tempx[],int tempy[])实现获取细化后生成白点的坐标X,Y值,并统计细化后的轨迹的白点的坐标X,Y值并记下这n帧的白点数。
[0110] 其中ZongGray(i)(j)记录叠加后图像对应的各个像素的灰度值。
[0111] 涉及到的其它函数如下:
[0112] (1)void GreyValuetoImage(double ZongGray[][400])实现了由得到的灰度信息来更改新建的灰度文件的头信息,最后生成灰度图像。其中ZongGray[][400]保存的是这n帧图像处理后相叠加的像素的灰度值信息。
[0113] 输入:图像叠加处理完后的各个像素点的灰度值
[0114] 输出:由像素的灰度值生成对应的灰度图
[0115] 具体实现步骤:
[0116] ①定义位图文件头、位图信息头和调色板和位图数据信息
[0117] ②新建由灰度值对应的灰度图
[0118] ③依次给位图文件头、位图信息头和调色板依次赋值
[0119] ④依次判断图像的灰度值,最后置成二值化即若灰度值是0则为0,否则是255[0120] ⑤最后将数据信息写入到上面新建的灰度图像
[0121] (2)void QuanFangXiangPengZhang(BYTE*pImageBuffer,int width,int height,int bytesPerLine)实现的是全方向膨胀。其中,pImageBuffer是指向图像序列的指针,width指图像的宽度,height指图像的高度,bytesPerLine指图像每行所占的字节数。
[0122] 输入:指向图像序列的指针,宽,高,一行所占的字节数
[0123] 输出:经全方向腐蚀后的图像数据复制到原图的数据区
[0124] 具体实现步骤是:
[0125] ①获得图像的首地址和图像的高和宽
[0126] ②开辟一块内存缓冲区
[0127] ③为用到3×3的模块,所以需定义一个一维数组:
[0128] int B[9]={1,0,1,
[0129]      0,0,0,
[0130]        1,0,1};
[0131] ④为防越界,不处理最左边、最右边、最上边和最下边四边的像素,从第2行第2列开始,将指向的目标图像的像素的值赋值给目标点像素点,检查这个像素点,利用结构元素数组判断该像素点的前一点、后一点、上一点、下一点这四点中是否有相交点,有则将检查的像素点的灰度值赋值为0,否则保持不变。当然可以定义不同形状的结构元素B来进行膨胀,方法是检查B中为1所对应的像素点是否与物体相交不为空,是则保留该点,否则置为255.
[0132] ⑤循环步骤④,直到处理完原图的全部像素点
[0133] ⑥将结果暂存在内存缓冲区中;
[0134] ⑦将结果从内存复制到原图的数据区
[0135] (3)void Thining(BYTE*pImageBuffer)实现由叠加处理的n帧图像的信来实现提取手势轨迹的骨干。
[0136] 输入:指向图像序列的指针pImageBuffer
[0137] 输出:经细化处理后的内存缓冲区数据复制到原图的数据区
[0138] 具体实现步骤是:
[0139] ①获取图像的首地址及图像的高和宽
[0140] ②开辟一块内存缓冲区,并初始化为0
[0141] ③如果当前像素值小于255则跳过该像素
[0142] ④如果当前像素为255,则是手势轨迹,则定义一个5×5的结构元素,计算5×5的结构元素中各个位置上的值,为防越界,不处理外围的2行、2列像素,从第3行第3列开始判断,将S模板中心覆盖在欲判断的像素上,如果S模板所覆盖的位置下,像素小于255,则为背景,则在S同样的位置处置成1,否则置成0。
[0143] ⑤依次判断S模板点是否同时满足4个判断条件,是则删除该点,否则保留像素点,并置成该点的像素值为255,直至所有的像素点处理完一遍;
[0144] ⑥循环执行⑤直至没有点可以删除为止
[0145] ⑦将结果保存到内存缓存区
[0146] ⑧将结果由内存缓冲区复制到原图的数据区。
[0147] (4)int ExtractFittingPoint(BYTE*pImageBuffer,int tempx[],int tempy[])实现获取细化后生成白点的坐标X,Y值,其中tempx[]和tempy[]是用来保存细化的白点的X,Y坐标集
[0148] 输入:指向细化后图像的指针pImageBuffer
[0149] 输出:输出当前图像的白点的个数
[0150] 具体实现步骤是:
[0151] ①根据当前图像的指针对图像的每行每列进行扫描操作
[0152] ②如果扫描到的像素值时255,则记录下该点的像素坐标,并且白点数加一。
[0153] ③依次执行②操作,直到所有的像素值都扫描完为止。
[0154] 关于void CurrentCoordinates(int n,BYTE*pBG_Buffer[])函数的说明:
[0155] 该函数实现显示每帧手势的坐标X,Y值
[0156] 输入:帧数n,n帧图像序列
[0157] 输出:每帧手势运行的坐标X,Y(放在数组中)。
[0158] 函数的流程图如图4和图5所示,实现的具体步骤是:
[0159] (1)获取n帧中首帧图像的灰度信息假设是Gray1(i)(j)
[0160] (2)获取其他n-1帧图像的灰度信息假设是Gray(i)(j),并判断fabs(Gray(i)(j)-Gray1(i)(j))<阈值是否成立
[0161] (3)如果fabs(Gray(i)(j)-Gray1(i)(j))<阈值(阈值设置为38)则Gray(i)(j)=0,否则Gray(i)(j)保持不变
[0162] (4)ZongGray(i)(j)=ZongGray(i)(j)+Gray(i)(j)
[0163] (5)判断最后是否ZongGray(i)(j)>255,若是则ZongGray(i)(j)=255,否则ZongGray(i)(j)=0
[0164] (6)根据ZongGray(i)(j)的信息生成灰度图
[0165] (7)对灰度图进行膨胀
[0166] (8)对灰度图进行细化
[0167] (9)统计细化后的轨迹的最后白点的坐标X,Y值和统计的点数。
[0168] 其中ZongGray(i)(j)记录叠加图像对应的各个像素的灰度值。
[0169] 关于Void BSpline(PT*pw,int n,CDC*pdc)函数的说明
[0170] 该函数用实现的是由已知点的信息进行曲线的拟合,实现方法是三次B样条曲线。
[0171] 输入:拟合的点集的坐标pw,拟合点数n,当前窗口的指针pdc
[0172] 输出:进行曲线的逼近绘制而再现手势的轨迹
[0173] B样条曲线定义:给定m+n+1个平面或空间顶点Pi(i=0,1,…,m+n),称n次参数曲线段:
[0174] 为第k段n次B样条曲线段(k=0,1,…,m),这些曲线段的全体称为n次B样条曲线。其中,基函数Gi,n(t)定义为:
[0175]
[0176] 主要思想:B样条曲线是在贝齐儿曲线的基础上发展而来的,主要区别再与他们的混合函数不同,其中n为控制点个数减1,k为控制曲线连续性的阶。B样条曲线主要由控制点位置、参数k以及所给定的节点值ti来决定。
[0177] 具体实现步骤为:
[0178] (1)首先使得端点处的导数和端点的两个控制点的连线平行,这样的要求端点值确定,根据白点的坐标来更新第一个点和最后一个点的坐标X,Y,间隔取t=1.0/1000[0179] (2)每两个点进行均等插值,根据三次B样条的基函数的公式来计算基函数a,b,c,d
[0180] (3)由给定的数据白点的坐标X,Y和基函数根据B样条插值曲线的公式分别计算出插值点的坐标X,Y,其中用到了三次B样条曲线的公式,利用上面的公式,取n=3,则有三次B样条曲线的基函数如下:
[0181]
[0182] (4)由计算出的X,Y值进行连线
[0183] (5)如果所有的白点都遍历完成,结束,否则执行步骤(2)。
[0184] 上述技术方案只是本发明的一种实施方式,对于本领域内的技术人员而言,在本发明公开了应用方法和原理的基础上,很容易做出各种类型的改进或变形,而不仅限于本发明上述具体实施方式所描述的方法,因此前面描述的方式只是优选的,而并不具有限制性的意义。