基于KINECT的多手指实时跟踪方法与流程

文档序号:11514529阅读:364来源:国知局
基于KINECT的多手指实时跟踪方法与流程

本发明涉及基于kinect的多手指实时跟踪方法,属于生物特征计算机识别技术领域。



背景技术:

在虚拟现实和人机交互系统中,实时、准确并且稳定的多手指跟踪能给用户带来友好的交互体验。基于其丰富的应用前景,三维多手指跟踪得到了研究者的广泛关注,其算法主要分为四个步骤:手部区域的分割、指尖的检测、指尖三维位置的获取、指尖三维位置及其轨迹的跟踪。其中,手部区域的分割是很重要的一个步骤,因为它直接决定了指尖检测算法的准确性。但是该方法的缺点是易受灯光等外部环境的影响,在光照条件不好的情况下容易失败。为此,一些研究者利用红外相机来得到可靠的手分割区域,然而红外相机价格昂贵。还有一些研究者通过给出一些限制条件,如固定的背景、固定的光照等来得到较好的分割区域,但此方法限制了手指跟踪的应用场合。指尖的检测算法主要分三类:基于轮廓、基于形状、基于模板。基于轮廓方法的缺点是它要求手部区域的轮廓比较准确,否则就会出现错误;基于模板匹配的方法也有此缺点,而且速度比较慢。至于基于形状的方法,要确定一个合适的open操作窗口大小是比较困难的。

随着微软公司kinect设备的推出,利用这一廉价的硬件设备,能够实时捕获场景的彩色和深度信息。一些研究者尝试利用kinect进行多手指跟踪的研究,但都是在kinect给出的深度图的基础上设计更加鲁棒的二维指尖检测算法,并没有在得到二维指尖点之后,继续利用kinect给出的深度值来跟踪指尖点的三维坐标和轨迹。

本软件实现的算法利用kinect的深度图来分割手部区域,并且根据kinect的数据特点,提出了一个改进的基于像素分类的指尖检测算法。在此基础上,再利用kinect的深度图,获得指尖的三维坐标,然后通过应用帧之间连续性的卡尔曼滤波器实现指尖三维位置和轨迹的稳定跟踪。相比之下,本发明的算法能稳定地跟踪到指尖的三维位置,不仅能实现2d人机交互,还能有效地进行3d人机交互。本发明的算法更加简单,速度更快,在一般pc平台,同时跟踪两个手的所有手指的情况下,也能达到20+fps,跟踪一个手能达到40+fps。



技术实现要素:

目的:为了克服现有技术中存在的不足,本发明提供基于kinect的多手指实时跟踪方法。

技术方案:本发明通过如下技术方案来实现:

一种基于kinect的多手指实时跟踪方法,包括步骤如下:

步骤一:手部区域分割;

步骤二:基于像素分类的指尖检测;

步骤三:获取指尖的三维位置;

步骤四:三维指尖轨迹跟踪。

所述手部区域分割包括如下步骤:

1a:利用nite库来跟踪手的中心点位置,再根据中心点深度坐标,提取深度手部区域:

其中,zhand表示跟踪到的手的中心点的深度值,z(x,y)表示像素点(x,y)处的深度值,thresh表示手的最大深度范围;handmask(x,y)表示手部区域的辨别函数;

1b:将步骤1a中的像素点,范围缩小到一个包括手部区域的包围盒内;令包围盒内的手部区域handmask(x,y)=255,包围盒外的区域handmask(x,y)=0;

其中,w(z)表示以手的中心点为中心的包围盒,z为相应坐标的深度值包围盒大小与手距离kinect的关系如下:

width(w(z))=heigth(w(z))=2*min{max{80-0.2*(z-640),60},80}

其中,width(w(z))和heigth(w(z))分别代表包围盒的水平宽度与垂直高度的数值。

所述基于像素分类的指尖检测,包括如下步骤:

2a:将kinect深度值离散化为六段:[501mm,600mm]、[601mm,700mm]、[710mm,800mm]、[801mm,900mm]、[901mm,1000mm]、[1001mm,1100mm];设每一段的gap1与gap2取值分别为gap1i与gap2i;利用kinect提供的手指轮廓获得指尖位置,以指尖为圆心画半径为20px的圆,交点距离为手指宽度fli,对应六段区域fli分别取10px、10px、12px、13px、14px、15px,令delta=3px,则可求出两圆半径:

gap1i=fli/2-delta

gap2i=fli/2+delta

2b:根据2a的结果对二值图像进行基于像素的分类:a.若像素点p为圆心,gap1为半径的圆区域中手区域所占比例的大小不大于该圆面积的一半,判定像素点p在手部区域外;b.若像素点p为圆心,gap1为半径的圆区域中手区域所占比例的大小大于该圆面积的一半,判定像素点p在手部区域内;c.若像素点p为圆心,满足b的前提下,以gap2为半径的圆与手区域有四个交点,判定像素点p在手指区域;d.若像素点p为圆心,满足b的前提下,gap2为半径的圆与手区域有两个交点,且交点间距离小于对应的手指的宽度fli,判定像素点p在指尖区域。

