手势识别 与Kinect -day one

不能荒废学业,打算好好研究自己的方向,跟的小导师研究的方向是手势识别,寒假第一天学习内容整理如下:

谈起手势识别技术,由简单粗略的到复杂精细的,大致可以分为三个等级:二维手型识别、二维手势识别、三维手势识别。

二维只是一个平面空间,我们可以用(X坐标,Y坐标)组成的坐标信息来表示一个物体在二维空间中的坐标位置,就像是一幅画出现在一面墙上的位置。三维则在此基础上增加了“深度”(Z坐标)的信息,这是二维所不包含的。这里的“深度”并不是咱们现实生活中所说的那个深度,这个“深度”表达的是“纵深”,理解为相对于眼睛的“远度”也许更加贴切。就像是鱼缸中的金鱼,它可以在你面前上下左右的游动,也可能离你更远或者更近。

前两种手势识别技术,完全是基于二维层面的,它们只需要不含深度信息的二维信息作为输入即可。就像平时拍照所得的相片就包含了二维信息一样,我们只需要使用单个摄像头捕捉到的二维图像作为输入,然后通过计算机视觉技术对输入的二维图像进行分析,获取信息,从而实现手势识别。

而第三种手势识别技术,是基于三维层面的。三维手势识别与二维手势识别的最根本区别就在于,三维手势识别需要的输入是包含有深度的信息,这就使得三维手势识别在硬件和软件两方面都比二维手势识别要复杂得多。对于一般的简单操作,比如只是想在播放视频的时候暂停或者继续播放,二维手势也就足够了。但是对于一些复杂的人机交互,与3D场景互动,就必须含有深度信息才行。

二维手型识别

二维手型识别,也可称为静态二维手势识别,识别的是手势中最简单的一类。这种技术在获取二维信息输入之后,可以识别几个静态的手势,比如握拳或者五指张开。其代表公司是一年前被Google收购的Flutter。在使用了他家的软件之后,用户可以用几个手型来控制播放器。用户将手掌举起来放到摄像头前,视频就开始播放了;再把手掌放到摄像头前,视频又暂停了。

“静态”是这种二维手势识别技术的重要特征,这种技术只能识别手势的“状态”,而不能感知手势的“持续变化”。举个例子来说,如果将这种技术用在猜拳上的话,它可以识别出石头、剪刀和布的手势状态。但是对除此之外的手势,它就一无所知了。所以这种技术说到底是一种模式匹配技术,通过计算机视觉算法分析图像,和预设的图像模式进行比对,从而理解这种手势的含义。

这种技术的不足之处显而易见:只可以识别预设好的状态,拓展性差,控制感很弱,用户只能实现最基础的人机交互功能。但是它是识别复杂手势的第一步,而且我们的确可以通过手势和计算机互动了,还是很酷的不是么?想象一下你忙着吃饭,只要凭空做个手势,计算机就可以切换到下一个视频,比使用鼠标来控制可是方便多了!

二维手势识别

二维手势识别,比起二维手型识别来说稍难一些,但仍然基本不含深度信息,停留在二维的层面上。这种技术不仅可以识别手型,还可以识别一些简单的二维手势动作,比如对着摄像头挥挥手。其代表公司是来自以色列的PointGrab,EyeSight和ExtremeReality。

二维手势识别拥有了动态的特征,可以追踪手势的运动,进而识别将手势和手部运动结合在一起的复杂动作。这样一来,我们就把手势识别的范围真正拓展到二维平面了。我们不仅可以通过手势来控制计算机播放/暂停,我们还可以实现前进/后退/向上翻页/向下滚动这些需求二维坐标变更信息的复杂操作了。

这种技术虽然在硬件要求上和二维手型识别并无区别,但是得益于更加先进的计算机视觉算法,可以获得更加丰富的人机交互内容。在使用体验上也提高了一个档次,从纯粹的状态控制,变成了比较丰富的平面控制。这种技术已经被集成到了电视里,但是还没有成为常用控制方式。

三维手势识别

接下来我们要谈的就是当今手势识别领域的重头戏——三维手势识别。三维手势识别需要的输入是包含有深度的信息,可以识别各种手型、手势和动作。相比于前两种二维手势识别技术,三维手势识别不能再只使用单个普通摄像头,因为单个普通摄像头无法提供深度信息。要得到深度信息需要特别的硬件,目前世界上主要有3种硬件实现方式。加上新的先进的计算机视觉软件算法就可以实现三维手势识别了。下面就让小编为大家一一道来三维手势识别的三维成像硬件原理。

1. 结构光(Structure Light)

结构光的代表应用产品就是PrimeSense的Kinect一代了。

