基于Kinect和OpenNI的手势捕获方法

文档序号:6518886阅读:202来源:国知局
基于Kinect和OpenNI的手势捕获方法
【专利摘要】基于Kinect和OpenNI的手势捕获方法,涉及计算机【技术领域】。第一步:首先我们定义手势的凹凸点,实线圆代表凸点,虚线圆代表凹点;第二步:人手张开代表要控制鼠标移动,凸点个数任意的情况下表示鼠标正常移动,此时在kinect能识别的范围内;第三步:大拇指张开,其他四个手指头闭合在一起代表按下左键,也就是当手势中凹点个数小于等于2并且大于等于1,凸点个数不限的情况下表示左键按下,如果连续2次闭合,即可实现双击左键;第四步:对于按下左键移动,我们可以先做按下左键的手势,保持手势然后移动手,就可以达到按下左键移动的效果。本发明解决了现有技术对于人们操作电脑时,不能够对手势信息输入很好的识别,无法达到准确操控的问题。
【专利说明】基于Kinect和OpenNI的手势捕获方法
【技术领域】
[0001]本发明涉及计算机【技术领域】,具体涉及手势识别、图像处理和人机交互的方法。
【背景技术】
[0002]最近几年的深度图研究给计算机视觉和图像处理带来了更多的信息,因为所获取的图像多了一个维度的,通常也称之为RGBD图。为了获得一定范围内物体的深度信息,物美价廉的深度信息获取传感器Kinect能较好的满足其要求。
[0003]Kinect是一种3D体感摄影机,具有即时动态捕捉、影像辨识、麦克风输入、语音辨识、社群互动等功能,它彻底突破人机的控制界限,可说是继鼠标和多点触摸技术之后的“第三次人机交互革命”,Kinect的诞生让未来的生活、娱乐方式发生很大的创意性的改变。为了能使Kinect正常工作,我们必须在PC上的开源驱动安装一个API——OpenNI。
[0004]OpenNI是一个多语言,跨平台的框架,它定义了编写应用程序,并利用其自然交互的API。OpenNI提供了一组基于传感器设备的API,以及一组由中间件组件实现的API。通过打破传感器和中间件之间的依赖,使用OpenNI的API编写应用程序就不需要额外的努力去处理由不同的中间件共存带来的问题。
[0005]在本发明中我们还采用openCV来绘制手的轮廓以及手部信息的提取。OpenCV是Intel?开源计算机视觉库,它由一系列C函数和少量C++类构成,实现了图像处理和计算机视觉方面的很多通用算法,加上其开源的特性,处理得当,不需要添加新的外部支持也可以完整的编译链接生成执行程序。

【发明内容】

[0006]本发明提供基于Kinect和OpenNI的手势捕获方法,本发明解决了现有技术对于人们操作电脑时,不能够对手势信息输入很好的识别,无法达到准确操控的问题。
[0007]为解决上述问题,本发明采用如下技术方案:基于Kinect和OpenNI的手势捕获方法,按照如下步骤操作:
[0008]第一步:首先我们定义手势的凹凸点,如附图1,实线圆代表凸点,虚线圆代表凹
占.[0009]第二步:人手张开代表要控制鼠标移动,也就是当手势中的凹点个数大于2个,凸点个数任意的情况下表示鼠标正常移动,如附图2,此时在kinect能识别的范围内,保持手势移动手,光标也能跟随移动;
[0010]第三步:大拇指张开,其他四个手指头闭合在一起代表按下左键,也就是当手势中凹点个数小于等于2并且大于等于1,凸点个数不限的情况下表示左键按下,如附图3,如果连续2次闭合,即可实现双击左键;
[0011]第四步:对于按下左键移动,我们可以先做按下左键的手势,保持手势然后移动手,就可以达到按下左键移动的效果。
[0012]经过测试,通过上述的解决方案能够很好的达到通过手势来控制鼠标光标的目标。
[0013]本发明的方法,可以实现了通过手势来操纵鼠标的选中,移动,单击和双击等操作。本发明运用在Kinect和OpenNI的基础上搭建的开发环境,将Kinect实时捕获的与其摄像头相距一定距离范围内(如附图2)手势的信息输入应用程序,应用程序对其进行分析,实时控制光标作出相应动作。要达到这种效果难点在于怎样定义手势对应的操作,以便于能很好的识别,从而达到准确操控的目的。
【专利附图】

