上篇博文已经介绍了用Kinect获取彩色摄像头数据,当然,深景摄像头数据是一样的做法,获取图像数据的处理与其他颜色数据的处理大同小异,在此就不展开说明。本博文主要讨论用Kinect获取骨骼关节数据并绘制成图形。
Kinect SDK 中骨骼追踪有一些和其他对象不一样的对象结构和枚举。 在 SDK 中骨骼追踪相关的内容几乎占据了三分之一的内容,可见 Kinect 中骨骼追踪技术的重要性。下图展示了骨骼追踪系统中涉及到的一些主要的对象模型。有四个最主要的对象,他们 是SkeletonStream,SkeletonFrame,Skeleton 和 Joint 。下面将介绍这四个对象。
1 SkeletonStream 对象
SkeletonStream 对象 产生 SkeletonFrame 。从 SkeletonStream 获取 骨骼帧 数据和 从ColorStream 及 DepthStream 中获取数据类似。可以注册 SkeletonFrameReady 事件或 者AllFramesReady 事件通过事件模型来获取数据,或者是使用 OpenNextFrame 方法通过“ 拉”模型来获取数据。不能对同一个 SkeletonStream 同时使用这两种模式。如果注册 了SkeletonFrameReady 事 件 然 后 又 调 用 OpenNextFrame 方 法 将 会 返 回 一 个InvalidOperationException 异常。
/// <summary>
/// Active Kinect sensor
/// </summary>
private KinectSensor sensor;
this.sensor.SkeletonStream.Enable();
2 SkeletonFrame
SkeletonStream 产生 SkeletonFrame 对象。 可以使用事 件模型从事 件参数中调 用OpenSkeletonFrame 方法来获取 SkeletonFrame 对象,或者采用”拉” 模型调用 SkeletonStream的 OpenNextFrame 来获取 SkeletonFrame 对象。 SkeletonFrame 对象会存储骨骼数据一段时间。同以通过调用 SkeletonFrame 对象的 CopySkeletonDataTo 方法将其保存的数据拷贝到骨骼对象数组中。SkeletonFrame 对象有一个 SkeletonArrayLength 的属性,这个属性表示追踪到的骨骼信息的个数。
//Open the Skeleton frame using (SkeletonFrame skeletonFrame = e.OpenSkeletonFrame()) { // check that a frame is available if (skeletonFrame != null) { // get the skeleton data skeletons = new Skeleton[skeletonFrame.SkeletonArrayLength]; // get the skeletal information in this frame skeletonFrame.CopySkeletonDataTo(skeletons); } }
3 Skeleton
Skeleton 类定义了一系列字段来描述骨骼信息, 包括描述骨骼的位置以及骨骼中关节可能的位置信息。骨骼数据可以通过调用 SkeletonFrame 对象的 CopySkeletonDataTo 方法获得Skeleton 数组。CopySkeletonDataTo 方法有一些不可预料的行为,可能会影响内存使用和其引用的骨骼数组对象。产生的每一个骨骼数组对象数组都是唯一的。
例如:
Skeleton [] skeletonA = new Skeleton [frame.SkeletonArrayLength]; Skeleton [] skeletonB = new Skeleton [frame.SkeletonArrayLength]; frame.CopySkeletonDataTo(skeletonA); frame.CopySkeletonDataTo(skeletonB); Boolean resultA = skeletonA[0] == skeletonB[0]; //false Boolean resultB = skeletonA[0].TrackingId == skeletonB[0].TrackingId;//true
上面的代码可以看出, 使用 CopySkeletonDataTo 是深拷贝对象, 会产生两个不同的 Skeleton
数组对象。
几个主要的属性:TrackingID,TrackingState, Position,ClippedEdges,Joints
TrackingID
骨骼追踪引擎对于每一个追踪到的游戏者的骨骼信息都有一个唯一编号。当 Kinect 追踪到了一个新的游戏者,他会为其分配一个新的唯一编号,编号值为0表示这个骨骼信息不是游戏者的,他在集合中仅仅是一