(转自: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中。 (其中*代表32或64).
KinectInteraction Managed API
Managed API提供了交互帧,包括如下信息:手指示器的位置,指向的控件,手的状态等。同时API提供了与UX框架的接入点InteractionClient.
KinectInteraction 控件
构建C#/WPF应用程序应从KinectRegion控件开始。KinectRegion提供了一个Canvas用以包含其他的KinectInteraction控件,例如KinectTileButton,KinectScrollViewer等。一个KinectRegion控件与一个Kinect sensor相关联。一个应用程序可以定义多个KinectRegion,但活动的KinectRegion在结构上不可以嵌套。KinectRegion之间可以有重叠。KinectRegion能够处理KinectInteraction架构低层发起的事件。这些事件描述跟踪到的手的状态变化,手进入或离开KinectRegion或Kinect控件。