1. 运行原理

在Kinect 2.0中,每个类型的数据都有三个类与之对应:Source,Reade和Frame。

要读取骨架,

有IBodyFrameSource,IBodyFrameReader,IBodyFrame这三个类;

要读取深度数据,

有IDepthFrameSource,IDepthFrameReader,IDepthFrame这三个类;

要读取红外数据,

有IDepthFrameSource,IDepthFrameReader,IDepthFrame这三个类;

要读取人物的索引数据,

有IBodyIndexFrameSource,IBodyIndexFrameReader,IBodyIndexFrame;

要读取彩色数据,

有ColorFrameSource,ColorFrameReader,ColorFrame这三个类。

1.1 Source

在初始化并打开了Kinect后,需要请求Kinect打开一个源,我们将从这个源不断获得信息,代码如下:

m_pKinectSensor->get_BodyFrameSource(&pBodyFrameSource);

其中,m_pKinecrSensor是Kinect的总端口,所有Source数据均是从此获取;

pBodyFrameSource是一个IBodyFrameSource的类。

1.2 Reader

由于Source是Kinect端拥有的,不是电脑拥有的,所以需要创建一个读口,这个读口和

上述的源绑定,之后读取信息都通过调用这个Reader来获得。

pBodyFrameSource->OpenReader(&m_pBodyFrameReader);

​ 其中,m_pBodyFrameReader是一个IBodyFrameReader的类。

1.3 Frame

Frame是真正存储数据的类,每一次都让Reader把数据读到Frame中,然后再从Frame

中提取各种各样最后使用的数据。

m_pBodyFrameReader->AcquireLatestFrame(&pBodyFrame);

​ 其中,pBodyFrame是一个IBodyFrame类。

2. 从Frame中获取数据

请求Source和创建Reader对于每一个数据类型都是一模一样的,但是从Frame中提取信息则各有不同。

2.1 深度数据

​ 在Kinect 2.0中,深度坐标空间的范围是(高x宽 = 424*512)。从深度信息Frame中提取数据,主要就是把Frame中的数据转存到一个数组中。

pBodyIndexFrame->CopyFrameDataToArray(cDepthHeight * cDepthWidth, bodyIndexArray);

​ 其中,cDepthHeight是424,cDepthWidth是512,bodyIndexArray就是一个424*512大小的16位unsigned int数组,用来存储深度数据。

2.2 骨架数据

​ kinect 2.0可以同时追踪六个人的骨架,因此每次我们需要先调用函数,获得六个骨架信息(如果没有人,那么那个骨架类就是空指针)。

pBodyFrame->GetAndRefreshBodyData(_countof(ppBodies), ppBodies);

​ 其中ppBodies是一个长度为6的IBody数组,IBody是用来存储追踪到的骨架信息的类。

在获得了这个类后,我们需要进一步从类中提取骨架位置,对于ppBodies中的每一个元素pBody,代码为:

pBody->GetJoints(_countof(joints), joints);

这里的joints是一个长度为25的数组,每一个元素就是骨架的位置信息。然而, 这个骨架位置信息是照相机坐标系(camera view)下的位置,x和y的范围都是-1到1。因此我们需要将它转化到深度坐标系中。这里要用到一个coordinateMapper类,具体代码为:

m_pCoordinateMapper->MapCameraPointToDepthSpace(joints[j].Position,&depthSpacePosition[j]);

coordinateMapper类的创建非常简单,具体可以参考代码。depthSpacePosition是一个长度也为25的数组,每一个元素是DepthSpacePoint,这个元素包含了在深度坐标系下的x和y坐标。

2.3 手势状态

​ 在上面的骨架信息的pBody中,同时也包含了追踪到的人的手势状态信息,具体代码为:

pBody->get_HandLeftState(&leftHandState);pBody->get_HandRightState(&rightHandState);

其中leftHandState和rightHandState都是HandState类,这个类有五种状态:open,closed,lasso,not tracked,unknown。其中前三种是特殊手势,后两种大同小异,反正就是无法识别了。比较特殊的是lasso,这个手势在官网有说明,具体形状是:伸出剪刀手,然后把食指和中指合并在一起,就是lasso状态了。事实上只用食指伸出来也可以被判断为lasso,但是食指和中指一起用,追踪效果更佳稳定。

2.4 人物二值图

​ 人物二值图数据的获取和深度数据获取非常类似,具体代码为:

pBodyIndexFrame->CopyFrameDataToArray(cDepthHeight * cDepthWidth, bodyIndexArray);

其中,bodyIndexArray是一个424*512的8位unsigned char数组。如果某个点被判断为属于人的一部分,就是黑色,否则(背景部分)就是白色。

3.Kinect深度图与彩色图像的重合

​ kinect的深度数据和彩色数据的分辨率以及视场大小都不一样,不能直接对应起来。但可以ICoordinateMapper的类中的一个成员函数MapDepthFrameToColorSpace可以实现深度图和彩色图的坐标转换。

校准可以通过使用opencv的resize函数便将深度图和彩色图的比例调整为1:1了。最后通过将同一点在深度图和彩色图中的坐标关系来将两种图的坐标关系对应好,这样便实现了坐标的对应,并且在同一幅画面中显示。

4.基于Kinect-OpenNI-OpenCV-OpenGL的环境三维重

