物联传媒 旗下网站
登录 注册
RFID世界网 >  技术文章  >  其他  >  正文

基于Android嵌入式平台的QR码识别系统

作者:RFID世界网收编
来源:RFID世界网
日期:2012-03-05 10:33:34
摘要:介绍了QR 码的基本结构,分析了在基于Android 嵌入式平台上QR 码图像数据的二值化、定位、旋正等图像的预处理,进而实现对QR 码进行解码。经测试表明,系统对倾斜、模糊的QR 码都可以快速地识别。

  QR 码又称快速响应矩阵码,是日本Denso 公司于1994 年开发的一种二维码,它具有信息密度高、可全方位识别、可靠性高等优点,并可以很好地表示汉字。

  我国于2000 年发布了QR 码的国家标准,随着QR 码在各领域的推广和智能手机的快速发展,如何在智能手机中较好地识别QR 码是一项值得研究的课题,文中将主要讨论在Android 平台下识别QR 码。

  1 QR 码符号结构

  QR 码属于矩阵式二维条码,每个QR 码符号都是由正方形模块组成的一个正方形阵列结构,它由功能图形和编码区域组成,功能图形不用于数据编码,它包括寻像图形、分隔符、定位图形和校正图形。编码区域包括数据码字、纠错码字、版本信息和格式信息。QR码共有40 种规格,分为版本1 ~ 版本40,规格为: 21模块× 21 模块~ 177 模块× 177 模块。QR 码具有高信息密度、高识别速度以及高可靠性等特点。QR 码的符号结构如图1 所示。 


  2 系统的流程

  系统在基于Android 平台上使用Java 和C ++ 语言一同实现。系统主要分为图像采集模块、图像预处理模块和条码识别模块。图像采集模块主要利用摄像头来完成条码图像的采集,并将采集的图像在屏幕上显示;图像预处理模块主要是对采集的条码图像进行灰度、二值化、定位、矫正等处理,条码识别模块主要根据QR 码标准来对条码数据进行提取。系统流程图如图2 所示。 

  3 QR 码的识别算法 

  3. 1 图像二值化 

  图像的二值化是把灰度图像转成黑白图像,这样更有利于图像处理的判别,灰度阈值的变换函数如下 


  如何确定阈值T 是二值化算法的关键,它决定了图像二值化的效果。文中采用OTSU 算法[3,5],假设图像分割的阈值为t( 0≤t < 256) ,≤t 的为前景像素,> t 的为背景像素,设前景点数占图像比例为w0,平均灰度为u0; 背景点数占图像比例为w1,平均灰度为u1。则图像的总平均灰度为 


  取得最大值时,t 就为图像的最佳阈值。对式( 2) 进行化简,得 


  这样则大大减少了计算量。
 
  3. 2 QR 码的定位 

  为检测QR 码的位置,利用QR 码的位置探测图形的特征。由图3 可见,当直线穿越探测图形中心时,从左至右的深浅比例依次是1∶ 1∶ 3∶ 1∶ 1,而且这个比例不随图像的大小和旋转而改变,所以可以利用此特性来检测QR 码的位置。


 

  根据探测图形的比例特性,对图像由水平和竖直方向进行扫描,当遇到深浅比例按1∶ 1∶ 3∶ 1∶ 1 出现时,记录其行或列的位置,并继续搜索相邻行和列,直至所有的行和列被扫描到,记录最先出现的行与列的位置。这样一共可以得到4 条直线,围成一个正方形,正方形对角线的交点即为探测图形的中心,同理,可以确定其他两个探测图形的中心。连接探测图形的3 个中心点,可以计算出3 条边的大小,根据三角形大边对大角的原则,可以选择一条直角边,计算出它的倾斜角,然后将图像旋正。 

  3. 3 图像的旋转 

  这里采用双线性插值[4]对图像进行旋转,而不是利用最邻插值法,因为它会使图像产生锯齿形的边界,干扰条码的识别。双线性插值的数学模型如图4 所示。 


  f( x,y ) 为两个变量x,y 的平滑函数,假设它所在单位正方形的4 个顶点的值为f( 0,0) 、f( 0,1) 、f( 1,0) 、f( 1,1) ,则可以利用双线性插值求出正方形内任意点( x,y) 的值f( x,y) ,首先对两个顶点进行插值得


  图5( a) 为倾斜的条码,图5( b) 为采用双线性插值旋转的结果,实验表明,双线性插值处理后得到的图像具有良好的效果,有利于条码识别。 


