基于视觉的手势识别方法与流程

文档序号:12601306阅读:498来源:国知局
基于视觉的手势识别方法与流程

本发明涉及图像处理领域,尤其涉及一种基于视觉的深度图形数据获取和处理的手势识别方法。



背景技术:

传随着计算机的高速发展,人机交互模式也不断发生着变化。现实生活经验可得,人与人在交互过程中,肢体语言也非常重要,使用手来实现人机交互,比起使用键盘,鼠标等媒介而言,更加自然流畅,这也是近期触屏手机逐步成为主流的原因之一。

而使用手来实现人机交互,其原理就是机器对手的解释,如手的形状,手的空间位置,手的姿态,手的空间位置等。而识别的方法有很多,有的是利用的配套设备,如加速度传感器等,而我今天要讲的一种识别方法是基于视觉的手势识别。

基于视觉,也就是不利用相对复杂的配套设备,使用摄像头来捕获关于手的图像,并通过算法分析,从图中抽出关于手的信息。常见的包括单目识别系统,双目识别系统以及多目识别。顾名思义,单目也就是只是用一个摄像头,而双目使用两个(相当于人的双眼,通过这个可以提取出手的深度信息,获得手的空间位置),多目也就是多摄像头协作。

基于视觉的手势识别方法普遍使用网络摄像头作为图像的提取设备,但是极易受到光照变化的影响和类肤色的干扰,识别效果到不到预期的效果,随着高科技产品Kinect深度摄像头的出现,人机交互模式又出现了新的发展方向,但是在借助Kinect的基础上怎样很好的实现手势识别已经成为探索的热点。



技术实现要素:

本发明的目的,在于借助Kinect有效实现手势识别。

本发明为实现上述目标所采用的技术方案是:

提供基于视觉的手势识别方法,包括以下步骤:

步骤1、通过Kinect传感器摄取视频流,并获得深度图像数据和骨骼数据;

步骤2、用中值滤波方法对获得的深度图像数据进行预处理;

步骤3、根据深度图像数据和骨骼数据对手部区域进行提取,得到手部区域二值图;

步骤4、通过边缘检测二值化手部区域二值图的边缘图像,并提取手掌轮廓信息;

步骤5、根据手部区域二值图进行手心重置;

步骤6、根据手掌轮廓信息求出凸包顶点和外接圆;

步骤7、根据手心重置以及求出的凸包顶点和外接圆,运用分类决策树和手势库中预设的多种手势进行匹配,识别手势。

本发明所述的方法中,步骤S2具体包括以下步骤:

步骤2.1、先确定一个像素点p(i,j)为中心的邻域窗口w;

步骤2.2、把11×11邻域窗口w中所有像素的灰度值从小到大排列,并选择中间值作为中心像素点p(i,j)的灰度新值,窗口移动时就能够通过中值滤波对图像进行平滑处理;中值滤波的基本公式是:

f(i,j)=median{f(r,s)|f(f,s)∈Nf(i,j)}

其中f(r,s)表示邻域窗口w内任意像素点的灰度值,Nf(i,j)表示f(i,j)的实心邻域。

本发明所述的方法中,步骤S3中手部区域提取的步骤包括:

步骤3.1、根据追踪到的手心和关节点坐标位置;

步骤3.2、创建一个包含手部信息的矩形包围盒;

步骤3.3、在矩形包围盒内以手心关节点位置开始向邻域逐个遍历像素直到个数为空,得到手部区域二值图。

本发明所述的方法中,步骤3.1中追踪手心和关节点位置的步骤是:

步骤3.1a、在NITE库中Hand tracker类提供了手势检测和手部位置跟踪功能,调用算法对手势进行检测;

步骤3.1b、在对手势进行检测之后调用Hand tracker类的startHandTracking()函数对手部进行追踪。

本发明所述的方法中,步骤3.2中创建一个包含手部信息的矩形围盒的步骤是:

步骤3.2a、获得手心Z坐标深度值;

步骤3.2b、根据如下公式建立包围盒子

Width(W(z))=Heigth(W(z))=2*min{max{80-0.2*(Z-640),60},80}其中W(z)为所获取的包围盒。

本发明所述的方法中,步骤3.3中获取手部区域二值图的步骤是:

步骤3.3a、根据手心Z坐标深度值对深度图像进行分割,

其中,handmask是一个8位的单通道图像,手部候选区域的像素值为255,其它区域为0,式子中的阀值设定为100mm;

步骤3.3b、将手心点投影到2D空间根据手的大小做一次二维分割,算法如下:

步骤3.3c、对handmask所有闭合区域的面积进行统计,设置成人手掌的面积阀值,剔除掉小于该阀值的连通区域,最终获得较准确的手掌区域。

