基于Symbian智能手机的QR码识别系统_第1页
基于Symbian智能手机的QR码识别系统_第2页
基于Symbian智能手机的QR码识别系统_第3页
基于Symbian智能手机的QR码识别系统_第4页
基于Symbian智能手机的QR码识别系统_第5页
已阅读5页,还剩2页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、    基于Symbian智能手机的QR码识别系统        温 明1,李 颢2,卓 晴 时间:2008年07月16日     字 体: 大 中 小        关键词:<"cblue" " target='_blank'>三种<"cblue" " targe

2、t='_blank'>异常处理<"cblue" " target='_blank'>识别系统<"cblue" " target='_blank'>掩模<"cblue" " target='_blank'>应用程序            ? 摘 要: 介绍了QR码识别的基本原理,并设计

3、了一个基于Symbian智能手机的QR码<"cblue" " title="识别系统">识别系统,重点说明了系统在Symbian平台上实现时,图像采集、<"cblue" " title="异常处理">异常处理和代码移植等方面的问题。测试表明,该系统可以快速、准确地识别QR码,并有效地处理图像倾斜和投影形变等问题。? 关键词: QR码? 智能手机? Symbian操作系统? Series 60平台? 由于内置高分辨率摄像头手机的逐渐普及,催生了一种新的二维码应用模式手机二维

4、码。手机二维码是指将相关信息使用二维码编码,并以各类业务的形式在手机里存储、阅读和传播1。手机既是二维码信息的载体,也是二维码的识读设备。目前,手机二维码在欧美、日韩等发达国家和地区已有较成熟的市场应用。2006年9月,中国移动也正式推出了手机二维码业务,并表示手机二维码将会成为移动增值服务的重要内容之一。? QR码(Quick Response Code)是由日本Denso公司于1994年9月研制的一种矩阵式二维码,它除具有其他二维码所具有的信息容量大、可靠性高、可表示汉字及图像有多种文字信息、保密防伪性强等优点外,还具有如下主要特点:超高速识读,全方位识读,能够有效地表示中国汉字和日本汉字

5、2。本文设计了一个基于Symbian智能手机的QR码识别系统,重点介绍了系统在Symbian平台上实现时需要注意的关键问题。测试表明,该系统可以快速、准确地识别QR码,并能有效地处理图像倾斜和投影形变等问题。1 QR码符号简介? QR码符号是由正方形模块构成的正方形阵列,它由编码区域和功能图形构成。其中,编码区域包含格式信息、版本信息、数据和纠错码字;功能图形由寻像图形、分隔符、定位图形和校正图形组成。QR码符号共有40种规格。版本1的规格为21×21模块,每一版本的符号比前一版本每边增加4个模块,直到版本40,规格为177×177模块。QR码符号的示例见图1。?2 QR码

6、的识别? 这一过程的基本思路是将摄像头采集到的彩色图像I(x,y)进行灰度化;然后用适当的阈值T对灰度图像进行二值化处理,从而得到二值图像B(x,y);接着在二值图像中扫描位置探测图形,通过3个位置探测图形,求出QR码的4个顶点坐标和旋转角度,然后将QR码旋转至水平位置,并把QR码从图像I(x,y)分割出来。2.1 图像的二值化? 图像二值化的关键在于阈值的选取。二值化阈值计算方法主要有直方图双峰法、微分直方图法和最大类间方差法。在基于手机的QR码识别系统中,由于人在拍摄过程中会有意识地“瞄准”QR码符号,并使其尽量充满取景器的主要区域,因此采集到的QR码图像一般都比较简单,浅色的背景与条码基

7、本模块构成的正方形阵列形成了较大的反差,其直方图经过平滑之后,呈现出明显的“双峰”特性。这样,使用简单的直方图双峰法就可以快速地确定图像的二值化阈值。2.2 QR码的定位? QR码符号的寻像图形包括3个相同的位置探测图形,分别位于左上角、右上角和左下角。每个位置探测图形可以看作是由3个重叠的同心正方形组成,它们分别为7×7个深色模块、5×5个浅色模块和3×3个深色模块。位置探测图形的模块宽度比为1:1:3:1:1。符号中其他地方遇到类似图形的可能性极小,因此可通过识别这三个位置探测图形来确定视场中符号的位置和方向,从而使迅速识读QR码符号成为可能。在图2中,a、b

