APP下载

基于QR 码的智能手机增强现实系统设计

2015-01-13陈先宇

宜春学院学报 2015年3期
关键词:线程应用程序客户端

陈先宇

(重庆交通大学,重庆 400074)

近年来,有大量关于增强现实技术的研究,并且将该技术应用于各种设备上的开发,如头戴式显示器、智能手机、专用的嵌入式设备等。[1-3]增强现实技术可以用来探索周边环境、游戏或者导航。[4]无论何种目的,开发者的目标都是提供一个丰富的体验,尽可能地接近于真实,但对于设备的资源来说承受很大压力。通常情况下,这些设备尺寸小、重量轻、易携带。因为智能手机是上述设备中能力最强的,也是最常用的,所以将智能手机作为应用开发的载体。

研究更吸引人和内容更丰富的推送信息给智能手机用户的新方式,来代替传统的信息版面。一个带有摄像头的智能手机可以带用户进入一个虚拟世界,例如,在一个博物馆里,一张简单的地图可以叠加上一个描绘部队行动的动画,而图片海报可以叠加上短视频。

将QR 码作为增强现实系统的初始研究标志,是因为它在不同的移动平台上有相关的实现。[5]QR码提供两个重要特征:

(1)存储压缩信息,容量足够大,可以实现一个客户端-服务器系统来获取信息;

(2)提供简单的检测平面的手段,即通过其边角来进行定位。

以Android 系统为例,提出一个基于QR 码的智能手机增强现实系统,它让用户可以在室外和室内使用增强现实技术,也可以显示不同类型的内容。

1 系统架构

系统的基本要求就是在特殊的标志上面覆盖图片、动画或影片。例如当人们游览一个博物馆时,可以通过智能手机拍摄标志,利用增强现实技术展示更吸引人、内容更丰富的信息,丰富人们的感受。

系统使用QR 码作为标志来实现增强现实技术,因为QR 码有如下优点:包含可以用来定义内容的数据、包含关于标志物理位置的数据。但是,QR 码也存在如下缺点:识别速度慢,有效识别的角度有限等。[5]不过,一般情况下,用户使用手机拍摄QR 码时,不会与QR 码保持太大的角度,因此有效识别角度有限这一缺点可以不予考虑。而QR 码识别速度慢,但在现实应用场景中,不要求用户与虚拟信息进行实时互动,所以识别速度慢的缺点也可以接受,而且在识别完当前帧的QR 码,会沿用上一帧的增强现实内容,不会中断显示,对用户来说显示的内容是连续的。

系统的架构如图1 所示,由一个客户端和一个服务器组成,服务器的工作是存储内容、响应客户端下载内容的请求和管理数据库存在的内容;客户端接收内容并将其在智能手机上显示出来;服务器和客户端间采用一定的通信协议进行信息和数据交换。

图1 增强现实系统架构

客户端应用周期运行如图2 所示,那些步骤代表顺序执行的操作。

图2 客户端运行周期

服务器的架构则十分简单,它包含一系列响应客户端请求的Java servlet 和足够存储所有内容的空间。另外,使用一个Web 管理模块,负责内容的增加、删除或修改。系统使用Google 公司提供云计算平台——Google App Engine,作为集成的存储系统。

2 系统设计

为了加快实际内容的展示,充分利用设备的处理能力,设计了一系列模块,模块彼此之间独立运行。另外,为了确保内容显示模块不会被其他进程拖慢速度,使用管道编程模型。每个模块读取输入缓存区的数据,处理之后将数据写入另一个缓存区给另一个模块使用。例如,当内容下载模块必须连接服务器并获取内容时,其他模块不需要等待,而是保持运行状态,处理它们现有的数据。

(1)模块和线程

系统将运行过程整合成几个独立的模块,这些模块可以通过独立的线程并行运行。这样一来,可以尽可能快地将需要显示的内容显示在屏幕上。

系统的模块如下:

(a)图像获取模块:初始化摄像头,获取每一帧图像;

(b)QR 码识别模块:搜索图像帧中的QR码,并将其解码;

(c)平面检测模块:使用QR 码的四个定位点,计算透视变换矩阵;

(d)内容获取模块:搜索设备内存,获取相应内容,搜索不到则连接服务器下载;

(e)内容变换模块:将需要显示的内容按照(c)模块得出的透视变换矩阵进行透视变换;

(f)内容显示模块:将正确的增强现实效果,即(e)模块变换后的内容呈现在获取的视频帧上。

如图2 所示,内容变换模块和内容显示模块作为一个步骤,只要内容变换模块不提供新的输出,内容显示模块将一直呈现同一个图像,这样可以减小QR 码识别速度慢的问题对显示的影响。

图3 为所有模块的分层结构,更好地解释数据的独立性和所有模块处理一组数据的顺序。图4 为应用于之前定义的模块中的管道编程模型,相邻两个模块之间设置一个缓存区,供两者交换数据,前者将其作为输出地址,后者将其作为输入源,采用管道编程模型后。

图3 系统模块的分层结构

图4 模块间的管道编程模型

(2)内容高速缓存机制

客户端应用程序将所有已下载的内容存储到本地设备中,以便这些内容可以再次载入显示,并且不需再次连接服务器去获取。

当客户端解码QR 码后,获取了内容ID,应用程序检查这些内容是否在本地可以找到。为了实现这一功能,设计了一个固定的文件夹格式,将所有内容存储路径设置为:/sdcard/ARinfo/ [ContentID],其中[ContentID]为内容ID。如果某个内容文件没有被找到,那么应用程序将发送请求给服务器,下载相应内容。

