# 代码示例:

#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. Java和MongoDB之Hello World

    1.新建Project 新建Java Project,并把mongo-java-driver驱动加入到项目bulid path中,如果你使用的是maven增加依赖. <dependency> ...

  2. 不需要JAVAScript完成分页查询功能

    分页查询之前已经说过,现在用另一种方法实现,换汤不换药.但是更简单. view层代码: 控制层代码: 业务逻辑层,主要看一下方法count1()的代码: count1()方法的功能就是控制翻页,如果传 ...

  3. PHP抓取豆瓣读书爬虫代码

    <?php//演示地址 http://asizu.sinaapp.com/reptile_douban.php//数据量不是特别大,没有写抓完数据便停止. 喜欢的朋友拿去自己改改就好了 head ...

  4. OBD Experts OBD II Software OBD II Protocol Stack

    http://www.obdexperts.co.uk/stack.html OBD II Software OBD Experts can provide you with ready to use ...

  5. C++学习笔记之数据类型

    一.变量名 几条简单的C++命名规则: 在名称中只能使用字母,数字和下划线 名称的第一个字符不能是数字 区分大小写 不能将C++关键字用作名称 以两个下划线和大写字母打头的名称被保留给实现(编译器及其 ...

  6. Python 存储模型

    1.Python彻底分离了对象和引用,可以认为内存中的对象都是不可修改的,每次修改引用,相当于在堆上重新创建一个对象,引用指向新对象. 2.对于数值和字符串,修改意味着引用指向一个新对象. 3.集合中 ...

  7. WP8异常错误:Error HRESULT E_FAIL has been returned from a call to a COM component.

    在做WP8开发的过程中,使用到了longlistselector这个控件,本来使用没有问题. 但是突然出现了一个闪退的错误,错误信息如下: {MS.Internal.WrappedException: ...

  8. Looksery Cup 2015 H. Degenerate Matrix 数学

    H. Degenerate Matrix Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/549/ ...

  9. Codeforces Round #307 (Div. 2) E. GukiZ and GukiZiana 分块

    E. GukiZ and GukiZiana Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/55 ...

  10. HDU 1504 Disk Tree

    转载请注明出处:http://blog.csdn.net/a1dark 分析:查了一下这题.发现网上没有什么关于这道题的解题报告.其实题目意思挺好懂的.就是给你一些文件的目录结构.然后让你把它们组合在 ...