1. 数据流概述:
图像数据流定义:一组连续静止图像帧的集合
应用程序根据NUI API提供的相关设置选项,可以获得不同质量、格式和带宽的图像数据,包括彩色图和深度图两种。
从sensor中可以访问以下几种数据流:
* 彩色图像数据
* 深度图像数据
* 用户分割数据(由深度流二次开发而成)
1.1 用户分割数据
要想实现骨骼追踪,第一步应该是将用户从整个背景图像中分割出来。用户分割数据属于深度数据的一部分
* 深度图像的每个像素由2字节,共16位组成
* 每个像素数据的前13位代表人体到相机红外摄像头平面的垂直距离,以mm为单位
* 像素数据的最后三位表示用户ID索引号(BodyId);
如果索引号为0,表示在该位置下没有找到用户,此时深度距离显示为0;
图1:用户分割数据示意图
1.2 深度图像数据
深度图像数据也是由连续的深度图像帧组成。每一个像素点数据代表物体到红外摄像头光心平面的垂直距离,以mm为单位。
如果一点的深度值为0,代表该点的深度值不确定,可能是离相机太近或太远。同样的,深度图像像素数据的前13位代表距离,后三位代表用户索引号。
2. 如何获取数据流
2.1 轮询模型
轮询模型(polling model)是最简单的读取数据帧的方法。首先开启图像数据流,然后请求帧数据并设置等待时间T(ms)。如果帧数据尚未就绪,则系统等待时间T后范围;如果帧数据准备就绪,则程序可以请求下一帧数据。
轮询模型是一种“拉”的方式,程序会在T时间内一直检查是否有帧数据,如果有则加载
请求深度图像帧: DepthImageStream.OpenNextFrame(T)
2.2 事件模型(*)
通过注册数据流的on_frame_ready函数。每当on_frame_ready触发,则获取数据帧
需要注意的是:不能对同一数据流同时使用这两种调用方法