{$page$}

  3. 4 图像的矫正
 
  由于在拍摄时,摄像头的角度不会完全垂直于二维条码平面,因此拍摄到的条码或多或少会有透视效果,在手持手机拍摄时,这个问题很常见,也是图像处理中的难点。这里使用反透视算法[7],能够对图像进行反透视矫正。设三维失真空间中的一点坐标[x',y ',z'],其其次坐标可以设为[x',y',z',1]T ; 三维基准空间中对应点坐标[x,y,z],其其次坐标设为[x',y',z',k]T,因此有公式为 


  在上述定位算法中,得到了条码的3 个探测图形中心点的坐标,因此可以得出条码4 个顶点的坐标,根据如下基准点与失真点的映射关


  根据式( 7) 和式( 8) ,可以得出 


  一般地P = 1,k = 1,失真图像和校正后的图像共面,那么z = z' = c,c 是常数,令c = 0,可以将( 9) 简化为 


  可以根据条码的4 组顶点,求出8 个待定系数A,B,D,E,F,H,M,N,然后对条码的每个点进行矫正。
 
  4 QR 码识别系统在Android 平台上实现 

  4. 1 Android 简介 

  Android 是基于Linux 平台的开源手机操作系统,它采用软件堆层的架构,主要分为3 个部分: 操作系统、中介软件和应用程序。底层以Linux 内核工作为基础,用C 语言开发,只提供基本功能; 中间层包裹函数库Library 和虚拟机Virtual Machine,由C ++ 开发;最上层是各种应用软件,包括通话程序,短信程序等,主要以Java 作为编程语言。
  为能够快速地处理大量的数据,Android 也提供了以C /C ++ 作为开发语言的NDK( Native Developer Kit)平台,它编译生成的. SO 动态链接库可以供AndroidSDK( Software Development Kit) 平台下的应用程序调用。在本系统的实现中,因为图像的预处理和解码部分要进行大量数据运算,所以把这两部分的程序放在NDK 下完成,摄像头启动与图像采集在SDK 下实现。由于Android 的虚拟机Dalvik 不能执行. class 文件,所以要把. class 文件的字节码转换成. dex 文件的字节码,识别系统的编译过程如图5 所示。 

  4. 2 图像的采集 

  系统在手机上实现,图像的采集[2 - 6]是重要的一步,在Android 平台上,是使用Camera 类来完成摄像头的调用和图像采集。使用Camera mCamera = Camera.open ( ) 获得Camera 的实例,然后使用Camera.Parameters 来设置获得图像的大小,最后通过实现Camera. Preview - Callback 的接口onPreviewFrame( byte []data,Camera camera) 来获得摄像头的图像数据。图像数据data 为YUV 格式,其中Y 分量的大小为 mageWidth* ImageHeight 个字节,U 分量的大小为0. 25 × ImageWith* ImageHeight 个字节,V 分量的大小和U 分量一样,因为条码是黑白色,Y 分量正好包含的是图像的灰度信息,将省去对图像进行灰度化的处理,所以在取图像数据时,只取Y 分量进行处理。 

  4. 3 自动对焦 

  为能够较快地获得清晰的图像,提高识别速度,文中使用了自动对焦技术。关键代码如下:
  ( 1) 实现自动对焦的接口
  AutoFocusCallback Camera. AutoFocusCallback mAutoFocusCallback =
  new Camera. AutoFocusCallback( )
  {
  Public void onAutoFocus( boolean success,Camera
  camera)
  {
  mCamera. setOneShotPreviewCallback ( mPreviewCallback)
  ;
  }
  }
  ( 2) 创建一个定时器
  创建定时器的目的是使手机每隔一段间隔就自动对焦一次。定时器内的代码如下: 

  mCamera. autoFoucs( mAutoFocusCallback) ; 

  5 结束语 

  文中研究了QR 码的识别技术,讨论了在Android平台上实现系统的技术问题,并结合数字图像处理技术,在Android 手机平台上进行了QR 码的识别技术的开发。根据图像的大小,本系统在三星i9000( CPU 型号ARM Cortex A8,主频为1 GHz,内存512 MB,操作系统为Android OS v2. 1) 上分别对100 幅图像进行了测试,结果如表1 所示。