Kinect NUI 概述(二)

NUI图像流概要

NUI API提供修改传感器设置的方法使开发者能够访问图像数据。

流数据由一系列的静态图片帧构成。初始化NUI API时,应用确定要使用的流。然后打开这些具有不同特性的流,包括流分辨率,图像类型,运行时存储帧的缓冲数量。如果在应用读取并释放一帧前,运行时已填满所有缓冲,运行时将丢弃最老的帧数据,重用缓冲。因此有可能出现帧率下降。应用至多申请4缓冲,双缓冲已满足大部分应用场景。

应用可以访问下述类型的图像数据:

色彩数据

深度数据

玩家段(segmentation)数据

色彩数据

色彩数据有两种格式:

RGB格式

RGB提供sRGB色彩空间内32位线性X8R8G8B8格式的彩色位图。应用通过在打开数据流时指定“color”或者“color_YUV”图像类型使用RGB数据。

YUV格式

YUV提供16位,γ校正的线性UYVY格式的彩色位图,YUV空间的γ校正等同于RGB空间的sRGB γ值。由于YUV流采用每像素16位的格式,应用在打开数据流时可以使用更少的内存保存位图数据,分配更少的缓冲区。开发者通过在打开数据流时指定原生YUV图像类型使用YUV数据。YUV数据仅在640×480分辨率及15FPS的帧率下使用。

来自同一摄像头的数据可以使用两种色彩格式计算,以便表示相同的图像。开发者应选择最适合应用的色彩格式处理。

Kinect通过USB连接器向计算机传递数据,因此传输率受限于连接器的带宽。传感器在1280×1024的分辨率下返回的拜耳(Bayer)彩色图像数据在传输给运行时前压缩并转换为RGB,而后在传递给应用前解压数据。通过压缩方法使得返回彩色数据的帧率可达30FPS,不过(有损)压缩算法会部分损失图像精度。

深度数据

深度数据流提供的数据帧,每像素都包含了从传感器深度视野发现的摄像头平面到最近对象在x、y轴上的笛卡尔距离(单位毫米)。深度数据有两类可能的视距:缺省视距和近距视距,近距视距由DepthRange枚举值决定。通过 DepthImageFormat枚举值设置数据格式。

应用可以通过处理来自深度流的数据来支持不同的自定义特性,例如追踪用户动作,辨识背景对象。

深度流数据每像素使用13位表示深度数据,3位表示玩家。深度值0表示感应对象太近或太远而不能感应深度值。当骨骼追踪关闭后,3位玩家值被设置为0.

玩家段数据

Kinect系统能够处理辨识传感器前多至6个人物的信息,继而创建人物分段Map。该Map是一个bitmap,key是像素值,value是像素位置上摄像头视距内,距离摄像头最近的人物的角色编号。玩家被追踪或者无追踪:只有被追踪的玩家有完整20块关节的空间位置的骨骼信息。同一时刻最多2个玩家可被追踪。应用需要选择追踪的玩家,或者缺失选择追踪2个玩家。

尽管玩家段数据是独立的逻辑流,但现实中深度数据和玩家段数据会被合并在一帧中:

每像素内高13位的数值表示深度距离(单位毫米),低3位表示被追踪的玩家序号。这些位都被当做整数值处理,不能用作标志位。

玩家序号0表示特定位置没有发现玩家,1、2表示玩家。应用通常使用玩家段数据作为掩码从原生色彩和深度图像数据中来分离特定玩家或区域。

检索图像信息

应用通过传递一个缓冲区给帧检索方法,获取最近的图像数据帧。如果最新数据已准备,将被拷贝至缓冲区。如果帧请求速度大于新帧生成速度,应用可以选择是否等待下帧,还是立即返回,稍后重试。NUI Image Camera API不会重复提供帧数据。

应用可以使用以下两种方式检索帧数据:

轮询模式

轮询模式是最简单的读取数据帧的方式。首先,应用打开图像流,然后请求一帧,并指定等待下帧数据的时间(0和无限之间的毫秒值)。当新帧到达或者等待时间过期,该方法返回。如果制定无限等待时间将导致等待数据帧的调用阻塞,直到下帧数据可得。

当请求成功返回,表示可以处理新帧数据。如果超时时间设置为0,应用代码可以轮询新帧的完成,同时在同一线程内处理其他工作。C++应用调用NuiImageStreamOpen打开彩色或深度流,忽略可选事件。为了轮询彩色及深度帧数据,C++应用需调用NuiImageStreamGetNextFrame,而C#应用需调用ColorImageStream.OpenNextFrame方法。

事件模式

事件模式支持更加灵活、精确的方式集成骨骼数据到应用中。

在这个模型中,C++代码传递事件句柄给NuiImageStreamOpen。当新的数据帧准备好后,事件触发。等待线程被唤醒,通过调用NuiImageStreamGetNextFrame得到骨骼数据帧。在此期间事件标识被NUI Image Camera API重置。

C#代码通过hook KinectSensor.ColorFrameReady事件或者类似事件到合适的事件句柄上使用事件模型。当新数据帧准备好,事件触发,句柄运行,调用ColorImageStream.OpenNextFrame方法得到帧。


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值