首页 理论教育 实现二维码扫描和识别的方法及项目结构分析

实现二维码扫描和识别的方法及项目结构分析

时间:2023-06-27 理论教育 版权反馈
【摘要】:在矩阵元素位置上,出现方点、圆点或其他形状点表示二进制1,不出现点表示二进制的0,点的排列组合确定了矩阵式二维码所代表的意义。具有代表性的矩阵式二维码有Code One、MaxiCode、QR Code、Data Matrix等。通过图像的采集设备,得到含有条码的图像,此后经过条码定位、分割和解码三个步骤实现条码的识别。如果要实现二维码的扫描以及解码,我们需要在该开源项目的基础上进行简化和修改。表8-2 ZXing支持的二维码格式分析项目结构,明确扫描框架需求。

实现二维码扫描和识别的方法及项目结构分析

二维码(Two-dimentional code)是用某种特定的几何图形按一定规律在平面(二维方向)分布的黑白相间的图形,是记录数据符号信息的方式。现实生活中,二维码的应用已经非常普遍,例如产品防伪/溯源、广告推送、网站链接、数据下载、商品交易、定位/导航、电子凭证、车辆管理、信息传递、名片交流、WiFi共享等。

二维码在代码编制上巧妙地利用构成计算机内部逻辑基础的0、1比特流的概念,使用若干个与二进制相对应的几何形体来表示文字数值信息,通过图像输入设备或光电扫描设备自动识读,以实现信息自动处理。二维条码有许多种类,常用的码制有Data Matrix、Maxi-Code、Aztec、QR Code、Vericode、PDF417、Ultracode、Code 49、Code 16K等。每种码制有其特定的字符集,每个字符占有一定的宽度,具有一定的校验功能等,还具有对不同行的信息自动识别功能及处理图形旋转变化等特点。二维码是一种比一维码更高级的条码格式。一维码只能在一个方向(一般是水平方向)上表达信息,而二维码在水平和垂直方向都可以存储信息。一维码只能由数字和字母组成,而二维码能存储汉字、数字和图片等信息,因此,二维码的应用领域要广得多。常见的二维码如图8-8所示。

978-7-111-58810-8-Chapter08-51.jpg

图8-8 常见的二维码

二维码可以大致分为矩阵式和行排式两种。

(1)矩阵式

矩形式二维码在一个矩形空间通过黑、白像素在矩阵中的不同分布进行编码。

在矩阵元素位置上,出现方点、圆点或其他形状点表示二进制1,不出现点表示二进制的0,点的排列组合确定了矩阵式二维码所代表的意义。矩阵式二维码是建立在计算机图像处理技术、组合编码原理等基础上的一种新型图形符号自动识读处理码制。具有代表性的矩阵式二维码有Code One、MaxiCode、QR Code、Data Matrix等。

在21*21的矩阵中,黑白的区域在QR码规范中被指定为固定的位置,称为寻像图形(finder pattern)和定位图形(timingpattern)。寻像图形和定位图形用来帮助解码程序确定图形中具体符号的坐标。黄色的区域用来保存被编码的数据内容以及纠错信息码。蓝色的区域,用来标识纠错的级别(也就是Level L到LevelH)和所谓的Mask pattern,这个区域被称为“格式化信息”(format information)。

(2)行排式

行排式二维码(又称堆积式二维码或层排式二维码)的编码原理是:在一维码基础之上,按需要堆积成二行或多行。它在编码设计、校验原理、识读方式等方面继承了一维码的一些特点,识读设备与条码印刷与一维码技术兼容。但由于行数的增加,需要对行进行判定、其译码算法软件也不完全与一维码相同。有代表性的行排式二维码有CODE49、CODE 16K、PDF417等。

通过图像的采集设备,得到含有条码的图像,此后经过条码定位、分割和解码三个步骤实现条码的识别。

条码的定位采用以下步骤。

(1)利用点运算的阈值理论将采集到的图像变为二值图像,即对图像进行二值化处理。

(2)得到二值化图像后,对其进行膨胀运算。

(3)对膨胀后的图像进行边缘检测得到条码区域的轮廓。

经过上述处理后得到一系列图像。