本发明所述的方法中,步骤4中,边缘检测的步骤具体包括:

步骤4.1、使用Hysteris阀值对边缘像素进行判断,对于每个候选单元,如果则标记为边缘像素,幅度边缘

<mrow> <msub> <mo>&dtri;</mo> <mrow> <mi>i</mi> <mo>,</mo> <mi>j</mi> </mrow> </msub> <mo>=</mo> <msqrt> <mrow> <msubsup> <mi>f</mi> <mi>x</mi> <mn>2</mn> </msubsup> <mrow> <mo>(</mo> <mi>i</mi> <mo>,</mo> <mi>j</mi> <mo>)</mo> </mrow> <mo>+</mo> <msubsup> <mi>f</mi> <mi>y</mi> <mn>2</mn> </msubsup> <mrow> <mo>(</mo> <mi>i</mi> <mo>,</mo> <mi>j</mi> <mo>)</mo> </mrow> </mrow> </msqrt> <mo>;</mo> </mrow>

步骤4.2、如果剩下的候选边缘在3×3的邻域范围内,那么至少还存在着一个邻像素为边缘像素,则把它标记为边缘;

步骤4.3、重复步骤4.2,直到所有的边缘像素都被标记,剩下的则被标记为非边缘像素;

步骤4.4、得到二值化的边缘图像;

步骤4.5、对非连续的边缘进行修补和过滤得到手掌轮廓;

步骤4.6、基于OpenCV的cvFindContours函数提取手部轮廓。

本发明所述的方法中,步骤5中手心重置的步骤具体包括:

步骤5.1、利用细化方法中的距离变换对二值化的边缘图像进行分析;

步骤5.2、OpenCV选择棋盘距离l(r)=r原理的处理函数进行图像处理。

本发明所述的方法中,步骤6中,求凸包顶点的步骤具体包括:

步骤6.1、寻找所有边缘点中Y坐标值最小的点,如果最小Y坐标值不止一个,则在这几个点中选取X坐标值最小的点,并将此点设为基准点P;

步骤6.2、把所有的边缘点与基准点P连接起来,同时计算所有连线和X坐标之间的夹角,按照夹角的大小排序,将所有边缘点依次编号为P[0],P[1]…P[n],其中n为整数;

步骤6.3、假设存在着一条虚拟路径从P[0]点依次连接到P[n]点,则判断前一点到后一点的方向是向左转还是向右转;如果是向右转,则前一点不属于凸包集;如果向左转,则判定前一点为凸包点,并把它加入堆栈;以此算法处理所有的边缘点,最后堆栈中得到凸包集;

步骤6.4、对数据进行细检测筛选更为精确的指尖点;把第一个凸包P1,第二个凸包P3作为结束点,而P1和P3之间的缺陷点P2作为深度点,则起始点和结束点都有可能是指尖点;假设(P2,P1),(P2,P3)的向量分别为V1和V2,通过计算V1,V2之间的夹角和它们的长度之和,如果V1,V2的夹角小于90°,并且两个向量的长度之和大于100mm,则起始点和结束点就可判定为指尖点;

步骤6.5,运用算法算出外接圆;

其中,步骤6.3中,对于向左转或是向右转的判别使用的是向量叉乘法,假设三个连续的点分别是P0(x0,y0),P1(x1,y1),P2(x2,y2),形成一个夹角向量为((P0,P1),(P0,P2)),向量叉乘的计算如式表示:

d=(P0,P1)×(P0,P2)=(x1-x0)*(y2-y0)-(x2-x0)*(y1-y0)

如果d>0,则(P0,P1),(P0,P2)为右转;如果d<0,则为左转;如果d=0,则为直线。

本发明所述的方法中,所述步骤7中,手势识别的步骤是:

步骤7.1、利用算法计算手势特征,包括有效凸缺陷数DCD、有效凸缺陷特征夹角DCDA、轮廓与其外接圆面积比CCR和凸包有效外接圆顶点数CD-VC这4个特征参数;

步骤7.2、建立分类决策树,根据DCD参数对不同手势第一次加以区分,对于DCD参数相同的手势再通过DCDA参数进行区分,若依然无法区别则利用CCR参数区分,最后使用CD-VC为参数加以区分。

本发明产生的有益效果是:本发明通过Kinect传感器获得深度图像数据和骨骼数据,对图像进行处理后,提取手部数据,再运用分类决策树和手势库中预设的多种手势进行匹配,从而有效识别手势。

附图说明

下面将结合附图及实施例对本发明作进一步说明,附图中:

图1是本发明实施例的方法流程图;

图2是本发明实施例手部提取流程图;

图3是本发明实施例手部提取前后对比图;

图4a是本发明实施例手掌轮廓的凸包顶点图;

图4b是本发明实施例手掌轮廓的外接圆;