这种技术的基本原理是,加载一个激光投射器,在激光投射器外面放一个刻有特定图样的光栅,激光通过光栅进行投射成像时会发生折射,从而使得激光最终在物体表面上的落点产生位移。当物体距离激光投射器比较近的时候,折射而产生的位移就较小;当物体距离较远时,折射而产生的位移也就会相应的变大。这时使用一个摄像头来检测采集投射到物体表面上的图样,通过图样的位移变化,就能用算法计算出物体的位置和深度信息,进而复原整个三维空间。

以Kinect一代的结构光技术来说,因为依赖于激光折射后产生的落点位移,所以在太近的距离上,折射导致的位移尚不明显,使用该技术就不能太精确的计算出深度信息,所以1米到4米是其最佳应用范围。

2. 光飞时间(Time of Flight)

光飞时间是SoftKinetic公司所采用的技术,该公司为Intel提供带手势识别功能的三维摄像头。同时,这一硬件技术也是微软新一代Kinect所使用的。

这种技术的基本原理是加载一个发光元件,发光元件发出的光子在碰到物体表面后会反射回来。使用一个特别的CMOS传感器来捕捉这些由发光元件发出、又从物体表面反射回来的光子,就能得到光子的飞行时间。根据光子飞行时间进而可以推算出光子飞行的距离,也就得到了物体的深度信息。

就计算上而言,光飞时间是三维手势识别中最简单的,不需要任何计算机视觉方面的计算。

3. 多角成像(Multi-camera)

多角成像这一技术的代表产品是Leap Motion公司的同名产品和Usens公司的Fingo。

这种技术的基本原理是使用两个或者两个以上的摄像头同时摄取图像,就好像是人类用双眼、昆虫用多目复眼来观察世界,通过比对这些不同摄像头在同一时刻获得的图像的差别,使用算法来计算深度信息,从而多角三维成像。

在这里我们以两个摄像头成像来简单解释一下:

 


双摄像头测距是根据几何原理来计算深度信息的。使用两台摄像机对当前环境进行拍摄,得到两幅针对同一环境的不同视角照片,实际上就是模拟了人眼工作的原理。因为两台摄像机的各项参数以及它们之间相对位置的关系是已知的,只要找出相同物体(枫叶)在不同画面中的位置,我们就能通过算法计算出这个物体(枫叶)距离摄像头的深度了。

多角成像是三维手势识别技术中硬件要求最低,但同时是最难实现的。多角成像不需要任何额外的特殊设备,完全依赖于计算机视觉算法来匹配两张图片里的相同目标。相比于结构光或者光飞时间这两种技术成本高、功耗大的缺点,多角成像能提供“价廉物美”的三维手势识别效果。

自己比较感兴趣的事手势识别与VR/AR

手势控制之于VR/AR

今年E3展上各大厂商推出的VR游戏都需要控制器,对于Hardcore游戏,游戏控制器是目前最优解决方案。游戏控制器的优势在于,控制反馈及时,组合状态多。缺点是与虚拟环境互动少,用户只能控制而不能参与。目前各大厂商的沉浸式VR体验只有量上的差距,但是加入手势控制与VR环境实现互动,将会把VR体验真实性再推到另一个高度。

特别的在VR游戏和AR领域,尤其是互动性更强的AR应用方面,游戏手柄和其它类型的控制器只能改变“状态”的特点,就成为了硬伤。举个例子来说,设计给iOS和Android这种触控设备的游戏(愤怒的小鸟,水果忍者等等),就不适合用手柄来玩,应为这些游戏就是为手控操作而设计的,我想你绝对不会想用手柄去切水果的。

当前市场上的3D游戏,之所以称为3D主要是因为其中模型是3D的,但是对比VR游戏的3D场景来说,深度场景开发的还不够。所以Oculus很有远见的看到了手势控制在VR/AR的重要性,不仅是可以将目前的手控操作游戏无缝移植到VR平台上来,更可以发挥三维手势的深度信息的优势,开发出新类型游戏(挖掘深度信息,体会子弹时间,空手夺白刃等)。手势识别增强了实现运动控制游戏,例如,通过执行方向盘的姿势开车,使用弹弓的姿态玩“愤怒的小鸟”,用手势来玩第一人称射击游戏等等。

如果说游戏手柄在VR游戏领域还有一席之地,那么在AR应用方面,手柄就完全不能胜任人机交互的任务了。在AR应用领域有丰富的人机互动内容,而这种互动是非常复杂的,只有手势操作才可以完成。以教育AR为例,我们希望使用AR来与用户互动,需要有选中、拖拽、拉伸等操作,使用手势完成这些动作是最自然的,而手柄完全无法应用。

Oculus此举表明了手势识别对VR和AR不言而喻的重要意义,但是手势识别和手势控制算法复杂,计算资源要求高,Pebbles Interfaces和LeapMotion目前都运行在PC平台。但是目前移动VR市场占有很大比例,人们日常也更希望可以在移动端享受VR体验,所以手势识别如何流畅地运行在移动VR设备上,将是未来的关注点。


下面是转载的Kinect的安装

