分享

Kinect在Unity平台上的开发实例

 鸿蛟家平 2017-08-22
    摘 要:文章介绍了Kinect结合Unity的交互方法,以及利用手势移动场景、控制人物动作以及控制模型的开发实例,为Kinect与Unity的程序开发提供一个参考。
中国论文网 http://www./8/view-6157728.htm
  关键词:Kinect;Unity;手势识别
  中图分类号:TP391.41
  Kinect是一种功能强大的3D体感摄像机,是微软公司于2009年公布的XBOX360的体感周边外设,它导入了即时动态捕捉、影像辨识、麦克风输入、语音辨识、社群互动等功能,给人耳目一新的感觉。玩家可以通过手势或语言指令来操作Xbox 360的系统界面,也能通过全身上下的动作,用身体来玩游戏,而不是传统的手持或脚踏控制器。它的出现,开创了互动娱乐的新纪元,带给玩家“免控制器的游戏与娱乐体验”。
  图1 Kinect实物图
  Kinect一共有三个镜头:RGB彩色摄影机,红外线发射器和红外线 CMOS 摄影机所构成的3D结构光深度感应器,同时还具备有追焦功能。Kinect还内建了阵列式麦克风,可以在嘈杂的环境下,由多组麦克风同时收音,通过比对消除杂音。它可以同时获取彩色影像、3D深度影像、以及声音讯号。
  目前,Kinect已不仅局限于游戏控制当中,而在机器人视觉与控制,医疗领域,计算机应用,电子商务领域及教育领域都有其应用。例如,Kinect试衣镜,运动捕捉,3D建模,机械控制,虚拟乐器,外科手术应用等。同时,Kinect应用技术的开发还只是初步的发展,但它已表现出广阔的发展空间和强大的生命力。
  1 Kinect相关应用
  Kinect主要是以识别功能为主,它既可以识别人体骨架,又同时具备语音识别功能。正是由于其具有成本低、重量轻、精度高以及功能强等优点,当今社会人们更多的将其与虚拟现实技术或是增强现实技术结合在一起,从而使其可以在军事、医疗、娱乐以及教育等各个领域中充分的发挥作用。
  Kinect在娱乐领域的应用最为广泛,微软在Xbox上推出的Kinect Sports,Kinect Adventures,Kinect Joy Ride等,以及结合Kinect的水果忍者,超级玛丽等。Kinect不仅增加了游戏者在游戏过程中的带入感,同时也可以锻炼身体。
  魏尚基于kinect深度摄像头对三维人脸识别技术进行了研究。他认为二维图像人脸识别技术由于受到各种条件的限制,无法满足当前人们的需求。因此三维人脸识别技术具有非常大的发展空间。通过使用价格低廉的kinect并使用和主成分分析方法可以起到降低成本且提高质量的效果。
  Kinect的识别技术也可以被应用于机器人身上。用kinect作为机器人的头部,从而降低机器人的制作成本同时提高其识别精度。甚至在不久的将来,该项技术也可以被广泛应用于无人驾驶领域。
  况鹰研究了三维虚拟试衣,实现了让消费者不需试衣就能见到真实的试衣效果,消费者甚至可以通过手势选择不同的衣服试穿。该项虚拟技术也可以被应用于视频会议。
  Kinect在医学方面实现了代替医生做尸检的工作,例如瑞士Bern大学的Virtopsy项目。该项目通过开发ofxKinect系统,制作体感软件。从而使尸检工作更加卫生、省时。而华盛顿大学的学生们通过对Kinect的改造,实现了医生远程遥控手术技术。但是为了精确治疗,避免医疗事故的发生,该项技术仍在改进。而目前为止应用较为广泛的则是通过Kinect体感控制查看患者的影像资料,这样可以降低手术室的人员流动,提高工作的准确性和效率。
  王康将Kinect与电子白板结合使用,研究出了体感交互式电子白板,极大的提高了教学质量和效率。钱鹤庆将Kinect与教学辅助工具相结合,通过真实的演示如化学分子结构等,提高学生的学习兴趣。而目前已经投入使用的Kinect技术则是将其与投影仪相结合,实现用手势或语音控制投影内容。
  目前,Kinect技术本身仍有待改进,而基于其的应用更只是冰山一角。尽管如此,Kinect也已经向我们展示出了其广泛的应用范围。随着人们需求的不断改变以及Kinect技术的不断完善,Kinect在各个领域的应用都会向前迈出一大步,并且在人机交互领域将会得到更为广泛的应用。
  2 Kinect在Unity平台上的开发实例
  2.1 Unity
  Unity是一个多平台综合型的游戏开发工具,可用于创建三维视频游戏、建筑可视化、实时三维动画等,是一个全面整合的专业游戏引擎。编辑器可以运行在Windows或Mac OS X环境下,并且可以将游戏发布至Windows、Mac、Wii、iPhone、Windows Phone 8和Android等平台,也可以通过Unity Web Player插件来发布网页游戏。
  Unity的脚本可由C#或JavaScript语言编写。
  目前,Kinect结合Unity的相关技术已经取得了一些初步成果,例如卡耐基梅隆的KinectWrapper,以及OpenNI提供的OpenNIUinityToolkit等一些Kinect与Unity交互的中间件,以及发布在AssetStore上的应用Kinected,Kinect Hand Game Starter Kit等。
  2.2 Kinect结合Unity角色控制器
  Unity中的Character Controller角色控制器包括第一人称控制器(First Person Controller)和第三人称控制器(3rd Person Controller)。角色控制器主要用于第三人称或第一人称的游戏主角控制,Kinect结合Unity角色控制器的目的是让用户能通过简单的手势及动作来控制人物角色,代替键盘,鼠标等设备。
  在Unity的角色控制器中,与用户的交互主要使用GetAxisRaw方法,它获取水平轴和垂直轴以控制角色前进,后退以及左转和右转的动作,对于键盘和控制器它的取值范围在-1到1之间。当输入不平滑,键盘输入必是-1,0或1。通过获取空格按钮,跳使用GetButton方法。本实例的主要思想是根据Kinect获取到的骨骼数据以及手势和动作的设计,编写脚本代替这两个方法实现对人物的控制和场景转换。使用的素材有Andrew DeVine的KinectSDK / Unity3D Interface中间件,Geartech Games的Demo Industrial Arena环境场景,以及Unity的Character Controller角色控制器。以第三人称控制器为例,步骤如下:   首先,打开Demo Industrial Arena的场景Scene,导入Character Controller,在Scene中加入人物(3rd Person Controller的Prefab预制件),并对人物添加ThirdPersonCamera(摄像头)和ThirdPersonController(角色控制)这两个脚本,并在Inspector中设置相应的动作及数值。
  对人物添加KUInterface脚本,并在脚本中定义flaot型变量v(Vertical)和h(Horizontal),及bool型变量j(Jump),分别代表前进后退以及左转右转和跳跃。
  public float h=0.0f;
  public float v=0.0f;
  public bool j=false;
  定义需要的骨骼以及参数。
  private bool LastFrameHandRightUp=false;
  private Vector3 HandRight=new Vector3(0,0,0);
  private Vector3 ShoulderRight=new Vector3(0,0,0);
  private Vector3 Head=new Vector3(0,0,0);
  在Unity中,每一帧都会执行一次Update函数中的内容,当Update函数第一次被执行前会执行Start函数。因此,在Actions函数中编写相应的动作,并且在Upate中调用Actions中的内容。
  在Actions中,对h,v,j数值初始化,即分别将h,v赋值为0,j为false。
  v=0.0f;
  h=0.0f;
  j=false;
  通过GetJointPos方法来获取Head,HandRight及ShoulderRight这三个骨骼位置。
  HandRight=GetJointPos(KinectWrapper.Joints.HAND_RIGHT);
  ShoulderRight=GetJointPos(KinectWrapper.Joints.SHOULDER_RIGHT);
  Head=GetJointPos(KinectWrapper.Joints.HEAD);
  定义了4个动作,分别是前进,左转,右转,跳跃,需要用到头部,右手,右肩这三个骨骼数据。将右手伸出并与肩部保持相应的高度,人物前进,同时赋值v为1;在前进状态下,若将右手向左挥动,人物向左转,同时赋值h为-1;若将右手向右挥动,则人物向右转,同时赋值h为1;若右手向上挥动,人物跳跃,赋值j为true。
  if(HandRight.y-ShoulderRight.y>-10){
  v=1.0f;
  if(HandRight.x-ShoulderRight.x > 200)
  h=1.0f;
  if(HandRight.x-ShoulderRight.x < -200)
  h=-1.0f;
  if(HandRight.y-Head.y > 150){
  if (!LastFrameHandRightUp)
  j=true;
  LastFrameHandRightUp = true;}}
  最后,在ThirdPersonController脚本中,通过GetComponent方法访问KUInterface中变量h,v及j。将脚本中GetAxisRaw,GetButton方法进行替换。
  程序开发完成后经过测试,效果令人满意,通过右手的各种手势分别控制了人物的4个动作,操作起来自然协调,无生疏感,表现出Kinect的实用性。
  图2 Kinect结合Unity角色控制器
  2.3 Kinect Wrapper的人物模型控制
  Kinect Wrapper的人物模型控制基于卡耐基梅隆的Kinect Wrapper中间件,使用了Mixamo的Male Character Pack人物模型包。
  卡耐基梅隆的KinectWrapper是一个非常实用的Kinect与Unity交互中间件,它包含以下一些脚本和示例:
  KinectExample这是一个示例场景。
  Kinect_Prefab这个预制件包含了所有必需的脚本,但不包括控制器。
  KinectModelControllerV2这个脚本将操纵模型中的骨骼,实现人物模型控制。
  DisplayDepth获取深度图像。
  DisplayColor 获取RGB图像。
  以及KinectPointMan,KinectPointController,KinectRecorder,KinectEmulator,KinectSensor,DeviceOrEmulator,SkeletonWrapper,DepthWrapper和KinectInterop等脚本。
  本实例的目的是对模型骨骼和Kinect获取的骨骼数据进行对应,使模型能模仿用户的动作,实现人物模型控制。其步骤如下:
  在场景中加入Kinect_Prefab和人物模型,对模型添加模型控制脚本,即KinectModelControllerV2,在Inspector中将Kinect获取到的骨骼与模型的骨骼数据对应,其中的Sw(Skeleton Wrapper)选择Kinect_Prefab。
  在程序测试中,人物模型能够非常相似的模仿出用户的动作,具有很强的娱乐性。
  图3 Kinect Wrapper的人物模型控制
  3 结束语
  本文介绍了Kinect与Unity结合的开发实例,利用Kinect通过手势和动作进行人机交互以及游戏的开发,为Kinect和Unity的开发者提供一个参考。同时也说明Kinect具有很大的发展前景以及在各个领域都能广泛应用。
  参考文献:
  [1]魏尚.基于Kinect深度图像的三维人脸识别技术研究[D].天津师范大学,2012.
  [2]况鹰.基于Kinect运动捕获的三维虚拟试衣[D].华南理工大学,2012.
  [3]王康.基于Kinect的体感交互式电子白板初探[J].中国现代教育装备,2012(06):29-30.
  [4]钱鹤庆.应用Kinect与手势识别的增强现实教育辅助系统[D].上海交通大学,2011.
  作者简介:姚翠莉(1984-),女,河南西华人,工程师,博士研究生,研究方向:图像处理与模式识别;袁�(1993-),男,广西灵川人,本科,研究方向:图像处理与模式识别;彭飞翔(1993-),男,安徽界首人,本科,研究方向:图像处理与模式识别;罗会哲(1993-),男,广东深圳人,本科,研究方向:图像处理与模式识别;邓亚仙(1992-),女,辽宁沈阳人,本科,研究方向:图像处理与模式识别;蔡群(1993-),女,朝鲜族,吉林长春人,本科,研究方向:图像处理与模式识别。
  作者单位:大连理工大学创新实验学院,辽宁大连 116023  

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多