图5是本发明实施例指尖点的检测和筛选;

图6是本发明实施例手势决策树示意图;

图7是本发明实施例手势库中的九种手势图。

具体实施方式

为了使本发明的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本发明进行进一步详细说明。应当理解,此处所描述的具体实施例仅用以解释本发明,并不用于限定本发明。

本发明实施例基于视觉的手势识别方法,如图1所示,具体包括以下步骤:

步骤1,通过Kinect传感器摄取视频流,用OpenCV的功能获得深度数据和骨骼数据。OpenCV(Open Source Computer Vision Library)是一个基于BSD许可(开源)发行的跨平台计算机视觉库。

步骤2,用中值滤波方法对获得的深度图像进行预处理。

步骤3,根据深度数据和骨骼数据对手部区域进行提取得到手部区域二值图,如图2所示。

步骤4,根据边缘检测再把图像化为二值化的边缘图像提取手掌轮廓,如图3所示。

步骤5,根据二值图进行手心重置。

步骤6,根据手掌轮廓信息求出凸包顶点和外接圆,如图4a和图4b所示。

步骤7,运用分类决策树(如图6所示)和手势库中的九种手势(如图7 所示)进行匹配,从而识别手势。

如上所述的步骤1中,Kinect传感器的使用和图像预处理的步骤是:

步骤1.1,针对不同的用途,微软公司先后推出了两款Kinect传感器,Kinect for Xbox 360传感器的有效追踪范围是1.2m至3.5m;而Kinect for Windows由于支持近景模式,可有效追踪0.4m至3.5m。本专利选择Kinect for Windows和PC机连接。

步骤1.2,通过应用程序开始遍历设备状态。

步骤1.3,初始化深度数据流,本专利初始化为640×480分辨率,每秒30桢。

步骤1.4,通过应用程序开始捕获深度数据和骨骼数据。

如上所述步骤2中,中值滤波处理图像的步骤是:

步骤2.1,先确定一个像素点p(i,j)为中心的邻域窗口w。

步骤2.2,继而把11×11邻域窗口w中所有像素的灰度值从小到大排列,并选择中间值作为中心像素点p(i,j)的灰度新值,窗口移动时就能够通过中值滤波对图像进行平滑处理。

步骤2.3,本算法所依据的中值滤波的基本公式是:

f(i,j)=median{f(r,s)|f(f,s)∈Nf(i,j)}

其中f(r,s)表示邻域窗口w内任意像素点的灰度值,Nf(i,j)表示f(i,j)的实心邻域。

如上所述步骤3中,手部区域提取的步骤是:

步骤3.1,根据追踪到的手心和关节点坐标位置。

步骤3.2,创建一个包含手部信息的矩形包围盒。

步骤3.3,然后在这个矩形包围盒内以手心关节点位置开始向邻域逐个遍 历像素直到个数为空,得到手部区域二值图。

如上所述步骤3.1中,追踪手心和关节点位置的步骤是:

步骤3.1a,在NITE库中Hand tracker类提供了手势检测和手部位置跟踪功能,调用算法对手势进行检测。

步骤3.1b,在对手势进行检测之后调用Hand tracker类的startHandTracking()函数对手部进行追踪。

如上所述步骤3.2中,创建一个包含手部信息的矩形围盒的步骤是:

步骤3.2a,获得手心Z坐标深度值。

步骤3.2b,根据如下公式建立包围盒子

Width(W(z))=Heigth(W(z))=2*min{max{80-0.2*(Z-640),60},80}其中W(z)为所获取的包围盒。

如上所述步骤3.3中,获取手部区域二值图的步骤是:

步骤3.3a,根据手心的Z坐标深度值对深度图像进行分割,

其中,handmask是一个8位的单通道图像,手部候选区域(即手部区域二值图)的像素值为255,其它区域为0,式子中的阀值设定为100mm。

步骤3.3b,再将手心点投影到2D空间根据手的大小做一次二维分割,算法如下:

步骤3.3c,对handmask所有闭合区域的面积进行统计,设置成人手掌的面积阀值200mm,剔除掉小于该阀值的连通区域,最终获得较准确地手掌区域。

如上所述步骤4中,边缘检测的步骤是:

步骤4.1,使用Hysteris阀值对边缘像素进行判断,对于每个候选单元, 如果则标记为边缘像素,幅度边缘

<mrow> <msub> <mo>&dtri;</mo> <mrow> <mi>i</mi> <mo>,</mo> <mi>j</mi> </mrow> </msub> <mo>=</mo> <msqrt> <mrow> <msubsup> <mi>f</mi> <mi>x</mi> <mn>2</mn> </msubsup> <mrow> <mo>(</mo> <mi>i</mi> <mo>,</mo> <mi>j</mi> <mo>)</mo> </mrow> <mo>+</mo> <msubsup> <mi>f</mi> <mi>y</mi> <mn>2</mn> </msubsup> <mrow> <mo>(</mo> <mi>i</mi> <mo>,</mo> <mi>j</mi> <mo>)</mo> </mrow> </mrow> </msqrt> <mo>.</mo> </mrow>