-----------------------------------------------------------------------

      Kinect作为新一代的体感设备,小斤就不多介绍咯,微软日前也发布了相应的官方SDK,用以开发Kinect在PC上的应用。但就目前的情况而言,微软的KinectSDK只能在Win 7平台上使用,因此小斤选择了OpenNI作为Kinect开发的第一块踏脚石,它是目前已被广泛使用和认可的开源Kinect开发库。

 

准备

       首先大家需要下载三样东西:

       第一,OpenNI ,小斤在这里下载:http://www.openni.org/Downloads/OpenNIModules.aspx,选择OpenNI Binaries,注意要下载Development Edition,这样才有Sample可以测试查看。此外,源码也可以在GitHub上看到:https://github.com/OpenNI/OpenNI

       第二,SensorKinect,它就是Kinect的驱动了,可以在https://github.com/avin2/SensorKinect的Bin中找到。

       第三,NITE,这是PrimeSense 提供的中间件,可以分析Kinect读取的资料,输出人体动作等等。目前在http://www.openni.org/Downloads/OpenNIModules.aspx,选择OpenNI Compliant Middleware Binaries就能够下载了。

 

安装

【1】下载完毕后,先把Kinect放在一边,安装OpenNI。

(小斤安装OpenNI后,安装SensorKinect过程中,会弹出”Please install OpenNI version….”之类的错误,重启后再一次点击SensorKinect安装就解决了。有同学提示说,安装OpenNI的Windows用户一定要用管理员身份跑安装程序才行,没有的话有一部分文件无法写入,会导致之后的错误。)

 

【2】安装SensorKinect驱动,装完,把Kinect插上,此时系统就会自动开始搜索驱动了,如果没有搜索到,那么需要指定驱动目录了。假设SensorKinect默认安装在默认路径,指定驱动目录C:\ProgramFiles\Prime Sense\Sensor\Driver。

      驱动安装成功的话,在设备管理器中,会出现:


 


【3】安装NITE,装完后,由于NITE定义的320*240分辨率与SensorKinect的640*480不同,这边有个关键步骤,假设安装在默认路径:

      从"c:\Program Files\PrimeSense\Sensor\SampleXMLs\NITE\Data\" 里复制所有XML文件到 "c:\ProgramFiles\Prime Sense\NITE\Data\" 覆盖
  从"c:\ProgramFiles\Prime Sense\Sensor\SampleXMLs\OPENNI\Data" 里复制所有XML文件到 "c:\Program Files\OpenNI\Data" 覆盖


      此外,NITE是需要序列号的,但其官网免费提供了一个:0KOIk2JeIBYClPWVnMoRKn5cdY4=

       我们只要将"c:\Program Files\Prime Sense\NITE\Data\"目录下所有配置文件,把Licenses部分替换即可:

  <Licenses> 
     <License vendor="PrimeSense"key="0KOIk2JeIBYClPWVnMoRKn5cdY4="/> 
  </Licenses>

 

测试

【OpenNI】

       如果安装在默认路径下,测试程序可以在C:\Program Files\OpenNI\Samples\Bin\Release下找到,这里小斤使用的是NiViewer.exe和NiSimpleViewer.exe,都是显示深度图,如果运行没问题就可以咯。另外,NiUserTracker这个程序也很有趣,可以跟踪你的人体,前提是它捕捉到你人体后,你做出一个标定动作(举起双手)并维持一段时间。

      SimpleViewer:


       UserTracker:



        如果安装一切正常,但这些例子无法显示结果,可以关闭防火墙试试,某些防火墙的设置会阻拦OpenNI的组件读取摄像头


【NITE】

       同样的,如果安装在默认路径下,测试程序可以在C:\Program Files\OpenNI\Samples\Bin\Release下找到,小斤玩了下StickFigure,这个程序能在一个空间中显示出骨架。


VS开发环境

       要使用VS进行开发的话,需要配置include和lib路径。

       进入VS,点击菜单Tools,进入Options。

       在Projects and Solutions中,选择VC++Directories。

       假设OpenNI安装在默认路径下,则include files加入C:\Program Files\OpenNI\Include,Library files加入C:\ProgramFiles\OpenNI\Lib。

       这样VS的开发环境就配置好了。如果建立了OpenNI的开发项目,则还需要在项目属性——Linker——Input 中的Additional Denpendencies,加入openNI.lib。

       (以上配置在VS2010中有些出入,include和library可能被移到项目属性中配置)

 

       与OpenNI的Sample使用OpenGL不同,小斤之后的教程范例中,会使用OpenCV进行图像的输入输出,以简化程序(如果你看了OpenNI Sample的代码,会发现代码被OpenGL占了一大半)。大家可以在http://www.opencv.org.cn/上找到安装配置方法,小斤就不赘述了。(当然大家也可以直接无视范例中的OpenCV输出部分,把OpenNI读取的数据直接print出来。)


发布了6 篇原创文章 · 获赞 2 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/m0_37269455/article/details/54311576