# 代码示例:

#include <Kinect.h>
#include <iostream> using namespace std; int main(void)
{
IKinectSensor * mySensor = nullptr;
GetDefaultKinectSensor(&mySensor);  //获取感应器
mySensor->Open();            //打开感应器 IDepthFrameSource * mySource = nullptr;     //取得深度数据
mySensor->get_DepthFrameSource(&mySource); int height = 0, width = 0;
IFrameDescription * myDescription = nullptr;  //取得深度数据的分辨率,等下用
mySource->get_FrameDescription(&myDescription);
myDescription->get_Height(&height);
myDescription->get_Width(&width);
myDescription->Release(); IDepthFrameReader * myReader = nullptr;
mySource->OpenReader(&myReader);     //打开深度数据的Reader int times = 100;
IDepthFrame * myFrame = nullptr;
while (times)
if (myReader->AcquireLatestFrame(&myFrame) == S_OK)        //通过Reader尝试获取最新的一帧深度数据,放入深度帧中,并判断是否成功获取
{
UINT size = 0;
UINT16 * buffer = nullptr;
myFrame->AccessUnderlyingBuffer(&size,&buffer);        //将深度数据输入到数组里,里面的数字代表距离
cout << buffer[width * (height / 2) + width / 2] << endl;  //将位于摄像头最中央的物体的距离输出
times--;
myFrame->Release();
}
myReader->Release();    //释放不用的变量并且关闭感应器
mySource->Release();
mySensor->Close();
mySensor->Release(); return 0;
}


# 详细解释

1. **取得并开启感应器(`IKinectSensor`)**
  通过`GetDefaultKinectSensor()`将感应器赋给一个`IKinect`变量,然后这个变量就可以代表感应器了,再用它打开感应器。
2. **取得深度数据源(`IDepthFrameSource`)**
  打开感应器后,用它里面的`get_DepthFrameSource()`这个成员函数来获取深度数据源,有点奇怪的是,虽然现在获取到了数据源,但是不能对数据进行操作,还需要下一步的Reader。
3. **取得深度数据Reader(`IDepthFrameReader`)**
  要对数据进行操作,首先需要通过数据源将`Reader`打开
4. **通过Reader读取数据帧(`IDepthFrame`)**
  此步骤在`while`循环中进行,每次循环时,通过`Reader`的`AcquireLatestFrame()`的成员函数来获取最新的一帧,并且将其装入一个深度数据帧里。注意,这里的`AcquireLatestFrame()`这个函数一定要判断是否返回一个成功值,因为这个函数获取失败的的几率很高。
5. **操作数据帧**
  在成功读取到数据帧之后,我们通过数据帧里的`AccessUnderlyingBuffer()`这个函数将帧里的数据复制到一个数组里去,这个函数有两个参数,第一个是个记录大小的变量,第二个是个接受数据的数组指针,传入后会分别返回数组的大小以及数据。它传入数组的数据代表的是那一个像素点上的物体距离传感器的位置。在上面的代码里,用了一个`IFrameDescription`,顾名思义,它是用来描述深度数据帧的,通过它,可以获取到深度数据帧的宽、高、每个像素多少个字节等等。记录了宽和高之后,就可以计算出中间那一点在数组里的位置,访问输出就可以了。

  为了简洁此段代码略掉了大部分错误检测,严谨来说的话应该每次使用返回HRESULT的函数都应该检测返回值。如果程序正常运行的话,应该会输出100个数字,代表距离。最后当一个对象不用了之后,记得要释放。


  Kinect有多种数据源,比如深度、彩色、红外,但是操作的方法基本都是一致的,都是Sensor->Source->Reader->Frame