所述获取指尖的三维位置,选取指尖区域内像素点p周围以3px为半径的圆在xy平面中的所有点进行取样,若采样点深度值与圆心点深度值差值大于10px,则舍去,计算剩余采样点深度值的均值作为圆心点的深度值。

所述三维指尖轨迹跟踪,包括如下步骤:

4a:建定卡尔曼滤波器预测指尖点位置:

首先,在每一帧中,测量指尖点在三维中的位置和速度,定义卡尔曼滤波器的状态向量为

xt=(x(t),y(t),z(t),vx(t),vy(t),vz(t))

其中,x(t),y(t),z(t)表示指尖点在三维中的坐标位置,vx(t),vy(t),vz(t)表示在每一帧中指尖点的速度;同理,定义卡尔曼滤波器的观察向量为

yt=(x(t),y(t),z(t))

观察向量表示指尖点在每一帧中的三维坐标;

列出卡尔曼滤波器方程:

xt+1=fxt+gwt

yt=hxt+vt

其中,f是状态转移矩阵,g是驱动矩阵,h是观察矩阵,wt是状态向量xt的系统误差,vt是观察误差,表示指尖点检测算法和kinect深度检测的误差:

其次,假设δt<0.05s,连续两帧之间的指尖点的运动近似看作是匀速直线运动;f,g和h定义如下:

最后,利用每个手指的卡尔曼滤波器,通过手指在t帧的位置预测手指在t+1帧时候的位置;

4b:预测指尖点和检测指尖点之间的匹配跟踪:

在当前帧,利用基于像素分类的指尖检测方法检测出当前帧的所有指尖点;同时,利用卡尔曼滤波器通过上一帧预测出当前帧指尖点所在的位置;将预测指尖点位置和检测指尖点位置按手中心点顺时针排列后做组合匹配,找到匹配误差最小的组合作为最终结果,匹配误差的值是指尖点三维位置的欧氏距离的差值;之后,利用匹配误差最小的组合中的卡尔曼滤波器的预测位置来代替真实位置,如此一直跟踪下去;

4c:处理指尖数量的变化跟踪

在第一种情况下,操作者确实改变了指尖的数量;当指尖数量增加时,开启新的卡尔曼滤波器来跟踪它;当指尖数量减少时,终止相应的卡尔曼滤波器;

在第二种情况下,由于误差和运动模糊的原因,在某些帧某些指尖点检测不到或者误检测到多余的指尖点;首先,设置计时器用于当指尖数量开始变化时计算时间;其次,若计算时间大于某个阈值,则判断指尖数量变化是第一种情况;否则判断指尖数量变化是第二种情况,卡尔曼滤波器不变化。

作为优选方案,计时器的阈值设置0.2s。

有益效果:本发明提供的基于kinect的多手指实时跟踪方法,可以实时,迅速而准确地进行手指跟踪,系统稳定性高,用户体验度高,反映速度快。

附图说明

图1为本发明跟踪方法的系统流程图;

图2为手部区域分割示意图;

图3为像素分类示意图;

图4为像素分类决策树示意图。

具体实施方式

下面结合附图对本发明作更进一步的说明。

如图1所示,一种基于kinect的多手指实时跟踪方法,包括如下步骤:

步骤一:用kinect获取人的深度图像;

步骤二:将手部区域分割出来;

步骤三:检测出二维的指尖位置;

步骤四:获得三维指尖位置;

步骤五:跟踪三维指尖位置获得其运动轨迹。

如图2所示,kinect在获取深度图像之后,将手部区域采用盒装的方式分割开来。所述手部区域分割包括如下步骤:

2a:利用nite库来跟踪手的中心点位置,再根据中心点深度坐标,提取深度手部区域:

其中,zhand表示跟踪到的手的中心点的深度值,z(x,y)表示像素点(x,y)处的深度值,thresh表示手的最大深度范围;handmask(x,y)表示手部区域的辨别函数;

2b:将步骤2a中的像素点,范围缩小到一个包括手部区域的包围盒内;令包围盒内的手部区域handmask(x,y)=255,包围盒外的区域handmask(x,y)=0;

其中,w(z)表示以手的中心点为中心的包围盒,z为相应坐标的深度值包围盒大小与手距离kinect的关系如下:

width(w(z))=heigth(w(z))=2*min{max{80-0.2*(z-640),60},80}

其中,width(w(z))和heigth(w(z))分别代表包围盒的水平宽度与垂直高度的数值,以后的计算都是基于这个范围来完成的。

所述检测出二维的指尖位置包括如下步骤:

