Kinect开发之获取骨骼关节数据并绘制成火柴人

   上篇博文已经介绍了用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表示这个骨骼信息不是游戏者的,他在集合中仅仅是一

  • 3
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值