【附图说明】
[0014]图1是本发明手势凹凸点的定义图;
[0015]图2是本发明代表要控制鼠标移动的手势的识别结果图;
[0016]图3是按下左键的手势的识别结果图;
[0017]图4是本发明软件流程图。
【具体实施方式】
[0018]下面用最佳的实施例对本发明做详细的说明。
[0019]如图1所示,使用Visual C++2010,针对微软的Kinect的驱动程序,搭配1.0.0.23版的OpenNI版写的。
[0020]1.首先,要以C++的形式使 用OpenNI的话,需要加入包含XnCppWrapper.h这个头文件。
[0021]2.初始化 context
[0022]要使用OpenNI,先建立一个型别为xn::Context的conext对象,用来管理整个OpenNI的环境状态以及资源;而在开始使用前,必须要呼叫它的成员函式Init O来进行初始化。在进行初始化的时候,所有OpenNI相关的模块会被读取、分析,直到调用Shutdown O这个函式,才会把所使用的资源释放出来。
[0023]3.建立和设定所需要的Production Node
[0024]在context初始化成功后,接下来是要建立所要使用的production node 了。本发明中应用程序要读取四种信息包括图像信息、手势信息、手部信息和深度信息等,所以这里要建立的四种 production node,它们是 xn::1mageGenerator、xn::GestureGenerator、xn::HandsGenerator、xn::DepthGenerator。建立一个 production node 的方法,贝U是先声明出他的对象,然后再去调用他的CreateO函式,并把context传入。
[0025]4.注册回调函数开始产生数据
[0026]在必要的Production Node都建立好了以后,接下来注册回调函数,需要注册的包括手势回调函数gestureCBHandle O和手部回调函式handsCBHandle O ,通过调用 gestureGenerator 的 RegisterGestureCallbacks ()函数和 handsGenerator的Regi SterHandCal Ibacks O函数完成注册,完成之后,通过context的成员函函数StartGeneratingAll O 来开始产生数据,并通过 StopGeneratingAllO 停止。
[0027]5.读取数据并处理
[0028]在开始产生数据后,循环调用WaitAndUpdateAllO函数,产生实时最新数据同时触发回调函数获取手部位置信息,然后读取各个不同的Production Node的数据,根据获取的位置绑定鼠标,控制光标的移动,然后结合深度图利用openCV提取手部区域,分析出手部的凹凸点个数,根据得到的点数,按照我们定义的手势规则去执行相应的动作,程序流程图如附图4。
[0029]最后应说明的是:显然,上述实施例仅仅是为清楚地说明本发明所作的举例,而并非对实施方式的限定。对于所属领域的普通技术人员来说,在上述说明的基础上还可以做出其它不同形式的变化或变动。这里无需也无法对所有的实施方式予以穷举。而由此所引申出的显而易见的变化或变动仍处于本发明的保护范围之中。
【权利要求】
1.基于Kinect和OpenNI的手势捕获方法,其特征在于,按照如下步骤操作: 第一步:首先我们定义手势的凹凸点,实线圆代表凸点,虚线圆代表凹点; 第二步:人手张开代表要控制鼠标移动,也就是当手势中的凹点个数大于2个,凸点个数任意的情况下表示鼠标正常移动,此时在kinect能识别的范围内,保持手势移动手,光标也能跟随移动; 第三步:大拇指张开,其他四个手指头闭合在一起代表按下左键,也就是当手势中凹点个数小于等于2并且大于等于1,凸点个数不限的情况下表示左键按下,如果连续2次闭合,即可实现双击左键; 第四步:对于按下左键移动,我们可以先做按下左键的手势,保持手势然后移动手,就可以达到按下左键移动的效果。
【文档编号】G06F3/01GK103593052SQ201310565854
【公开日】2014年2月19日 申请日期:2013年11月13日 优先权日:2013年11月13日
【发明者】戴元顺, 张帆 申请人:江苏中云科技有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1