首页> 中国专利> 一种基于视频输入的获取隔空手势轨迹的方法

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

摘要

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

著录项

  • 公开/公告号CN104881119A

    专利类型发明专利

  • 公开/公告日2015-09-02

    原文格式PDF

  • 申请/专利权人 济南大学;

    申请/专利号CN201510279504.6

  • 发明设计人 冯志全;冯仕昌;

    申请日2015-05-27

  • 分类号G06F3/01(20060101);G06K9/00(20060101);

  • 代理机构37205 济南舜源专利事务所有限公司;

  • 代理人商金婷

  • 地址 250022 山东省济南市市中区南辛庄西路336号济南大学信息学院

  • 入库时间 2023-12-18 10:45:37

法律信息

  • 法律状态公告日

    法律状态信息

    法律状态

  • 2017-05-17

    授权

    授权

  • 2016-03-23

    著录事项变更 IPC(主分类):G06F3/01 变更前: 变更后: 申请日:20150527

    著录事项变更

  • 2015-09-30

    实质审查的生效 IPC(主分类):G06F3/01 申请日:20150527

    实质审查的生效

  • 2015-09-02

    公开

    公开

说明书

技术领域

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

背景技术

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

发明内容

本发明的目的在于解决上述现有技术中存在的难题,提供一种基于视频输 入的获取隔空手势轨迹的方法,利用摄像头输入用户手势,获取手势重心位置 在像平面上形成的二维轨迹。

本发明是通过以下技术方案实现的:

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

(1)输入总帧数m,用摄像头捕获n帧图像的数字序列,并且放到n帧摄 像头捕获的图像数据pBG_Buffer[n]中;

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

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

(4)判断帧数n>=m,如果是,则根据(2)利用B样条画出轨迹,然后转 入步骤(5);否则,返回到(1)继续执行;

