浅谈KINECT FOR WINDOWS SDK之深度数据

浅谈KINECT FOR WINDOWS SDK之深度数据

马老师的Kienct系列写的很不错,等他的Depth Data也等了好几天了,不见其更新。于是自己在空闲时间研究了下。特发此文,与各位园友分享。

如果您对Kinect for Windows开发不了解的话,建议您点击下马老师的博客,或者观看相关视频进行了解。

在C#中,获得Depth Data有两种方式。当然大家最喜欢用的是基于事件的这一种。

?
Runtime nui = new  Runtime();   
      private  void  Window_Loaded( object  sender, RoutedEventArgs e)
      {    
          nui.Initialize(RuntimeOptions.UseDepthAndPlayerIndex | RuntimeOptions.UseSkeletalTracking);
          nui.DepthFrameReady += new  EventHandler<ImageFrameReadyEventArgs>(DepthFrameReady);
          nui.DepthStream.Open(ImageStreamType.Depth, 2, ImageResolution.Resolution320x240, ImageType.DepthAndPlayerIndex); 
      }  
      void  DepthFrameReady( object  sender, ImageFrameReadyEventArgs e)
      {
          
      }

在这里,我们只讨论基于RuntimeOptions.UseDepthAndPlayerIndex的景深数据。

ImageFrameReadyEventArgs中返回了一个ImageFrame类实例,ImageFrame类中包含了PlanarImage类,PlanarImage中包含了一个Bits属性。它是一个bytes数组。

这个数组包含了每一个像素的数据信息。其规则是,从左到右,从上到下。

数组中每一项包含了距离和PlayerIndex信息(这是仅仅基于RuntimeOptions.UseDepthAndPlayerIndex的景深数据,其他类型的枚举可能不包括PalyerIndex数据)

数组中每一项包含2个byte,总计16 bit


低位的后3位是PlayerIndex的数据,理论上,应该支持2^3个PlayerIndex,可是Kinect最多可达6个可能的值,目前仅支持3个。

其余的13位就是景深数据,在计算距离时,要移掉后面3位,高位要左移5位,然后相加或者取或运算。

公式为:Bytes[1] * 2^5 + Bytes[0] / 2^3(右移3位,相当于除以2^3,一定要取整)

那么理论上支持最大的距离是8192毫米,即8.192米。

当然,公式也可以这样写:Bytes[0] >> 3 | Bytes[1] << 5

OK,就写到这里了,我的理解是这样的,如果我的理解有什么问题,欢迎提出来。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值