你好,游客 登录 注册 搜索
背景:
阅读新闻

OpenNi实战笔记

[日期:2012-03-03] 来源:Linux社区  作者:linxiomgmin [字体: ]

OpenNI概念三层视图

顶层:展示了基于 OpenNI 实现体感的应用程序。

中间层:展示了 OpenNI,提供传感器和中间件组件之间交互的接口,中间件分析 传感器数据。

底层:展示了捕捉视觉和声音场景元素的硬件设备。

Modules 模块

OpenNI框架是个提供了物理设备和中间件组件的一个抽象层。API能够让众多组件 在OpenNI框架中注册。这些组件被称为模块,被用来生成和处理感官数据。

(1) 传感器模块:

3D sensor 三维传感器;

RGB camera RGB摄像头;

IR camera 红外摄像头;

Audio device 音频设备(麦克风);

(2) 中间件组件:

全肢体分析中间件:十一个处理感官数据,生成肢体相关信息(常见的数据结构如关节,方向,重心等)

手心分析中间件:是一个处理感官数据和生成手心的位置信息的软件组件。

手势探测中间件:是一个分辨预定义的手势和提醒应用程序的软件组件。

场景分析中间件:是一个分析场景图像的软件中间件,产生如下信息:场景的前景和背景的分离;平面图的坐标;场景中独特轮廓的识别。

Production Nodes 生产节点

OpenNI定义了生产节点它具有拥有能在生成体感要求的数据过程中充当生产性角 色的一套单元。 每个生产节点都能够使用其他更低级的生产节点 (读数据, 控制配置等) , 也能够被其他高级节点或本应用程序使用。

生产节点类型:传感器相关生产节点,中间件相关生产节点。

(1) 传感器相关生产节点Sensor-related Production Nodes :

设备Device :这种节点是物理的设备(例如:深度传感器,或者RGB摄像头)。这个节点的主要角色是使设备可配置。

a.深度生成器Depth Generator::这种节点能够生成深度映射。

b.图像生成器Image Generator :这种节点能够生成彩色图像映射。

c.红外生成器IR Generator :这种节点能够生成红外图像映射。

e.音频生成器Audio Generator :这种节点产生音频流。

(2) 中间件相关生产节点Middleware Related Production Nodes:

a.手势告警生成器Gestures Alert Generator :当特定手势被识别能够回调应用程序。

b.场景分析器Scene Analyzer :分析一个场景,包括前景从背景分开,识别场景中的体型,发现 平面图。场c景分析器的主要输出是标记的深度映射,每一个像素都包含一个标签,指明是体型还是背景的一部分。

c.手心生成器Hand Point Generator :支持手的发现和跟踪。这个节点当发现一个手心(手掌),或者 当手心被跟踪时,位置发生了变化,就产生一个回调事件。

d.用户生成器User Generator :生成一个在三维场景中的全部或部分肢体图画。

对于记录目的,以下产品节点被支持:

记录器Recorder :实现数据记录。

播放器Player: :从记录里读取数据并且播放它。

编码器Codec :用来压缩和解压缩记录中的数据

Production Chains 生产链

节点顺序是相互依赖的,以产生所需的肢体数据,被称为生产链

Capabilities 能力

一个生产节点可以被问是否支持某个能力。如果支持,这些功能就可以被特定节点调用。 OpenNI发布包括一套能力,也可以在将来继续增加新的能力。每一个模块能申明它 所支持的能力。此外,当需要生产链的列表,应用程序可以指定能力作为支持的条件。只有满足需要能力的模块才能被列出来。

目前支持的能力有:

(1) 替换视图Alternative View : 让任何类型的映射生成器(深度、 图像、 红外) 能够转换它的数据, 显得仿佛传感器被放到了另一个位置(被另一个生产节点显示,通常是另外一 个传感器)。

(2) 裁剪Cropping :让一个映射生成器(景深、图像、红外)能够输出帧的可选区域而区别 裁剪 于整个帧。当具备裁剪能力时, 生成的映射的尺寸被减少为适合更低的分辨率。

例如, 一个映射生成器工作在VGA分辨率 (640x480) 应用程序要裁剪在300x200, 下一个像素行从300像素后开始。裁剪在性能提升方面非常有用。

(3) 帧同步Frame Sync :让两个传感器产生帧数据(例如:深度、图像)能够同步他们的帧, 以致他们同时到达。

