# 代码示例:

  1. #include <Kinect.h>
  2. #include <iostream>
  3. using namespace std;
  4. int main(void)
  5. {
  6. IKinectSensor * mySensor = nullptr;
  7. GetDefaultKinectSensor(&mySensor);  //获取感应器
  8. mySensor->Open();            //打开感应器
  9. IDepthFrameSource * mySource = nullptr;     //取得深度数据
  10. mySensor->get_DepthFrameSource(&mySource);
  11. int height = 0, width = 0;
  12. IFrameDescription * myDescription = nullptr;  //取得深度数据的分辨率,等下用
  13. mySource->get_FrameDescription(&myDescription);
  14. myDescription->get_Height(&height);
  15. myDescription->get_Width(&width);
  16. myDescription->Release();
  17. IDepthFrameReader * myReader = nullptr;
  18. mySource->OpenReader(&myReader);     //打开深度数据的Reader
  19. int times = 100;
  20. IDepthFrame * myFrame = nullptr;
  21. while (times)
  22. if (myReader->AcquireLatestFrame(&myFrame) == S_OK)        //通过Reader尝试获取最新的一帧深度数据,放入深度帧中,并判断是否成功获取
  23. {
  24. UINT size = 0;
  25. UINT16 * buffer = nullptr;
  26. myFrame->AccessUnderlyingBuffer(&size,&buffer);        //将深度数据输入到数组里,里面的数字代表距离
  27. cout << buffer[width * (height / 2) + width / 2] << endl;  //将位于摄像头最中央的物体的距离输出
  28. times--;
  29. myFrame->Release();
  30. }
  31. myReader->Release();    //释放不用的变量并且关闭感应器
  32. mySource->Release();
  33. mySensor->Close();
  34. mySensor->Release();
  35. return 0;
  36. }


# 详细解释

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. KMP算法及java实现

    参考: http://blog.csdn.net/cdnight/article/details/11935387

  2. android 简易时间轴(实质是ListView)

    ListView的应用 1.在很多时候是要用到时间轴的,有些处理的时间轴比较复杂,这里就给出一个比较简单的时间轴,其实就是ListView里面的Item的设计. 直接上代码: ListView,ite ...

  3. Number

    https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/parseInt 概述 parseIn ...

  4. 【转】Fresco之强大之余的痛楚

    http://www.jianshu.com/p/5364957dcf49 开始之前 如果你有使用的心得,技巧,踩坑经历,希望贡献出来,我会在TODO中慢慢添加(^^)/ 关于Fresco Fresc ...

  5. Java常见排序算法之直接插入排序

    在学习算法的过程中,我们难免会接触很多和排序相关的算法.总而言之,对于任何编程人员来说,基本的排序算法是必须要掌握的. 从今天开始,我们将要进行基本的排序算法的讲解.Are you ready?Let ...

  6. 【M31】让函数根据一个以上的对象类型来决定如何虚化

    1.考虑下面的问题,游戏软件中有角色A,B,角色又可以细化为A1,A2,A3:B1,B2,B3,两类角色之间相互攻击.即A1可以攻击B1,B2,B3,B1可以攻击A1,A2,A3.C++的多态,只根据 ...

  7. Codeforces Round #335 (Div. 2) C. Sorting Railway Cars 动态规划

    C. Sorting Railway Cars Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://www.codeforces.com/conte ...

  8. [AngularJS] Adding custom methods to angular.module

    There are situations where you might want to add additional methods toangular.module. This is easy t ...

  9. mysql 线程级别的缓冲区

    线程栈信息使用内存(thread_stack) 主要用来存放每一个线程自身的标识信息,如线程id,线程运行时基本信息等等,我们可以通过 thread_stack 参数来设置为每一个线程栈分配多大的内存 ...

  10. Linux下判断cpu物理个数、几核

    自己服务器的输出 1. 查看物理CPU的个数   #cat /proc/cpuinfo |grep "physical id"|sort |uniq|wc -l    1 2. 查 ...