步骤4.2,如果剩下的候选边缘在3×3的邻域范围内,那么至少还存在着一个邻像素为边缘像素,则把它标记为边缘。

步骤4.3,重复第二步操作,直到所有的边缘像素都被标记,剩下的则被标记为非边缘像素。

步骤4.4,经过上面步骤,就把图像变为了二值化的边缘图像。

步骤4.5,对非连续的边缘进行修补和过滤就得到手掌轮廓。

步骤4.6,基于OpenCV的cvFindContours函数提取手部轮廓。

如上所述步骤5中,手心重置的步骤是:

步骤5.1,利用细化方法中的距离变换对二值化的边缘图像进行分析。

步骤5.2,OpenCV选择棋盘距离l(r)=r原理的处理函数进行图像处理。

如上所述步骤6中,求凸包顶点的步骤是:

步骤6.1,寻找所有边缘点中Y坐标值最小的点,如果最小Y坐标值不止一个时,就在这几个点中选取X坐标值最小的点,并将此点设为基准点P。

步骤6.2,把所有的边缘点与基准点P连接起来,同时计算所有连线和X坐标之间的夹角,按照夹角的大小排序,将所有边缘点依次编号为P[0],P[1]…P[n]。

步骤6.3,假设存在着一条虚拟路径从P[0]点依次连接到P[n]点,我们需要判断前一点到后一点的方向是向左转还是向右转。如果是向右转,则意味着前一点不属于凸包集;如果向左转,我们就判定前一点为凸包点,并把它加入堆栈。以此算法处理所有的边缘点,最后堆栈中得到凸包集。

步骤6.4,对数据进行细检测筛选更为精确的指尖点。把第一个凸包P1, 第二个凸包P3作为结束点,而P1和P3之间的缺陷点P2作为深度点。起始点和结束点都有可能是指尖点。假设(P2,P1),(P2,P3)的向量分别为V1和V2,通过计算V1,V2之间的夹角和它们的长度之和,如果V1,V2的夹角小于90°,并且两个向量的长度之和大于100mm,那么起始点和结束点就可判定为指尖点(如图5所示)。

步骤6.5,运用算法算出外接圆。

如上所述步骤6.3中,对于向左转或是向右转的判别使用的是向量叉乘法,假设三个连续的点分别是P0(x0,y0),P1(x1,y1),P2(x2,y2),形成一个夹角向量为((P0,P1),(P0,P2)),向量叉乘的计算如式表示:

d=(P0,P1)×(P0,P2)=(x1-x0)*(y2-y0)-(x2-x0)*(y1-y0)

如果d>0,则(P0,P1),(P0,P2)为右转;如果d<0,则为左转;如果d=0,则为直线。

如上所述步骤7中,手势识别的步骤是:

步骤7.1,利用算法计算手势特征,调用Opencv中有效凸缺陷数(DCD)方法、有效凸缺陷特征夹角(DCDA)方法、轮廓与其外接圆面积比(CCR)方法和凸包有效外接圆顶点数(CD-VC)4个方法来计算并获取参数。

步骤7.2,建立分类决策树(如图6所示),其识别流程所示,根据DCD参数对不同手势第一次加以区分,对于DCD参数相同的手势再通过DCDA参数进行区分,若依然无法区别则利用CCR参数区分,最后使用CD-VC为参数加以区分。

具体识别流程,当DCD为0时判断CCR的值,CCR大于0.55表明为手势2,当CCR小于0.35时为手势4,当大于0.35并小于0.55为手势3;

当DCD=1时,判断DCDA的角度,DCDA小于90并且CCR大于等于0.45时 为手势3,CCR小于0.45时为手势5,当DCDA大于等于90并且CDVC等于2则为手势7,CDVC不等于2则为手势4;

当DCD等于4时为手势1;

当DCD等于2,DCDA小于90为手势6,DCDA大于等于90为手势5;

当DCD等于3,DCDA小于90为手势8,DCDA大于90为手势9。

为了做到用户友好,手势识别应不受手势旋转角度以及手势区域远近的影响,由于本算法使用DCD、CCR参数为比值,这使得本发明方法具有良好的自适应性;DCDA与CDVC参数本身既具有缩放以及旋转不变性。

应当理解的是,对本领域普通技术人员来说,可以根据上述说明加以改进或变换,而所有这些改进和变换都应属于本发明所附权利要求的保护范围。

当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1