Kinect开发学习笔记之(六)带游戏者ID的深度数据的提取
来源:互联网 发布:windows虚拟内存是什么 编辑:程序博客网 时间:2024/04/29 11:51
【原文:http://blog.csdn.net/zouxy09/article/details/8151044】
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应用程序的时候应该注意到这一点。
说得有点乱哦,咱们还是看代码吧。
二、代码与注释
三、代码解析
首先,这里基本上和上一文说的深度数据的获取的流程和API都是一样的,具体的话,参考上一文。只是有几个点需要说明下:
(1)初始化和打开深度数据流的时候传入的参数是不同的,这个需要注意下,我们需要的是DEPTH_AND_PLAYER_INDEX数据;
(2)每个像素的深度数据由两个字节来保存,高13位保存了深度值,低三位保存用户序号。
(3)具体显示的时候我们是这样处理的:
对于每一个像素,我们通过它的深度数据去修改它的RGB值,如果属于同一个用户的ID,那么像素就标为同种颜色,不同的用户,其ID不一样,颜色的标示也不一样,如果不属于某个用户的像素,那么就采用原来的深度值。
首先,这里涉及到了:
USHORTrealDepth = (depthID & 0xfff8) >> 3; //提取距离信息,高13位
USHORTplayer = depthID & 0x07 ; //提取ID信息,低3位
然后RGBQUAD是一个结构体,其保存一个像素点的RGB值,定义如下:
typedef struct tagRGBQUAD {
BYTE rgbBlue;
BYTE rgbGreen;
BYTE rgbRed;
BYTE rgbReserved;
} RGBQUAD;
至此,目标达成。
下面是结果,感觉似乎如果两个人靠得太近的话,也会被识别为同一个用户,标示同样的颜色,这点感觉有点不太稳定,这种情况应该挺容易避免的啊,是我高估了Kinect,还是我高估了我。- Kinect开发学习笔记之(六)带游戏者ID的深度数据的提取
- Kinect开发学习笔记之(六)带游戏者ID的深度数据的提取
- Kinect开发学习笔记之(六)带游戏者ID的深度数据的提取
- Kinect开发学习笔记之(六)带游戏者ID的深度数据的提取
- Kinect开发学习笔记之(六)带游戏者ID的深度数据的提取(转)
- Kinect开发学习笔记之(六)不带游戏者ID的深度数据的提取
- Kinect开发学习笔记之(七)带游戏者ID的深度数据的提取
- Kinect开发学习笔记之(五)不带游戏者ID的深度数据的提取(转)
- Kinect开发学习笔记之(五)不带游戏者ID的深度数据的提取
- Kinect开发学习笔记之(五)不带游戏者ID的深度数据的提取
- Kinect开发学习笔记之(五)不带游戏者ID的深度数据的提取
- Kinect开发学习笔记之(五)不带游戏者ID的深度数据的提取
- Kinect开发学习笔记之(七)骨骼数据的提取(转)
- Kinect开发学习笔记之(七)骨骼数据的提取
- Kinect开发学习笔记之(七)骨骼数据的提取
- Kinect开发学习笔记之(八)骨骼数据的提取
- Kinect开发学习笔记之(七)骨骼数据的提取
- Kinect开发笔记之六Kinect Studio的应用
- 树形DP
- Kinect开发学习笔记之(五)不带游戏者ID的深度数据的提取
- Mac如何配置QQ企业邮箱
- 搜狗输入法 输入 图表情的时候, 我们用 autoLink ="web" 来实现 , 如果是 链接可以点击;
- springMVC-多语言I18n
- Kinect开发学习笔记之(六)带游戏者ID的深度数据的提取
- iptables防火墙只允许指定ip连接指定端口、访问指定网站
- Beyond Compare文本合并进行内容替换的方法
- C#与SQLServer数据库连接
- 常见的算法
- Loadrunner模拟JSON接口请求进行测试
- 金字塔
- 应用程序使用RAW socket从内核中抓取指定协议的数据包流程分析;
- css负边距可以实现的布局(上)左固定右自适应,多行多列,等高布局