链接:

http://www.opencv.org.cn/forum.php?mod=viewthread&tid=13042&extra

http://blog.csdn.net/chenyusiyuan/article/details/6279762

Kinect学习博客

http://blog.csdn.net/column/details/k4w2dn.html

http://blog.csdn.net/zkl99999/article/details/49307703

http://blog.csdn.net/wangyaninglm/article/details/51558656

Kinect2.0学习笔记相关推荐

  1. mysql5.0镜像_Mysql5.0学习笔记(一)

    Mysql5.0学习笔记(一) -基本sql语句与支持字符集 1.登录 mysql -h localhost -u root 2.创建用户firstdb(密码firstdb)和数据库,并赋予权限于fi ...

  2. Zabbx6.0(学习笔记)

    Zabbx6.0(学习笔记) 目录导航 Zabbx6.0(学习笔记) 一.为什么 需要监控系统 二.如何选择监控 三.Zabbix概述 四.Zabbix安装哪个版本? Zabbix安装要求 1.硬件 ...

  3. flink1.12.0学习笔记第2篇-流批一体API

    flink1.12.0学习笔记第 2 篇-流批一体API flink1.12.0学习笔记第1篇-部署与入门 flink1.12.0学习笔记第2篇-流批一体API flink1.12.0学习笔记第3篇- ...

  4. CCC3.0学习笔记_认证和隐私保护

    CCC3.0学习笔记_Authentication and Privacy Keys 系列文章目录 文章目录 系列文章目录 前言 1. 手机端和车厂服务器端的密钥存储 2. 密钥的产生和使用的说明 3 ...

  5. TensorFlow2.0 学习笔记(三):卷积神经网络(CNN)

    欢迎关注WX公众号:[程序员管小亮] 专栏--TensorFlow学习笔记 文章目录 欢迎关注WX公众号:[程序员管小亮] 专栏--TensorFlow学习笔记 一.神经网络的基本单位:神经元 二.卷 ...

  6. 《TP5.0学习笔记---配置篇》

    TP5.0学习笔记 TP5目录结构介绍 application目录是应用目录,我们整个应用所有的内容都写在这个目录中,在后续开发中,我们更多的时候都是在编写这个目录中的文件.在它里边有一个index文 ...

  7. Tensorflow2.0学习笔记(一)

    Tensorflow2.0学习笔记(一)--MNIST入门 文章目录 Tensorflow2.0学习笔记(一)--MNIST入门 前言 一.MNIST是什么? 二.实现步骤及代码 1.引入库 2.下载 ...

  8. Tensorflow2.0学习笔记(二)

    Tensorflow2.0学习笔记(二)--Keras练习 文章目录 Tensorflow2.0学习笔记(二)--Keras练习 前言 二.使用步骤 1.实现步骤及代码 2.下载 Fashion MN ...

  9. CCC3.0学习笔记_数字密钥数据结构

    CCC3.0学习笔记_数字密钥数据结构 系列文章目录 文章目录 系列文章目录 前言 4.1 Applet Instance Layout 4.2 Digital Key Structure 4.2.1 ...

最新文章

  1. R语言使用pROC包绘制ROC曲线并使用smooth函数绘制平滑的ROC曲线(方法包括:binormal、density、fitdistr、logcondens、logcondens.smooth)
  2. matlab 添加环境变量,CentOS 添加环境变量的三种方法
  3. android源码settings中显示所有正在运行进程流程分析
  4. MS SQL Server中的CONVERT日期格式化大全
  5. 【渝粤教育】 国家开放大学2020年春季 1080工程数学(本) 参考试题
  6. mysql导出(导入)数据库window平台
  7. 【Emit基础】如何发射foreach代码?
  8. Android学习笔记View的工作原理
  9. mysql物理删除索引_Oracle与MySQL删除字段时对索引和约束的处理
  10. 从零开始一起学习SLAM | 相机成像模型
  11. 使用XML绑定下拉列表
  12. 邢波老师致广大学员的一封信(2010-10-26)
  13. Awvs 12.x安装及使用教程
  14. 世纪互联评测至强5500 总结云平台经验
  15. 视频教程-PR教程-Premiere 2020影视剪辑实战精讲-其他
  16. Redis使用说明书(Windows)
  17. QQ2012如何恢复“合并会话窗口”为多个聊天窗口?
  18. AngularCI/CD:Error: initial exceeded maximum budget
  19. mysql数据库员工表创建_mysql数据库简单练习(创建表格,增删改查数据)
  20. 信息技术等级考试试题及答案

热门文章

  1. redis set 超时_Redis 更新(set) key值过期时间被重置
  2. yii引入php文件,Yii2框架中CSS、JS文件引入要领_PHP开发框架教程
  3. Spark详解(七):SparkContext源码分析以及整体作业提交流程
  4. mysql hourminute_mysql日期函数(时间函数)
  5. 一些日常工具集合(C++代码片段)
  6. 学习笔记(1)centos7 下安装nginx
  7. UWP入门(二) -- 基础笔记
  8. 基于CSS3飘带状3D菜单 菜单带小图标
  9. 怎么在eclipse里调试WebDriver的源代码
  10. Codeforces Round #144 (Div. 2) B. Non-square Equation 数学解一元二次方程+分析