Kinect NUI 概述(三)

来源:互联网 发布:nodejs连接mysql 编辑:程序博客网 时间:2024/06/09 15:52

NUI 骨骼追踪

NUI骨骼API可提供站立在传感器前的多至2人的位置及方向信息。提供给应用的数据被编码为关节点几何,称为骨骼,如图3所示。骨架代表了用户的当前位置和姿势。为了使用骨骼数据,应用必须在NUI初始化的时候设置,并开启骨骼追踪。

图3.骨骼相对人体位置

检索骨骼信息

应用代码通过获取图像数据的方式获取最新的骨骼数据帧:通过传递缓冲区给帧检索方法。应用可以采用轮询模式或者事件模式。开发者必须选择一种模式,不能同时使用两种模式。

使用轮询模式:

C++代码调用INuiSensor::NuiSkeletonGetNextFrame方法检索骨骼帧。

C#代码调用SkeletonStream.OpenNextFrame方法。

使用事件模式:

C++代码传递事件句柄给INuiSensor::NuiSkeletonTrackingEnable方法。

当新的骨骼数据产生,事件触发。等待线程被唤醒,通过调用INuiSensor::NuiSkeletonGetNextFrame方法获取骨骼数据,同时,事件标识被NUI Skeleton API重置。

C#代码通过hook KinectSensor.AllFramesReady事件到对应的事件句柄上使用事件模式。当新帧产生,事件触发,句柄运行,调用NuiSkeletonGetNextFrame获取帧。

骨骼追踪引擎处理深度帧数据计算底面确定小节描述的裁剪底面。如果应用在初始化时就确定使用骨骼追踪,无论骨骼是否出现在帧内,骨骼追踪引擎每次处理深度数据都会触发一个骨骼帧。使用底面裁剪值的应用可以检索骨骼帧。返回的骨骼帧包含对应深度图像的时间戳以便应用能够匹配深度图像数据。

主动及被动追踪

骨骼追踪引擎提供了kinect视野范围内1至2个玩家的骨骼追踪。当玩家被主动追踪,调用获取骨骼帧将返回玩家完整的骨骼数据。被动追踪由kinect自动提供多至4个玩家的骨骼追踪。被动追踪的玩家,骨骼数据仅包含有限的玩家位置信息。缺省状况,骨骼追踪系统最先发现的两个玩家采用主动追踪,如图4所示。

图4.主动追踪两个玩家

运行时在骨骼帧内返回的骨骼数据,包含一个骨骼数据结构(skeleton data structures)数组,数组内每一元素对应骨骼追踪系统识别的骨骼数据。并非每一个骨骼帧都包含骨骼数据,当骨骼追踪开启,运行时每次处理一个深度帧都会触发一个骨骼事件。

对于所有返回的骨骼,包含下面的数据:


  • 连接骨骼的当前追踪状态:
    • 对于被动追踪,该值仅表示位置;
    • 对于主动追踪,该值表示追踪的骨骼。
  • 玩家运动时被赋予的唯一的追踪ID:保证视野内的骨骼数据对应到正确的玩家。只要追踪ID仍被使用,它就被保存在骨骼数据数组相同的索引位置。如果数组内特定索引位置内的ID改变,表示下述两事件之一的发生:追踪的玩家离开视野,另一玩家进入,并开始追踪;或者追踪的玩家离开视野,再次进入,追踪重启。
  • 表示玩家中心的位置(Vector4类型)。该值仅在被动追踪时可用。
  • 对于主动追踪,返回数据包括全部骨骼数据;
  • 对于被动追踪,仅返回基本位置信息和标识信息,无骨骼数据。

NUI转换

本节简述和骨骼追踪协作的相关系统及提供空间转换的API。

深度图像空间

深度地图的图像帧有640×480, 320×240, 和 80×60像素尺寸。每个像素值代表了从摄像头平面到最近对象的x、y坐标面上以毫米为单位的笛卡尔距离,如图5所示。0表示传感器在该位置范围内没有发现任何对象。

图5.深度流值

图像帧的x、y坐标不代表空间的物理单元,它们表示深度图像传感器上的像素点。x、y坐标的含义依赖特定光学图像传感器的规范。为论述方便,投影空间特指深度图像空间。

骨骼空间

玩家骨骼位置用x、y、z坐标表示。不同于深度图像空间,坐标单位是米。x、y、z轴是深度传感器的机身座标轴,遵循右手坐标规则,Kinect传感器放置原点,z轴方向即是传感器指向的方向,y轴正向朝上,x轴正向朝左(从Kinect Sensor方向看),如图6所示。为便讨论,坐标表达式特指骨骼空间。

图6.骨骼空间坐标系统

kinect传感器的放置会影响感应到的图像。例如,放置面不水平,或者感应器已垂直旋转优化传感器的视角,这时骨骼空间的y轴不再垂直地面,平行重心线,导致图像内的人物不再垂直站立,而是斜立。

底面确定

每一个骨骼帧都包含一个底面裁剪面向量,包含了估算底面等式的系数。骨骼追踪系统为每帧更新估算,并用此作为裁剪面删除背景和用户段数据。平面公式如下:


Ax + By + Cz + D = 0

这里:


A = vFloorClipPlane.x
B = vFloorClipPlane.y
C = vFloorClipPlane.z
D = vFloorClipPlane.w

等式规范化后,D的空间意义是摄像头距离底面的高度,单位米。底面并非总是可见,这种情况下,底面裁剪面是一个0向量。在本地接口NUI_SKELETON_FRAME内的成员vFloorClipPlane和受管接口的SkeletonFrame.FloorClipPlane的属性都可以得到底面裁剪面。



骨骼镜像

缺省状态下,骨骼系统总是镜像被追踪玩家。对于使用头像来表示用户的应用,如果需要显示朝向屏幕的面孔,镜像是必须的。然而,如果头像面朝玩家,镜像则呈现了背向头像。对于这种需求,应用可以通过对包含骨骼位置数组内的值进行向量转换得到镜像。开发者必须选择合适的映像面。

0 0
原创粉丝点击