Kinect来了——解析SDK(OpenNI Framework 2)
前文主要介绍了OpenNI FrameWork的基本概念和整体构架,在正式进入API概览之前,我们需要对工作节点(Production Nodes)进行一些补充说明。
工作节点的数据创建/销毁机制
通常把能够输出数据的工作节点称为“生成器”,这里我们可以把“生成器”看作一个对象。而当“生成器”对象被首次创建时,这些对象往往不会立即执行有关数据处理的代码,而需要等待上层应用针对该节点输入相关配置信息之后才进行。实际上“生成器”必须等候相关应用的执行指令到达之后才进行创建数据操作。这一操作往往通过下列虚方法实现:
[c]xn::Generator::StartGenerating();[/c]
应注意 ,上面的StartGenerating函数的作用是开始执行数据生成操作,有时我们希望停止生成新数据,但最好能保留该工作节点的配置信息。那么就没有必要销毁该工作节点对象,只需调用下面的函数即可:
[c]xn::Generator::StopGenerating();[/c]
事实上每一个“生成器”节点都需要实现数据输入操作,但有时可能会遇到这种情况:程序运行可能需要上一次处理的数据结果,为了避免频繁I/O,每个“生成器”节点必须在内部保存一份数据结果副本,直到上层代码显示调用更新数据备份区的函数。此类函数通常是以下形式:
[c]xn::Generator::WaitAndUpdateData();[/c]
调用该函数就意味着通知工作节点需要重置自己的数据备份区,并等待下一次新的数据生成操作。在一条完整的工作链上,程序员需要一次性刷新所有工作节点的数据备份区,那么依照不同情况可以选择相应的简便处理方式:
[c]xn::Context::WaitAnyUpdateAll(); //当任意节点产生新数据时,所有节点都刷新自己的数据备份区;
xn::Context::WaitOneUpdateAll(); //只有当某一个指定节点产生新数据时,所有节点才刷新自己的数据备份区,这种情况通常适用于只有一个控制节点的应用程序;
xn::Context::WaitNoneUpdateAll(); //所有节点立即刷新数据备份区;
xn::Context::WaitAndUpdateAll(); //只有当全部节点都产生新数据时,所有节点才刷新自己的数据备份区;[/c]
上述函数均会在延迟两秒后自动退出。
官方建议程序员应尽量使用形如xn::Context::Wait…UpdateAll()的函数进行数据备份区刷新,除非确实需要只刷新某一个节点,上述方式也会在一定程度上简化程序员的设计和编码工作。
主要数据对象
OpenNI的最基本的数据对象是指上下文对象,上下文对象保存了应用程序使用OpenNI的所有状态信息,包括所有工作链。应注意同一个应用程序可同时创建多个上下文对象,但上下文之间无法共享信息。同时上下文对象必须进行初始化后才能首次使用,且需保证所有的附加模块均得到正确的载入和确认。应用程序可以通过调用shutdown函数释放上下文对象所使用的内存空间。
OpenNI中还定义了一种元数据对象,元数据主要用于保存与特殊数据类型有关的属性信息。例如在一套深度映射数据中,其解析度的大小就属于元数据范畴。任何从生成器节点产生的数据都拥有相应的元数据对象。设计元数据对象的目的在于,由于节点配置可由人为随机干预,任何生成器节点的配置信息和其所产生的数据信息始终无法保证完全一致,因此有必要对每套数据也封装进相应的属性信息,这就是元数据对象的作用。
配置变更
每一个OpenNI中所包含有关配置的选项都携带以下方法:
1、Set函数,用于修改当前配置;
2、Get函数,用于返回当前配置内容;
3、Register和Unregister函数,用于为配置变更事件注册一个回调函数;
数据生成器
1、基本映射图像生成器,OpenNI中用于生成任意数据映射类型的最基本的映射生成器,它的功能主要包括配置控制、特性分配、可替换的视点特性以及帧同步特性;
2、深度映射生成器,主要功能包括获取深度映射、获取设备的最大深度范围、设备的视野属性配置、用户位置特性等;
3、图像生成器,主要功能包括获取彩色图像、获取像素格式属性;
4、红外数据生成器,用于获取当前的红外映射图像;
5、场景分析器,用于获取传感器原始数据,并对原始数据内容进行分类标记和输出,其主要功能包括获取分类映射图像(每一个像素都携带相应的标签)、获取水平面坐标;
6、音频生成器,主要功能包括获取音频缓冲区、配置音频设备属性,包括采样率、通道数以及采样带宽等;
7、姿态生成器,用于对特定的人物或手势进行跟踪,主要功能包括姿态添加/删除、获取活动姿态、注册/反注册姿态存在回调函数、注册/反注册姿态变更毁掉函数;
8、手部标记点生成器,用于跟踪手部标记点,主要功能包括开始/停止手部跟踪、注册/反注册手部跟踪回调函数(包括手部的进/出以及位置变化);
9、用户生成器,用于生成场景中有关人物的数据,主要功能包括返回用户数据、获取用户信息、获取用户质心CoM、获取携带用户标记像素的场景图像、注册/反注册用户进/出回调函数。
最后,我们将介绍几个OpenNI的基本程序框架。