马老师的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,就写到这里了,我的理解是这样的,如果我的理解有什么问题,欢迎提出来。

作者: Rain. 发表于 2011-07-01 13:22 原文链接

推荐.NET配套的通用数据层ORM框架:CYQ.Data 通用数据层框架