3a、将kinect深度值离散化为六段:[501mm,600mm]、[601mm,700mm]、[710mm,800mm]、[801mm,900mm]、[901mm,1000mm]、[1001mm,1100mm];设每一段的gap1与gap2取值分别为gap1i与gap2i;利用kinect提供的手指轮廓获得指尖位置,以指尖为圆心画半径为20px的圆,交点距离为手指宽度fli,对应六段区域fli分别取10px、10px、12px、13px、14px、15px,令delta=3px,则可求出两圆半径:

gap1i=fli/2-delta

gap2i=fli/2+delta

3b、如图3、4所示,根据3a的结果对二值图像进行基于像素的分类:如图3(a)所述,若像素点p为圆心,gap1为半径的圆区域中手区域所占比例的大小不大于该圆面积的一半,判定像素点p在手部区域外;如图3(b)所述,若像素点p为圆心,gap1为半径的圆区域中手区域所占比例的大小大于该圆面积的一半,判定像素点p在手部区域内;如图3(c)所述,若像素点p为圆心,满足b的前提下,以gap2为半径的圆与手区域有四个交点,判定像素点p在手指区域;如图3(d)所述,若像素点p为圆心,满足b的前提下,gap2为半径的圆与手区域有两个交点,且交点间距离小于对应的手指的宽度fli,判定像素点p在指尖区域。

所述获得三维指尖位置包括如下步骤:

选取指尖区域内像素点p周围以3px为半径的圆在xy平面中的所有点进行取样,若采样点深度值与圆心点深度值差值大于10px,则舍去,计算剩余采样点深度值的均值作为圆心点的深度值。

所述三维指尖轨迹跟踪,包括如下步骤:

5a:建定卡尔曼滤波器预测指尖点位置:

首先,在每一帧中,测量指尖点在三维中的位置和速度,定义卡尔曼滤波器的状态向量为

xt=(x(t),y(t),z(t),vx(t),vy(t),vz(t))

其中,x(t),y(t),z(t)表示指尖点在三维中的坐标位置,vx(t),vy(t),vz(t)表示在每一帧中指尖点的速度;同理,定义卡尔曼滤波器的观察向量为

yt=(x(t),y(t),z(t))

观察向量表示指尖点在每一帧中的三维坐标;

列出卡尔曼滤波器方程:

xt+1=fxt+gwt

yt=hxt+vt

其中,f是状态转移矩阵,g是驱动矩阵,h是观察矩阵,wt是状态向量xt的系统误差,vt是观察误差,表示指尖点检测算法和kinect深度检测的误差:

其次,假设δt<0.05s,连续两帧之间的指尖点的运动近似看作是匀速直线运动;f,g和h定义如下:

最后,利用每个手指的卡尔曼滤波器,通过手指在t帧的位置预测手指在t+1帧时候的位置;

5b:预测指尖点和检测指尖点之间的匹配跟踪:

在当前帧,利用基于像素分类的指尖检测方法检测出当前帧的所有指尖点;同时,利用卡尔曼滤波器通过上一帧预测出当前帧指尖点所在的位置;但是实际上,基于像素分类的指尖检测存在一定的随机误差,经验预测也存在一定经验误差。为了减少计算量,同时考虑到操作者很少会将手指进行交叉,本发明将指尖点都按手中心点顺时针排列,这样在匹配的时候,手指的顺序就是固定的,因此整个搜索空间就从排列级降为组合级,可以较大的减小计算量。将预测指尖点位置和检测指尖点位置按手中心点顺时针排列后做组合匹配,找到匹配误差最小的组合作为最终结果,匹配误差的值是指尖点三维位置的欧氏距离的差值;之后,利用匹配误差最小的组合中的卡尔曼滤波器的预测位置来代替真实位置,如此一直跟踪下去。

5c:处理指尖数量的跟踪

指尖数量的变化有两种情况,第一种是,操作者确实改变了指尖的数量。第二种情况是,由于误差和运动模糊的原因,在某些帧某些指尖点检测不到或者误检测到多余的指尖点。

在第一种情况下,当指尖数量增加时,开启新的卡尔曼滤波器来跟踪它;当指尖数量减少时,终止相应的卡尔曼滤波器;

在第二种情况下,就不能这样处理。为了解决这个问题,本发明必须区分出两种指尖数量变化。由于第一种指尖数量变化是一种稳定的变化,那么在多帧之间,它将维持这种变化。相反,第二种指尖数量变化只是一种暂时、不稳定的变化,因此,在多帧之间它不能维持。根据这个差别,本发明采用如下步骤:首先,设置计时器用于当指尖数量开始变化时计算时间;其次,若计算时间大于某个阈值,计时器的阈值设置0.2s,则判断指尖数量变化是第一种情况;否则判断指尖数量变化是第二种情况,卡尔曼滤波器不变化,从而较大程度的提高了跟踪的稳定性。

以上所述仅是本发明的优选实施方式,应当指出:对于本技术领域的普通技术人员来说,在不脱离本发明原理的前提下,还可以做出若干改进和润饰,这些改进和润饰也应视为本发明的保护范围。

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