(4) 镜像Mirror :让生成器能够生成的数据的镜像。如果传感器放在用户面前,传感器捕捉到的影像被镜像,镜像这时很有用,这样右手就可以以镜像的体型中的左手 出现了。

(5) 姿势检测Pose Detection :让用户生成器认出用户摆出的特定姿势。

(6) 骨骼Skeleton :让用户生成器能够输出用户骨骼数据。这个数据包括骨骼关节的位置, 跟踪骨骼的位置的能力,用户校准的能力。

(7) 用户位置User Position :让深度生成器能够为场景的特定区域而优化输出特定深度映射。

(8) 错误状态Error State:使一个结点在出错的时候能报告它的状态

(9) 锁发现Lock Aware :让节点能够被上下文边界锁定。详细信息,参考在应用和锁节点间共锁发现

生成和读取数据

1.生成数据

产生数据的生产节点被称为生成器。数据生成器只等到确定指令要求才实际生成数据。函数xn::Generator::StartGenerating()用来开始生成。应用程序为了保留配置,可以 通过函数xn::Generator::StopGenerating来停止数据生成,而不必释放节点对象。

2.读取数据

数据生成器还有个输出锁存功能,其在内部储存新数据,直到收到刷新指令UpdateData ,再把最新数据传输上去。当然,OpenNI让应用程序能够等到新数据可用再刷新,指令是函数xn::Generator::WaitAndUpdateData()。

在某些情况下,应用程序操作不止一个节点,想等所有节点一起刷新。OpenNI为此

提供了几个函数,根据在UpdateData之前什么应该发生来区分:

xn::Context::WaitAnyUpdateAll(): 一旦任意一个节点有 新数据,那么刷新所有节点数据。

xn::Context::WaitOneUpdateAll(): 一旦这个节点有新 数据, 那么刷新所有节点数据。 (在当几个节点都在生成数据但只有一个节点决定了应用程序进度时,这个函数特别有用。)

xn::Context::WaitNoneUpdateAll(): 不等待。所有节点都立即刷新。

xn::Context::WaitAndUpdateAll(): 等到所有节点都有新数据是,再刷新他们。以上四个函数都是在超时两秒后退出。建议使用其中一个加上函数 UpdateAll(),除非你需要刷新特定节点。

在应用和锁节点间共享设备

说白点,不同应用程序对同一设备有不同的配置,不能这个我还没用完,你就来给我改设备的配置,这样就乱了。

OpenNI有两个模式让多个应用能够共享硬件设备:

完全共享(缺省) :在这种模式中,应用程序申明可以处理这个节点的任何配置。 OpenNI 接口让注册者能够回调任何配置改变的函数,所以,当配置发生改变,应 用就被通知(被同一个应用,或者另一个使用相同硬件设备的应用) 。

锁配置:这种模式下,应用程序声明它要锁定节点的当前配置。OpenNI 因此不允 许这个节点的”Set”函数被调用。如果节点是硬件设备(或任何其他可以在进程间共享的模块) ,他应该实现” Lock Aware”能力,这样才能跨进程边界加锁。

注意:当一个节点被锁,加锁的应用收到一个锁句柄。不同于使用这个句柄解锁,句柄用来在不解锁的情况下来改变节点配置(为了不让节点配置被其他应用“偷走”)。

Licensing 授权

模块使用授权机制来确保它们只被授权过的应用程序使用。特定的厂商的模块能被安装在特定的设备上,如果使用该模块的应用程序提供授权才能访问该模块。当OpenNI 在列表中查找合适的生产链,模块能够检查授权列表。如果要求的授权没有注册过,模 块能够隐藏自己,也就是说不返回任何结果,因此也不被算到可能的生产链中。

The Context Object 上下文对象

上下文是指拥有适用OpenNI的应用程序的全部状态的对象,包括应用程序使用的所有生产链。同一个应用可以生成多个上下文对象,但是上下文对象之间不能共享信息。上下文在使用前必须首先初始化。这个时候,所有的外挂的模块被载入和解析。应用程序通过调用shutdown函数来释放上下文对象的内存。

linux
相关资讯       OpenNI 
本文评论   查看全部评论 (0)
表情: 表情 姓名: 字数

       

评论声明
  • 尊重网上道德,遵守中华人民共和国的各项有关法律法规
  • 承担一切因您的行为而直接或间接导致的民事或刑事法律责任
  • 本站管理人员有权保留或删除其管辖留言中的任意内容
  • 本站有权在网站内转载或引用您的评论
  • 参与本评论即表明您已经阅读并接受上述条款