Kinect开发学习笔记之(六)带游戏者ID的深度数据的提取
Kinect开发学习笔记之(六)带游戏者ID的深度数据的提取
zouxy09@qq.com
http://blog.csdn.net/zouxy09
我的Kinect开发平台是:
Win7x86 + VS2010 + Kinect for Windows SDK v1.6 + OpenCV2.3.0
开发环境的搭建见上一文:
http://blog.csdn.net/zouxy09/article/details/8146055
本学习笔记以下面的方式组织:编程前期分析、代码与注释和重要代码解析三部分。
要实现目标:通过微软的SDK提取带游戏者ID的深度数据并用OpenCV显示,不同用户,显示的颜色不同
一、编程前期分析
我们在上一文中提到的是不带游戏者ID的深度数据的提取,具体见下面:
Kinect开发学习笔记之(五)不带游戏者ID的深度数据的提取
http://blog.csdn.net/zouxy09/article/details/8146719
首先,Kinect传感器核心是发射红外结构光,并探测红外光反射,从而可以计算出视场范围内每一个像素的深度值。从深度数据中最先提取出来的是物体主体和形状,以及每一个像素点的游戏者索引信息。然后用这些形状信息来匹配人体的各个部分,最后计算匹配出来的各个关节在人体中的位置。而Kinect具有一次识别多达6个游戏者的能力,并能跟踪最多两个人的骨骼(对于XBOX360来说,就是可以同时两个人玩游戏了)。
可能有点奇怪哦,这一个带游戏者ID,一个不带,还得那么严肃地给它单独开一文来学习。究竟啥来头啊。呵呵,实际上,既然微软提供了这种差别,那么它的存在肯定是有意义的,所谓存在即合理嘛。多个选择嘛。需要用到游戏者ID的时候就用,不需要的时候就不用费那么大劲。也不能说费劲,就是使用游戏者ID的时候,我们需要再做一些工作,去把不同游戏者的轮廓找出来,然后为了区别,标上不同的颜色,这就是本文想实现的。有点啰嗦了。

上一文中,我们讲到,Kinect的深度图像数据有两种格式,一种是带游戏者ID的,一种是不带的。两种格式都是用两个字节来保存一个像素的深度值,而两方式的差别在于:
(1)唯一表示深度值:那么像素的低12位表示一个深度值,高4位未使用;
(2)既表示深度值又含有游戏者ID:Kinect为每一个追踪到的游戏者编号作为索引。而这个方式中,像素值的高13位保存了深度值,低三位保存用户序号,7 (0000 0111)这个位掩码能够帮助我们从深度数据中获取到游戏者索引值。
要注意的是,不要对特定的游戏者索引位进行编码,因为他们是会变化的。实际的游戏者索引位并不总是和Kinect前面的游戏者编号一致。啥意思呢?例如,Kinect视野中只有一个游戏者,但是返回的游戏者索引位值可能是3或者4。也就是说有时候第一个游戏者的游戏者索引位可能不是1。还有,如果走进Kinect视野再走出去,然后再走进来,虽然你还是你,但是Kinect给你的索引ID可能就和原来的不一样了,例如之前返回的索引位是1,走出去后再次走进,可能索引位变为其他值了。所以开发Kinect应用程序的时候应该注意到这一点。
说得有点乱哦,咱们还是看代码吧。
二、代码与注释