# 代码示例:

#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. oracle客户端安装及Plsql devloper连接

    1)安装Oracle 11g 64位 2)安装32位的Oracle客户端( instantclient-basic-win32-11.2.0.1.0)下载instantclient-basic-win ...

  2. 联想硬盘分区表格式修改 GPT -> MBR

    知识点分析:随机预装Win8的电脑,磁盘为GPT格式的,如果需要安装Win7等早期版本系统,需要转换为MBR格式的,使用Diskpart命令即可完成转换. 操作步骤: 注意:转换磁盘格式需要清空磁盘中 ...

  3. Makefile基础

    1.规则 规则定义格式如下 目标 : 条件1 条件2 ... 命令1 命令2 ... 隐含规则和模式规则(略) 2.变量 Makefile变量像C的宏定义一样,代表一串字符,在取值的地方展开. 1)两 ...

  4. <!DOCTYPE> 标签的深度剖析以及使用选择

    前言: 今天被问道“有没有仔细了解过<!DOCTYPE>标签?”,愣了一下,因为一开始在W3cschool上看到过建议使用XHTML Transitional DTD,之后就很听话地把Dr ...

  5. 当类库项目中无法使用Application.StartupPath

    通常我们WinForm编程时,要获取程序当前运行的文件夹路径会用Application.StartupPath ,但是Application.StartupPath在编写类库项目时却无法使用,因为我们 ...

  6. 基本的TCP编程

    int socket(int family,int type,int protocol); family: AF_INET ipv4协议 AF_INET6 ipv6协议 AF_LOCAL unix域协 ...

  7. Android 通过xml 自定义图片

    <?xml version="1.0" encoding="utf-8"?><shape xmlns:android="http:/ ...

  8. AS与JS相互通信(Flex中调用js函数)

    转载自http://www.blogjava.net/Alpha/archive/2009/06/27/284373.html Flex中As调用Js的方法是:     1.导入包 (import f ...

  9. XHTML标签的嵌套规则--很基础很重要

    XHTML的标签有许多:div.ul.li.dl.dt.dd.h1~h6.p.a.addressa.span. strong……我们在运用这些标签搭建页面结构的时候,是可以将它们无限嵌套的,但是,嵌套 ...

  10. sqldependency 支持的select

    https://msdn.microsoft.com/library/ms181122.aspx   支持的 SELECT 语句 满足下列要求的 SELECT 语句支持查询通知: 必须显式说明 SEL ...