Kinect SDK 1.7新特性

(转自:http://blog.csdn.net/huang9012/article/details/8750920

inect for Windows 1.7

 

KinectInteraction 是一系列特性的集合,它使得kinect应用程序能够基于手势进行交互。KinectInteraction并不是Kinect for Windows SDK 1.7的一部分,需要通过Kinect for Windows Toolkit 1.7获得。

KinectInteraction提供如下特性:

能够识别至多两名用户,并且识别和跟踪他们的“主”交互手。

能够检测用户手的位置及状态。

能够检测“握拳”及“松开”状态。

能够检测“按压”操作。

能够提供用户指向的控件的信息。

工具包同时包含native API  managed API, 以及一组C#/WPF交互控件,使得开发人员可以轻松地将以上的新特性集成到应用程序中。

 

架构

KinectInteraction特性结合了深度数据,骨骼数据及相关算法对手进行跟踪,并进行手势的识别。Native API提供了用户识别,手的跟踪,手的状态(跟踪状态,交互状态等)以及按压指向(press targeting)。同时还提供了新的数据流interaction stream,可以“冒泡”手势识别事件。Managed API (C# API)提供同上功能。C#/WPF控件使得开发人员可以构建交互应用程序,包括交互区域(interactive regions),握拳状态下可滑动的列表控件(grip-scrollable lists),可以响应按压手势(push)的按钮控件。

 

 

 

KinectInteraction概念

KinectInteractions的新特性中有很多概念也许开发人员第一次遇到,充分理解这些概念对理解KinectInteractions特性能做什么不能做什么会有很好的帮助。

KinectInteraction控件的设计使得基于Kinect的应用程序同时可以兼容键盘和鼠标的控制。

 

手的跟踪

第一个是手的跟踪。如果你之前曾用过Kinect for Windows SDK,一定对骨架跟踪不会陌生,SDK通过识别视野中的人进而为每个人构建相应的骨架。在KinectInteraction中骨架跟踪并没有得到增强,但将其与深度信息进行结合便实现了对手的跟踪。

除了手的跟踪之外,KinectInteraction还可以检测并报告出当前手以及胳膊的状态,例如握拳,放开,按压等等,以支持自然的手势交互。基于此用户可以通过非触摸的方式与一个基于kinect的应用进行交互。交互距离在近距模式(near mode)下为0.4米,正常模式(normal mode)下为3-4米。为了能够对手进行跟踪一定要保证kinect sensor能够“看到”手,初始时尽量保持手掌张开的状态,交互时尽量让手面对摄像头。

 

物理交互区域(physical interaction zone, PhIZ

物理交互区域将用户前面的3维物理空间映射到开发人员要使用的3维空间。每个用户每只被跟踪到的手都会有这样的一个物理交互区域(最多支持两个用户), 在这个区域内大部分的交互都被支持。

 

什么会被跟踪?

交互层可以跟踪到一位用户或两位用户的两只手。如果有两位用户存在,首先和系统进行交互的用户被指定为“主”用户。“主”用户拥有对系统的交互控制权,直到系统认为该用户已不再使用应用程序。尽管主用户的两只手都会被跟踪,但只有当前进行交互的那只手被指定为“主”交互手并拥有控制权。用户可以在两只手之间进行“主”交互手的切换,把当前的“主”交互手放低并抬起另一只手进入物理交互区域。应用程序能够告知交互层哪位用户是“主”用户,基于骨架跟踪的数据,用户会被赋予一个用户ID

 

手的状态

对每只手都会一个手的状态,包括这只手属于哪个用户,是否为“主”交互手,是否是“交互的”(interactive),是否是握拳,松开,按压或其他状态。

 

跟踪状态(tracked) v.s. 交互状态(interactive)

手处于跟踪状态是指KinectInteraction正在对其进行观察并寻找可能的交互行为。而交互状态指的是当前手已经被跟踪并在物理交互区域内,KinectInteraction正在观察它的交互行为。

 

The User Viewer

KinectInteraction控件中有一个UserViewer,这个小窗口获取深度数据,能够显示Kinect sensor“看到“的视野,创建KinectRegion时这个控件自动被创建。

 

手指示器(hand pointer

手指示器可以在物理交互区域内标识当前手的位置。如果在应用程序中光标的可见性被设为“On”,这个指示器就可以通过KinectCursor来使用。当手位于KinectRegion内时,光标呈现出”手“的形状;如果手握成拳手,光标会相应地改变为”握拳的形状。

为了提供流畅的交互体验,一旦手指示器在某个KinectInteraction控件上停留超过一定时间,就会认为该控件“捕获”(captured)了手指示器,直到用户将手移出控件。通过手指示器以及捕获其的控件都可以获得”capture“属性的值。

 

交互方式

KinectInteraction提供了几种交互方式,包括:握拳及松开,按压,滑动。

握拳及松开

用户伸开手掌正对摄像头然后握拳,这个操作将被识别为“握拳“手势,并将其与相应的控件进行绑定直到用户松开拳头。”放开“手势指的是打开握起的拳头。这两个手势可以与KinectScrollViewer控件结合使用,使得用户可以自然地进行”滑动“操作。在ControlBasics例子中展示了它的用法,例子同时还展示了通过”翻页“实现滑动操作。

按压

按压(或“推“)手势的使用是用户保持手掌张开面对摄像头,初始时胳膊并未完全伸展,然后冲着摄像头的方向伸直胳膊,这表示一个按压操作。该手势同样可以与ScrollViewer结合使用,可以参考InteractionGallery例子。

滑动

ScrollViewer控件支持用户进行滑动操作,尤其是数据太多一屏显示不了的情况。在ControlBasics例子中展示了握拳滑动的实现,在InteractionGallery例子中展示了翻页滑动的实现。

 

交互流

交互流提供了交互帧的流数据,与深度数据,骨架数据类似。通过对交互帧进行处理,就可以获得应用程序交互所需要的信息,例如手的位置,是否是握拳状态或松开状态,以及当前用户指向的控件是哪个,等等。

 

KinectInteraction Native API

nativeAPI提供2个接口:

l  INuiInteractionStream, 提供所有计算的交互(computed interactions,同时可以用它来访问手指示器以及跟踪到的用户的信息。INuiInteractionStream的基本模型是交互帧的集合,构建于深度数据和骨架数据。交互帧提供了如下信息,例如手指示器的相关信息,手指向的控件,手的状态(中立neutral 握拳,松开)等。对于手指向的控件,交互帧还提供当前手的光标是否为按压状态。

l  INuiInteractionClient, 提供了一个方法GetTargetedControlInfo可以报告当前用户正在指向哪个控件。

API 还提供了类NuiCreateInteractionStream用于创建和初始化交互流。这些接口定义在KinectInteraction170_*.dll中。 (其中*代表3264).

 

KinectInteraction Managed API

Managed API提供了交互帧,包括如下信息:手指示器的位置,指向的控件,手的状态等。同时API提供了与UX框架的接入点InteractionClient.

  • HandPointer 包含关于手的所有信息:是否为“主“交互手,相对于物理交互区域的坐标,胳膊伸展性(extension,用于判断用户是否在做一个“按压”手势),手的类型,手指示器的状态(按压,握拳,等)
  • IInteractionClient:提供了UX框架的接入点,包含了打开下一个交互帧的方法,以及交互帧是否ready的事件。
  • InteractionFrame:与其他数据(depth stream, skeleton stream)类似,提供当前交互的状态,以及指向手指示器和用户信息的指针。
  • InteractionInfo:提供了当前用户指向的控件的信息,包括该控件是被“握”住还是“按压”。
  • InteractionStream:该类负责管理交互流,为交互帧提供数据。
  • KinectRuntimeExtensions:该类提供了用于创建和初始化交互流的方法。同时还提供了一个方法可以访问手指示器的raw data(为了使手与控件的关联更清晰,HandPointer类提供的数据对raw data进行了处理(clean up))
  • UserInfo:该类提供的信息包括该用户是否为主用户,与该用户对应的HandPointer对象的指针。

 

KinectInteraction 控件

KinectRegion

构建C#/WPF应用程序应从KinectRegion控件开始。KinectRegion提供了一个Canvas用以包含其他的KinectInteraction控件,例如KinectTileButtonKinectScrollViewer等。一个KinectRegion控件与一个Kinect sensor相关联。一个应用程序可以定义多个KinectRegion,但活动的KinectRegion在结构上不可以嵌套。KinectRegion之间可以有重叠。KinectRegion能够处理KinectInteraction架构低层发起的事件。这些事件描述跟踪到的手的状态变化,手进入或离开KinectRegionKinect控件。

本博客所有博文,若无专门说明皆为原创,转载请注明作者和出处!
原文地址:https://www.cnblogs.com/ifinver/p/3032701.html