(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样条拟合。B样条拟合是通 过计算机图形学技术实现的,通过B样条进行拟合可以使隔空手势运动轨迹平 滑。

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

(A1)输入图像叠加处理完后的各个像素点的灰度值,定义位图文件头、 位图信息头和调色板和位图数据信息;

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

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

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

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

所述步骤(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)将结果从内存缓冲区复制到原图的数据区。

所述(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)将结果由内存缓冲区复制到原图的数据区。

所述步骤(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的变化次数,其它依此类推。

所述步骤(29)中的获取细化后生成白点的坐标X,Y值是这样实现的:

(D1)输入指向细化后图像的指针pImageBuffer,根据当前图像的指针对 图像的每行每列进行扫描操作;

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

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

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

所述步骤(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样条曲线的基函数如下:

G0,3(t)=16(-t3+3t2-3t+1),G1,3(t)=16(3t3-6t2+4),G2,3(t)=16(-3t3+3t2+3t+1),g3,3(t)=16t3,t[0,1]

(E4)将计算出的X,Y值进行连线;

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

所述步骤(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,即获得当前手势 坐标。

与现有技术相比,本发明的有益效果是:本发明方法速度快,与现有方法 相比较,降低了时延,缓解了轨迹生成的滞后现象。

附图说明

图1本发明方法的总体步骤框图。

图2本发明方法中的int GestureTrajectory(int n,BYTE* pBG_Buffer[n],double xxin[],double yxin[])函数的执行步骤框图的上部 分。

图3本发明方法中的int GestureTrajectory(int n,BYTE* pBG_Buffer[n],double xxin[],double yxin[])函数的执行步骤框图的下部 分。

图4本发明方法中的void CurrentCoordinates(int n,BYTE *pBG_Buffer[])函数的执行步骤框图的上部分。

图5本发明方法中的void CurrentCoordinates(int n,BYTE *pBG_Buffer[])函数的执行步骤框图的下部分。

具体实施方式

下面结合附图对本发明作进一步详细描述:

假设程序一共运行了m帧,要再现这m帧的轨迹;而获取每一次轨迹的点 的帧数假设是n帧,其中pBG_Buffer[n]指的是n帧摄像头捕获的图像数据。

其中在实现轨迹时涉及到两个函数:

1)GestureTrajectory(int n,BYTE*pBG_Buffer[n],double  xxin[],double yxin[])这个最终可以获取这n帧图像的拟合后的白点坐标值和 白点数,其中xxin[]和yxin[]分别保存的是每次手运动后细化的白点的X,Y坐 标

2)CurrentCoordinates(n,pBG_Buffer[n])实现每一帧图像的手势坐 标X,Y值。

总流程如图1所示,具体实现步骤如下:

(1)输入总帧数m,用摄像头捕获n帧图像的数字序列,并且放到 pBG_Buffer[n]中;

(2)调用函数GestureTrajectory(int n,BYTE*pBG_Buffer[n],double  xxin[],double yxin[])得到对应手势运动轨迹的白点的坐标集合白点数;

(3)调用函数CurrentCoordinates(n,pBG_Buffer[n])得到每一帧手势 的坐标值X,Y;

(4)判断帧数n>=m,如果是,则根据(2)利用B样条画出轨迹,否则, 返回到(1)继续执行。

现有方法是从每个手势图像序列中跟踪得到一个点,所有点组成的位置序列 形成手势轨迹;本发明方法是每次处理多个(n个)手势图像序列,把n个手势 图像序列叠加为一个图,再求该叠加图的“中心线”,该“中心线”就是这n帧 手势图像的轨迹。

关于int GestureTrajectory(int n,BYTE*pBG_Buffer[n],double  xxin[],double yxin[])函数的说明如下:

输入:帧数n,n帧的图像序列

输出:这个n帧进行叠加处理后的轨迹点的坐标X,Y

其中的n是指每次处理手势运动轨迹的帧数

pBG_Buffer[n]是指向这n帧的图像序列的指针

xxin[]是指保存这n帧轨迹的细化后的白点集的X坐标

yxin[]是指保存这n帧轨迹的细化后的白点集的X坐标

这个函数主要实现画轨迹的,它执行的流程图如图2和图3所示,实现的 具体步骤是:

(1)获取n帧中首帧图像的灰度信息,假设是Gray1(i)(j)

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

(3)如果fabs(此函数表示求数x的绝对值)(Gray(i)(j)-Gray1(i)(j))< 阈值则Gray(i)(j)=0,否则Gray(i)(j)保持不变

(4)ZongGray(i)(j)=ZongGray(i)(j)+Gray(i)(j)

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

(6)根据ZongGray(i)(j)的信息,利用GreyValuetoImage(double  ZongGray[][400])生成灰度图;

(7)利用QuanFangXiangPengZhang(BYTE*pImageBuffer,intwidth,int  height,int bytesPerLine)对灰度图进行膨胀;

(8)利用Thining(BYTE*pImageBuffer)对灰度图进行细化;

(9)利用int ExtractFittingPoint(BYTE*pImageBuffer,int  tempx[],int tempy[])实现获取细化后生成白点的坐标X,Y值,并统计细化 后的轨迹的白点的坐标X,Y值并记下这n帧的白点数。

其中ZongGray(i)(j)记录叠加后图像对应的各个像素的灰度值。

涉及到的其它函数如下:

(1)void GreyValuetoImage(double ZongGray[][400])实现了由得到 的灰度信息来更改新建的灰度文件的头信息,最后生成灰度图像。其中ZongGray [][400]保存的是这n帧图像处理后相叠加的像素的灰度值信息。

输入:图像叠加处理完后的各个像素点的灰度值

输出:由像素的灰度值生成对应的灰度图

具体实现步骤:

①定义位图文件头、位图信息头和调色板和位图数据信息

②新建由灰度值对应的灰度图

③依次给位图文件头、位图信息头和调色板依次赋值

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

⑤最后将数据信息写入到上面新建的灰度图像

(2)void QuanFangXiangPengZhang(BYTE*pImageBuffer,int width,int  height,int bytesPerLine)实现的是全方向膨胀。其中,pImageBuffer是指向 图像序列的指针,width指图像的宽度,height指图像的高度,bytesPerLine 指图像每行所占的字节数。

输入:指向图像序列的指针,宽,高,一行所占的字节数

输出:经全方向腐蚀后的图像数据复制到原图的数据区

具体实现步骤是:

①获得图像的首地址和图像的高和宽

②开辟一块内存缓冲区

③为用到3×3的模块,所以需定义一个一维数组:

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

0,0,0,

1,0,1};

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

⑤循环步骤④,直到处理完原图的全部像素点

⑥将结果暂存在内存缓冲区中;

⑦将结果从内存复制到原图的数据区

(3)void Thining(BYTE*pImageBuffer)实现由叠加处理的n帧图像的 信来实现提取手势轨迹的骨干。

输入:指向图像序列的指针pImageBuffer

输出:经细化处理后的内存缓冲区数据复制到原图的数据区

具体实现步骤是:

①获取图像的首地址及图像的高和宽

②开辟一块内存缓冲区,并初始化为0

③如果当前像素值小于255则跳过该像素

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

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

⑥循环执行⑤直至没有点可以删除为止

⑦将结果保存到内存缓存区

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

(4)int ExtractFitt ingPoint(BYTE*pImageBuffer,int tempx[],int  tempy[])实现获取细化后生成白点的坐标X,Y值,其中tempx[]和tempy[] 是用来保存细化的白点的X,Y坐标集

输入:指向细化后图像的指针pImageBuffer

输出:输出当前图像的白点的个数

具体实现步骤是:

①根据当前图像的指针对图像的每行每列进行扫描操作

②如果扫描到的像素值时255,则记录下该点的像素坐标,并且 白点数加一。

③依次执行②操作,直到所有的像素值都扫描完为止。

关于void CurrentCoordinates(int n,BYTE*pBG_Buffer[])函数的说明:

该函数实现显示每帧手势的坐标X,Y值

输入:帧数n,n帧图像序列

输出:每帧手势运行的坐标X,Y(放在数组中)。

函数的流程图如图4和图5所示,实现的具体步骤是:

(1)获取n帧中首帧图像的灰度信息假设是Gray1(i)(j)

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

(3)如果fabs(Gray(i)(j)-Gray1(i)(j))<阈值(阈值设置为38)则Gray (i)(j)=0,否则Gray(i)(j)保持不变

(4)ZongGray(i)(j)=ZongGray(i)(j)+Gray(i)(j)

(5)判断最后是否ZongGray(i)(j)>255,若是则ZongGray(i)(j)=255,否则 ZongGray(i)(j)=0

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

(7)对灰度图进行膨胀

(8)对灰度图进行细化

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

其中ZongGray(i)(j)记录叠加图像对应的各个像素的灰度值。

关于Void BSpline(PT*pw,int n,CDC*pdc)函数的说明

该函数用实现的是由已知点的信息进行曲线的拟合,实现方法是三次B样 条曲线。

输入:拟合的点集的坐标pw,拟合点数n,当前窗口的指针pdc

输出:进行曲线的逼近绘制而再现手势的轨迹

B样条曲线定义:给定m+n+1个平面或空间顶点Pi(i=0,1,…,m+n),称n次参 数曲线段:

t∈[0,1]为第k段n次B样条曲线段 (k=0,1,…,m),这些曲线段的全体称为n次B样条曲线。其中,基函数Gi,n(t) 定义为:

Gi,n(t)=1n!Σj=0n-i(-1)jCn+1j(t+n-i-j)n,t[0,1]

主要思想:B样条曲线是在贝齐儿曲线的基础上发展而来的,主要区别再 与他们的混合函数不同,其中n为控制点个数减1,k为控制曲线连续性的阶。 B样条曲线主要由控制点位置、参数k以及所给定的节点值ti来决定。

具体实现步骤为:

(1)首先使得端点处的导数和端点的两个控制点的连线平行,这样的要求 端点值确定,根据白点的坐标来更新第一个点和最后一个点的坐标X,Y,间隔取 t=1.0/1000

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

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

G0,3(t)=16(-t3+3t2-3t+1),G1,3(t)=16(3t3-6t2+4),G2,3(t)=16(-3t3+3t2+3t+1),g3,3(t)=16t3,t[0,1]

(4)由计算出的X,Y值进行连线

(5)如果所有的白点都遍历完成,结束,否则执行步骤(2)。

上述技术方案只是本发明的一种实施方式,对于本领域内的技术人员而言, 在本发明公开了应用方法和原理的基础上,很容易做出各种类型的改进或变形, 而不仅限于本发明上述具体实施方式所描述的方法,因此前面描述的方式只是 优选的,而并不具有限制性的意义。

去获取专利,查看全文>

相似文献

  • 专利
  • 中文文献
  • 外文文献
获取专利

客服邮箱:kefu@zhangqiaokeyan.com

京公网安备:11010802029741号 ICP备案号:京ICP备15016152号-6 六维联合信息科技 (北京) 有限公司©版权所有
  • 客服微信

  • 服务号