现在很多App都集成了“扫一扫”功能,如微信、QQ、手机助手等。二维码使生活变得更加简洁,扫一扫订餐、扫一扫下载等。说到二维码,不得不提Google一个开源的扫码框架:ZXing(下载地址:http://code.google.com/p/zxing/)。

ZXing是基于多种1D/2D条码处理的开源库,是一个完整的项目。它可以通过手机摄像头实现条码的扫描以及解码,功能极其强大。如果要实现二维码的扫描以及解码,我们需要在该开源项目的基础上进行简化和修改。

本例中二维码扫描的技术采用的是Google提供的ZXing开源项目。扫描条形码就是直接读取条形码的内容,扫描二维码是按照自己指定的二维码格式进行编码和解码。可以到ht-tp://code.google.com/p/zxing/下载ZXing项目的源码,然后按照官方文档进行开发。ZXing支持的二维码格式如表8-2所示。

8-2 ZXing支持的二维码格式

978-7-111-58810-8-Chapter08-52.jpg

分析项目结构,明确扫描框架需求。在ZXing中,有很多其他的功能,项目结构比较复杂二维码QRCode扫描需要如下几个包。

978-7-111-58810-8-Chapter08-53.jpgcom.google.zxing.client.Android.Camera:基于Camera调用以及参数配置,属于核心包。

978-7-111-58810-8-Chapter08-54.jpgDecodeFormatManager、DecodeThread、DecodeHandler:基于解码格式、解码线程、解码结果处理的解码类。

978-7-111-58810-8-Chapter08-55.jpgViewfinderView、ViewfinderResultPointCallBack:基于取景框视图定义的View类。

978-7-111-58810-8-Chapter08-56.jpgCaptureActivity、CaptureActivityHandler:基于扫描Activity以及扫描结果处理的Capture类。

978-7-111-58810-8-Chapter08-57.jpgInactivityTimer、BeepManager、FinishListener:基于休眠、声音、退出的辅助管理类。

978-7-111-58810-8-Chapter08-58.jpgIntents、IntentSource、PrefrencesActivity:基于常量存储的常量类。

下面是使用ZXing库识别QR码的实例。在Android2.3中创建应用项目:ZxingDemo1。(www.xing528.com)

(1)在项目配置文件AndroidManifest.xml中增加访问权限,代码如下。

978-7-111-58810-8-Chapter08-59.jpg

(2)添加core-3.0.0.jar文件到app/libs目录下,如图8-9所示。

978-7-111-58810-8-Chapter08-60.jpg

图8-9 添加ZXing库

(3)在res/layout目录下新建布局文件capture.xml,代码如下。

978-7-111-58810-8-Chapter08-61.jpg

978-7-111-58810-8-Chapter08-62.jpg

(4)源代码captureActivity.java用于实现SurfaceHolder.Callback接口,对应的函数有onCreate()、onPause()、onResume()、onDestroy(),涉及到Camera的初始化或销毁,主要代码如下。

978-7-111-58810-8-Chapter08-63.jpg

978-7-111-58810-8-Chapter08-64.jpg

Surfaceview是基于Camera实现的,SurfaceView的使用需要实现SurfaceHolder.Callback接口,在开启屏幕SurfaceView时初始化Camera。

978-7-111-58810-8-Chapter08-65.jpg

978-7-111-58810-8-Chapter08-66.jpg

接下来要初始化Camera,代码简化之后如下。

978-7-111-58810-8-Chapter08-67.jpg

在CaptureActivity中,有一个核心方法,用来返回并处理解码结果,即扫描结果。han-dleDecode()将解码的bitmap以及内容回传到开启扫描的Activity进行处理。

978-7-111-58810-8-Chapter08-68.jpg

978-7-111-58810-8-Chapter08-69.jpg

(5)源代码CodeCreator.java,用于生成Url生成二维码,代码如下。

978-7-111-58810-8-Chapter08-70.jpg

通过以上的操作过程,ZXing项目的简化工作基本完成,二维码扫描的整体构架主要包含如下三部分。

978-7-111-58810-8-Chapter08-71.jpg定义取景框,即扫描的View,通过SurfaceView进行绘制。

978-7-111-58810-8-Chapter08-72.jpgCamera,扫描的核心在于Camera的配置使用,包括预览、自动聚焦、打开设备等处理。

978-7-111-58810-8-Chapter08-73.jpgDecode解码,扫描完成后整个工程的核心。

除了以上三个模块之外,需要明确的是CaptureActivitiy中handleDeCode()方法要进行自定义处理。

(6)项目运行结果如图8-10所示。

978-7-111-58810-8-Chapter08-74.jpg

图8-10 项目运行结果

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