8、、c为QR码符号旋转不同角度时穿过位置探测图形中心的扫描线。可以看出,旋转的角度不影响扫描线上的模块宽度之比。实际中,由于噪声、投影形变等因素的影响,应该允许这个比例有一定的偏差。?2.3 图像的旋转检测到3个位置探测图形之后,就可以计算出QR码的4个顶点坐标和旋转角度。根据这些参数即可将QR码旋转至水平位置并从图像中分割出来。在对图像做旋转时,变换之后的坐标不一定是整数,因此要对变换之后整数坐标的像素值进行估计。这里采用的是双线形插值算法。假设输出图像某像素的位置坐标通过反向变换得到的浮点坐标为(i+u,j+v),其中i,j为非负整数,u,v为0,1)区域的浮点数,则该像素的值f(i+u,j

9、+v)可由原图像中坐标为(i,j)、(i+1,j)、(i,j+1)、(i+1,j+1)的4个像素的值决定,即3:? f(i+u,j+v)=(1-u)(1-v)f(i,j)+(1-u)vf(i,j+1)+u(1-v)f(i+1,j)+uvf(i+1,j+1)? 将QR码从图像中分割出来之后,建立采样网格,对网格的每一交点上的图像像素取样,即可得出QR码符号的位图矩阵。3 QR码的解码? 这一过程将QR码符号数据按照QR码标准进行解码,从而得到存储在其中的用户信息。解码的流程如下2:? (1)识读格式信息,按需要去除<"cblue" " title="

10、掩模">掩模图形并完成对格式信息模块的纠错,识别纠错等级与掩模图形参考。? (2)识读版本信息,确定符号的版本。? (3)用掩模图形(掩模图形参考已从格式信息中得出)对编码区域的位图进行异或处理,消除掩模。? (4)根据模块排列规则,识读符号字符,恢复信息的数据与纠错码字。? (5)用与纠错级别信息相对应的纠错码字检测错误,如果发现错误,立即纠错。? (6)根据模式指示符和字符计数指示符将数据码字划分成多个部分。? (7)按照使用的模式译码得出数据字符并输出结果。4 QR码识别系统在Symbian平台上的实现4.1 Symbian操作系统? 智能手机是一种拥有开放型操作系统的手

11、机,用户可以在这个平台上安装各种各样的<"cblue" " title="应用程序">应用程序,从而使手机的功能得到无限扩充。目前,主流的智能手机操作系统有<"cblue" " title="三种">三种:Symbian、Windows Mobile和Linux。其中Symbian以其平台的开放性、较低的授权费用、众多厂商的支持、对硬件要求低、第三方软件丰富等优势,成为智能手机市场上应用最为广泛的产品。Symbian由Psion公司的EPOC(Electronic Pie

12、ce of Cheese)操作系统发展而来,是一个32位的多任务操作系统,其内核由基础组件(微核、设备驱动程序和用户库)、中间件(系统服务、安全和应用程序框架)和通信组件(电话、消息和个人区域网络)构成4。由于不同的终端产品在屏幕尺寸、用户输入方式等方面的差异,Symbian给出了用户界面风格的三种参考设计:Pearl、Crystal和Quartz,最终演变为Symbian上的三种主要平台:Series 60、Series 80和UIQ。Series 60针对屏幕分辨率为176×208像素、单手操作的智能手机;Series 80针对屏幕分辨率为640×200像素、采用标准键

13、盘输入的高端智能手机;UIQ针对采用笔式输入(触摸屏)的智能手机。其中Series 60是应用最为广泛的平台。本系统就是在基于Symbian Series 60平台的手机上实现的。4.2 图像采集? 系统在手机上实现时, 待识别图像的采集是一个比较关键的问题。在Series 60平台上,CCamera类包装了摄像头相关的API。为了使用这些API,应用程序必须实现一个MCameraObserver(或MCameraObserver2)的派生类。MCameraObserver类与CCamera类之间的关系是观测者设计模式(Observer Design Pattern)在Symbian系统中的具

14、体体现。图像采集可通过以下三种方式实现:? (1)用CCameraCaptureImage()启动静态图像的捕获。当其调用完成之后,MCameraObserverImageReady()会被异步调用。用户可在该函数中访问刚刚捕获的图像。此方式一般用来实现手机的照相功能。? (2)用CCameraStartVideoCapture()启动视频捕获。当视频缓冲区被预置数目的视频帧填充之后,MCameraObserverFrameBufferReady()会被异步调用。用户可在该函数中访问视频缓冲区。此方式一般用来实现手机的摄像功能。? (3)用CCameraStartViewFinderBitma

15、psL()启动取景器(View Finder)数据的传输。当其调用完成之后,MCameraObserverViewFinderFrameReady()会被周期性地调用。用户可在该函数中访问刚刚获取的视景帧(View Finder Frame)。此方式一般用来实现手机照相或摄像过程中的取景器功能。? 第一种方式采用非连续模式采集图像,效率较低且不利于人在识别过程中的主动参与。第二种方式虽是连续模式,但在视频采集过程中,摄像头的闪光灯会一直亮着,不符合低功耗原则。第三种方式采集图像的分辨率高,有利于识别精度的提高,但会增加处理时间。最终采用第三种方式并折中处理,选择400×300的分辨率