本系统设计内容高速缓存的原因是从内存中载入内容比从服务器下载快得多。就图像或动画来说,处理过程几乎是实时的;但视频的载入需要更多的时间,获取视频文件所需的缓存机制也需要高速缓存,当整个视频文件过大时,是无法完全载入到内存中的。如果没有高速缓存,就无法快速加载视频,实现不了实时视频流。

(3)内容存储

永久的内容存储在服务器上实现,系统使用Google App Engine API 提供的Datastore 和Blobstore。Blobstore 用来存储实际内容文件和它的索引;而所有其他元数据(如内容ID)则存储在Datastore。服务器的接口允许管理员轻松地通过客户端添加内容。

3 系统实现

系统使用两个Java 库确保应用运行得正确而快速:Open CV 和Zxing,Open CV 用来检测平面,Zxing 用来读取二维码,客户端执行程序的伪代码如下:

while (app 在前台){

从摄像机缓存中复制视频帧

使用Zxing 寻找视频帧中的QR 码if (QR 码存在){

解码服务器地址

解码内容ID

保存QR 码的定位角信息

}

else

continue

if (内容在内部存储器)

将内容载入内存

else {

从服务器下载内容

将内容载入内存

}

使用QR 码定位角信息检测平面

将内容进行相应的透视变换

显示变换后的内容

}

对于无声动画,本系统采用GIF 格式,将图像帧与主执行线程同步。因为不需要所有帧都被处理或者显示,所以加快了处理速度。

对于音频/视频材料,本系统获取视频源的单个帧后,与音频源同步,但是这样一来,处理速度大大下降,以致图像最终显示中断。为了显示这些视频,ffmpeg 库的移植是必要的。本文使用Android Native Development Kit (原生开发工具包,简称NDK)对ffmpeg 库进行编译,以便它可以在本文的Java 应用程序使用。库内的C 代码可以很容易地通过Java Native Interface (Java 本机接口,简称JNI)从Java 中调用。这个库主要用于在特定的时间戳从视频文件中提取单个帧。视频文件的音频流的渲染使用Android-specific MediaPlayer (针对Android 的媒体播放器),音频通过使用相同的时间戳与视频同步。

应用程序的内容类提供对所有可以显示的文件类型的统一访问。因此,无论处理一幅图像、一个动画或一段影片,都确保内容变换模块使用正确的图像。对于视频或动画,主执行线程负责调用nextFrame ()方法,发送信号到需要一个新图象的内容类。

用户界面包括两个activities:

(1)Main Activity

Main Activity 用来显示摄像头拍摄到的画面,同时叠加上相应的虚拟图像。从操作系统而来的重要信息,如事件(当应用程序退到后台或提到前台),也在这接收。当应用程序启动或者提到前台时,重要的操作被执行,如启动工作线程或获取接入和初始化摄像头。

(2)Settings Activity

Settings Activity 负责显示配置选项。用户可以选择显示内容的语言,摄像头分辨率,也可以选择打开调试信息。这个activity 可以通过按下Settings按钮来接入,允许用户在较低性能的设备上降低分辨率,以提高内容显示的速度。

由于应用程序依赖摄像头提供的图像,所以无法在没有摄像头的设备上运行。应用程序最重要的一个方面是操作系统执行的方式,来确保摄像头提供的预览不受影响或延误,在Android 操作系统中使用线程要遵循两个重要的规则:

(1)管理用户界面的主线程不允许因为长操作(long operations)而停滞。如果发生这样的事情,用户将被告知应用程序需要一段很长时间来执行,它可以决定它是否被停止或等待它恢复正常操作;

(2)任何属于用户界面的图像元素只可以通过主线程获取。

图5 应用程序截屏

4 结语

基于QR 码的增强现实系统旨在成为一个通用的增强现实应用程序,可以用在任何场景,将丰富和动态的内容覆盖到场景中的QR 码。系统通过平面检测,得到透视变换矩阵,来计算并呈现最终的图像,让它们看起来像是周围环境的一部分。客户端的架构基于管道结构,目的是最小化负责在设备屏幕上显示图像的模块的延迟。每个模块在自己的线程中运行,从上一级缓存获取输入数据,然后将输出数据写入下一级缓存。这很好地匹配了Android 应用设计模式,负责显示摄像头预览的主UI线程不会被延迟。另外,系统提供了一个内容高速缓存的机制,来提高屏幕显示增强现实内容的速度。本系统达到了虚拟与现实相结合的目的,增强了用户体验,具有一定的研究和实用价值。

[1]Hirokazu Kato,Mark Billinghurst.Marker tracking and hmd calibration for a video-based augmented reality conferencing system[C].San Francisco,Proceedings of the 2nd IEEE and ACM International Workshop on Augmented Reality,1999:85-94.

[2]史晓琳,边耐政. 手机增强现实室内向导的研究与实现[J]. 计算机应用与软件,2013,30(2):320-323.

[3]陈灿鑫. 移动增强现实中跟踪注册的关键技术研究[D]. 华南理工大学,2013:1-4.

[4]幸国王. 基于Android 平台的移动增强现实技术综述[J]. 电子科学技术,2014,01(02):206-211.

[5] MacRae,Duncan A.Introducing QR codes:linking print and digital content via smartphone[J].Neurosurgery,2011,68(4):854-855.

猜你喜欢

线程应用程序客户端
基于C#线程实验探究
基于国产化环境的线程池模型研究与实现
线程池调度对服务器性能影响的研究*
删除Win10中自带的应用程序
如何看待传统媒体新闻客户端的“断舍离”?
谷歌禁止加密货币应用程序
县级台在突发事件报道中如何应用手机客户端
孵化垂直频道:新闻客户端新策略
大枢纽 云平台 客户端——中央人民广播电台的探索之路
三星电子将开设应用程序下载商店