zoukankan      html  css  js  c++  java
  • 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控件。

    本博客所有博文,若无专门说明皆为原创,转载请注明作者和出处!
  • 相关阅读:
    Leetcode 50.Pow(x,n) By Python
    Leetcode 347.前K个高频元素 By Python
    Leetcode 414.Fizz Buzz By Python
    Leetcode 237.删除链表中的节点 By Python
    Leetcode 20.有效的括号 By Python
    Leetcode 70.爬楼梯 By Python
    Leetcode 190.颠倒二进制位 By Python
    团体程序设计天梯赛 L1-034. 点赞
    Wannafly挑战赛9 C-列一列
    TZOJ Start
  • 原文地址:https://www.cnblogs.com/ifinver/p/3032701.html
Copyright © 2011-2022 走看看