16、。? ViewFinderFrameReady()函数的处理流程如图3所示。视景帧是一个CFbsBitmap类型的位图对象。可以通过CFbsBitmap:DataAddress()函数获得位图中第一个像素(位于位图的左上角)的地址,从而实现对位图数据的直接访问。视景帧根据手机类型的不同,具有不同的颜色格式。所以需要首先通过CFbsBitmapDisplayMode()函数获得图像的颜色格式,然后采用相应的方式获取各像素的R、G、B分量,以便将彩色图像转换为灰度图像。?4.3 异常处理? 对手机而言,内存泄漏是十分严重的问题。因为手机的内存资源非常有限,而它又通常会连续运行很长时间不重启,这样,

17、异常处理就显得尤为重要。Symbian系统采用了一套不同于标准C+的异常处理机制。? Symbian对异常处理的基本支持包括:(1)TRAP和TRAPD宏,用作捕获异常,类似于标准C+中的try和catch。(2)异常退出(Leave)机制,其作用类似于标准C+中的throw。? 清理栈(Cleanup Stack)是Symbian避免内存泄漏的主要手段之一。请看如下示例代码:void DoExampleL()CSomeObject*myObject=new(ELeave) CSomeObject;CallLeavingMethodL();delete myObject;? 代码使用重载的操作

18、符new(ELeave)为CSomeObject类的新实例分配动态内存。在Symbian中,为简单对象在堆内存上分配空间基本都采用这种方式。ELeave参数表明内存分配失败时会发生异常退出。传统的new操作符无法利用异常退出机制,只是在极少数情况下才被使用。CallLeavingMethodL()是一个调用时可能会发生异常退出的函数。当CallLeavingMethodL()发生异常退出时,DoExampleL()的函数栈会被释放。这就意味着,局部指针变量myObject会被销毁,但它指向的堆内存却没有被释放,从而发生了内存泄漏。Symbian使用清理栈(CleanupStack类在e32ba

19、se.h中定义)来解决这个问题。基本用法是:在调用可能会发生异常退出的代码之前,使用PushL()方法将任何指向堆内存的局部指针压入清理栈内。若发生异常退出,清理栈确保所有相关的资源都被释放。如果没有发生异常,则使用Pop()方法将那些指针弹出。这样,DoExampleL()函数可以修改为:void DoExampleL()CSomeObject*myObject=new(ELeave) CSomeObject;CleanupStackPushL(myObject);CallLeavingMethodL();CleanupStackPop(myObject);delete myObject;?

20、 可以使用“CleanupStackPopAndDestroy(myObject);”代替上述代码的最后两句。有三种情况可能会使代码发生异常退出:? (1)使用了退出函数:UserLeave(),UserLeaveIfError(),UserLeaveNoMemory(),或UserLeaveIfNull()。? (2)使用了重载的new(ELeave)操作符。? (3)调用了一个可能会异常退出的函数。? 构造过程中需要分配资源的对象被称为复杂对象,其所属类通常为CBase类的派生类。在堆内存上构造复杂对象时,若其构造函数发生异常退出,则会发生内存泄漏。所以复杂对象采用两阶段构造过程,这是Sy

21、mbian避免内存泄漏的另一主要手段。例如,使用CText类表征解码之后的文本,它的一个私有成员变量textBuf8为指向HBuf8类描述符(Symbian主要使用描述符来处理字符串)的指针。下面为两阶段构造过程的示例代码:/第一阶段构造CTextCText()/第二阶段构造void CTextConstructL(TUint aMaxTextLength) textBuf8=HBufC8NewL(aMaxTextLength);? 这样,每次构造复杂对象都需要两行代码。为了避免这个麻烦,通常会提供两个静态成员函数:/不将指向函数返回对象的指针留在清理栈内CText*CTextNewL(TUi

22、nt aMaxTextLength)?CText*self=CTextNewLC(aMaxTextLength);CleanupStackPop(self);return self;/将指向函数返回对象的指针留在清理栈内CText*CTextNewLC(TUint aMaxTextLength)CText*self=new(ELeave) CText;CleanupStackPushL(self);self->ConstructL(aMaxTextLength);return self;4.4 代码移植? 系统开发并不需要从零开始编写所有程序,有很多地方(例如直方图双峰法、双线性插值和RS码纠错算法等)可将现成的Windows平台的代码移植到Symbian平台上来。在移植过程中,除了异常处理方式需要改变之外,还需要注意以下几点:? (1)将标准C+的内建数据类型替换为对应的或者合适的Symbian C+的基本数据类型,以保持平台的独立性。例如,用TInt类型替换int类型。? (2)在Symbian系统中,由于GUI应用程序(后缀为.app的程序)的栈的默认尺寸只有8KB,所以不要在这类程序中使用尺寸较大的局部变量。遇有需要的情况(例如大数组),将对象分配在堆内存上。? (3)在Symbian 8.1a及以前版本的操作系统中,DLL(Dynam

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论