Kinect For Windows V2开发日志三:简单的深度读取的更多相关文章

  1. Kinect For Windows V2开发日志五:使用OpenCV显示彩色图像及红外图像

    彩色图像 #include <iostream> #include <Kinect.h> #include <opencv2\highgui.hpp> using ...

  2. Kinect For Windows V2开发日志七:照片合成与背景消除

    上一篇里讲到了Kinect可以从环境中区分出人体来.因此可以利用这个功能,来把摄像头前的人合成进照片里,和利用Photoshop不同的是,这样合成进去的人是动态且实时的. 简单的思路 BodyInde ...

  3. Kinect For Windows V2开发日志六:人体的轮廓的表示

    Kinect中带了一种数据源,叫做BodyIndex,简单来说就是它利用深度摄像头识别出最多6个人体,并且用数据将属于人体的部分标记,将人体和背景区别开来.利用这一特性,就可以在环境中显示出人体的轮廓 ...

  4. Kinect For Windows V2开发日志一:开发环境的配置

    算是正式进军Kinect了,前段时间学的东西现在就忘了,于是从此开始记录一下. 目前为止大部分的学习资料来自于Heresy的博客,写的非常优秀,清晰明了,十分感谢.开发语言为C++,应该会一直使用,但 ...

  5. Kinect For Windows V2开发日志八:侦测、追踪人体骨架

    简介 Kinect一个很强大的功能就是它可以侦测到人体的骨骼信息并追踪,在Kinect V2的SDK 2.0中,它最多可以同时获取到6个人.每个人25个关节点的信息,并且通过深度摄像头,可以同时获取到 ...

  6. Kinect For Windows V2开发日志四:使用OpenCV显示深度图像

    代码示例: #include <Kinect.h> #include <iostream> #include <opencv2\highgui.hpp> using ...

  7. Kinect For Windows V2开发日志九:侦测并绘制人体骨架

    简介 在上一篇<侦测.追踪人体骨架>里,介绍了关节点的使用办法,这一篇记录将关节点与OpenCV结合的绘图方法. 代码 #include <iostream> #include ...

  8. Kinect For Windows V2开发日志二:Kinect V2的基本参数

    以下内容节选自Heresy的博客:   彩色影像:1920 x 1080 @ 30 / 15 FPS(根据环境亮度) 深度影像:512 x 424 @ 30 FPS.16bit 距离值(mm).可侦测 ...

  9. Kinect for Windows V2开发教程

    教程 https://blog.csdn.net/openbug/article/details/80921437 Windows版Kinect SDK https://docs.microsoft. ...

随机推荐

  1. Apache实现动态虚拟主机

    经常在开发中为Apache web server添加虚拟主机  方便多个项目的 同时运营,但是每次增加新的项目时都得重新配置增加VirtualHost:虚拟主机    部分,时间久了VirtualHo ...

  2. Ext_两种处理服务器端返回值的方式

    1.Form表单提交返回值处理 //提交基本信息表单  f.form.submit({      clientValidation:true,      //表单提交后台处理地址      url:' ...

  3. Trapping Messages Sent to an Application

    http://www.delphicorner.f9.co.uk/articles/apps7.htm Trapping Messages Sent to an Application I wrote ...

  4. html的下拉框的几个基本使用方法

    尽管使用EXT开发了一段时间,可是自己认为我对javascript还是不是非常熟,所以边看书边做小样例 给自己以后用到的时候查看下,都是非常主要的东西,对刚開始学习的人可能有点帮助 以下是代码 < ...

  5. CentOS 6.4安装本地yum源,并安装X Window System

    1.为DVD创建一个挂载目录 [root@localhost ~]# mkdir /media/CentOS 2.在Linux下挂载CentOS DVD(虚拟机挂载DVD不说了,应该都会) [root ...

  6. .Net连接到SAP【转载】

    刚开始接触SAP了,感觉很陌生,清一色的TCode,不过里面的功能确实强大,不得不佩服啊,之前我一直是搞WinForm和WebForm的,现在能够接触到SAP那我还是想多学习一下,看了一下ABAP的语 ...

  7. linux消息队列操作

    对消息队列的操作无非有以下三种类型: 1. 打开或创建消息队列消息队列的内核持续性要求每一个消息队列都在系统范围内相应唯一的键值,所以,要获得一个消息队列的描写叙述字,仅仅需提供该消息队列的键值就可以 ...

  8. php常用代码(一)

    一:获取上个小时 方法1:date("H",strtotime("-1 hours"); 方法2:date('H',time()-60*60); 方法3:ech ...

  9. PHP自动分表程序

    http://blog.zol.com.cn/2210/article_2209590.html /** * 分表程序 *  * @author Shen Xi shen.xi@zol.com.cn  ...

  10. 算法总结—深度优先搜索DFS

    深度优先搜索(DFS) 往往利用递归函数实现(隐式地使用栈). 深度优先从最开始的状态出发,遍历所有可以到达的状态.由此可以对所有的状态进行操作,或列举出所有的状态. 1.poj2386 Lake C ...