1、 毕业设计(论文) 题目名称:二维码生成与识别系统的设计与实现 二维码的解码器 2014 年 5 月二维码生成与识别系统的设计与实现 二维码的解码器Design and Implementation of Two-Dimensional Code Generation and Recognition system The Two-Dimensional Code Decoder 2014 年 5 月 摘要条码技术是一种融编码,印刷,数据采集和处理与一体的自动识别技术。条码分为一维码和二维码。二维码除了具有一般一维码的优点外还具有信息容量大,可靠性高的优点。本论文首先介绍了二维码的种类,并介绍了
2、QR Code的编码规则。 然后分析了基于图像处理的二维码解码算法的一般过程 , 并对图像预处理 二维码 的定位与校正以及数据纠错过程中涉及到的关键算法进行分析比较针对快速响应 矩阵码( Q R c o d e ) , 详细设计基于图像处理的Q R码解码算法 , 为了降低算法复杂度并提高识别效率 , 改进了二维码图像的二值化算法和Q R码定位算法。并对算法改进后的执行效率以及容错性能进行分析 , 结合算法执行时间分析结果对关键算法进行优化。 实验结果表明, 改进 的 Q R 码解码算法执行效率较 高而 且稳 定 ,并且在 光照不均 存在 噪声 以及 图像变形等情 况下均可以正确解码 。关键词:
3、 图像处理; 二维码识别; 二维码解码算法 Abstract Barcode technology is an automatic identification technology that is consist of coding,printing,data acquisition and processing. Barcode can be divided into one-dimensional barcode and two-dimsional barcode. In addition to the advantages of the one-dimensional barcode,
4、two-dimensional barcode also has the information capacity, and high reliability. This paper introduces the types of 2D barcode and the QR Code encoding rules . Then,analyze 2D barcode decoding algorithm that is based on image processing,compare the different algorithm in the processing of image pre-
5、processing ,position and adjustment and data correction .Then detailed design the decoding algorithm for QR Code,improve the binarization algorithm for 2D barcode image and QR Code positioning algorithm . By analyzing the execution time of the decoding algorithm ,find and optimize the key algorithms
6、.The experimental results show that the improved QR Code decoding algorithm is efficient and stable ,and can identify the QR Code image uneven illumination,with noise or deformation. Key Words: Image processing; Two-dimensional code recognition; 2D barcode decoding algorithm 目 录摘要IAbstractII目 录III第1
7、章 绪论11.1研究背景与意义11.2 二维码识别技术的当前研究现状11.3 研究内容31.4 论文组织结构3第2章 QR码编码规则42.1 QR码符号结构42.2 QR码编码方法5第3章 二维码识别系统的总体框架83.1二维码识别系统的目标83.2二维码识别系统的功能需求83.3 二维码解码功能的设计93.3.1二维码识别系统总体流程实现规划93.3.2 图像预处理模块流程103.3.3 二维码译码模块流程113.4.软件开发平台11第4章 图像预处理模块的设计与实现124.1 彩色图像灰度化124.2 图像去噪124.3 图像二值化13第5章 二维码解码模块的设计与实现155.1 二维码解
8、码流程155.2 探测图像识别的设计与实现155.2.1 寻找探测图形155.2.2 图像校正185.3 二维码版本信息确定的设计与实现185.3.1 确定每个模块的宽和高185.3.2 二维码粗略版本确定195.4 二维码模块采样的设计与实现205.4.1 二维码差分图像205.4.2 二维码模块采样215.5 二维信息解码的设计与实现225.5.1 版本信息的确定225.5.2 二维码格式信息的实现245.5.3 去除二维码掩膜的实现255.5.4 得到数据流265.5.5 数据纠错275.5.6 各模式下的译码27第6章 系统的调试、运行与测试306.1 系统开发过程中的问题与解决方法3
9、06.1.1 关于寻像图形的寻找306.1.2 关于二维码的版本信息306.1.3 二维码模块的采样306.1.4 加载静态库306.2 系统的运行与测试316.2.1 运行结果316.2.2 运行性能分析32第7章 结 论34致 谢35参考文献36附录37附录A: 主要源程序37附录B: 软件使用说明书44V第1章 绪论 本章首先介绍本文课题研究背景与意义 , 然后从二维码的识别技术当前研究现状, 最后介绍了本文的研究内容工作描述以及论文的组织结构。1.1研究背景与意义一维条码是由一组粗细不同,黑白相同的,条,空及相对应的字符(数字字母)组成的条形符号,只是在一个方向(一般是水平方向)表达信
10、息,在垂直方向不表达任何信息,其一定的高度一般是为了便于阅读器的对准。但是一维条形码存储的数据容量较小(30个字符左右),只能包含字母和数字,条码尺寸较大(空间利用率很低)并且一旦损坏就不能识别。二维条形码是在一维条形码的基础上发展起来的,是用某种特定的几何图形按一定的规律在平面上分布的条,空相见的图形来记录数据符号信息,克服了一维码的缺点。并且由于二维码的信息密度高,存储量大,纠错能力强,而且其本身具有一定的防伪功能而得到迅速发展。国外的二维码技术已经处于应用阶段,并且已研制了性能较好的二维码识别系统。而我国虽也研制出了用于识别二维码的系统,但和国外相比还是有一定的差距的。由于二维码这种新兴
11、的自动识别技术有其他自动识别技术无法比拟的优势,它一出现就受到的很高的重视。本文研究的解码技术主要针对的是QR码。QR码是由日本Denso公司于1994年9月研制的一种矩阵二维码符号,它除具有一维条码及其它二维条码所具有的信息容量大、可靠性高、可表示汉字及图象多种文字信息、保密防伪性强等优点外,还具有如下主要特点:普通的一维条码只能在横向位置表示大约20为的字母或数字信息,无纠错功能,使用时候需要后台数据库的支持,而二维条码是横向纵向都存有信息,可以放入字母、数字、汉字、照片、指纹等大量信息,相当一个可移动的数据库。如果用一维条码与二维条码表示同样的信息,QR二维码占用的空间只是条码111的面
12、积。二维码已广泛应用与社会的各个系统,如商品信息获取,网站跳转,广告推送,手机电商,防伪追溯,优惠促销,会员管理,手机支付等,因此研究二维码的识别系统具有很重要的意义。1.2 二维码识别技术的当前研究现状 二维码的识别系统主要包括两类:专用二维码扫描器和安装有二维码解码软件的智能平台.下面主要介绍基于软件的二维码识别的发展现状。二维码扫描器的生产商主要有 ARGOX公司Symbol讯宝公司(2004年被摩托罗拉公司收购)CIPherlab公司以及国内的福建新大陆公司ARGOX公司的AS一 950影像式二维码扫描器具备绿光指引功能。快拍(QuickMark)二维码是目前移动终端上最快的一维码二维
13、码解码软件之一 , 支持 Apple105 Android Windows phone 和symbian560四种智能手机平台 , 具有快速识别自动解码等功能并针对互联网应用 ,增加一维码产品信息查询联网搜索信息二维码生成分享网址 URL直接访问等功能 。我查查是一款基于图形传感器和移动互联网的商品条形码比价的生活实用类手机应用。条码扫描支持一维EAN码、QR码(二维码)、二维WEPC码和快递单号(code128码)等。通过我查查,照一照商品条码,哪家店有卖、售价多少、店家的电话地址、营业时间、网址等等信息,马上会显示在手机屏幕上。 QR扫描器为iPhone及iPod Touch而设的一个便携
14、式QR码扫描器。快速及有效的实时自动检测模式。有以下特点- 实时扫描模式- 通过电邮、FaceBook或Twitter分享出去- 综合网页浏览器- 综合地图浏览- 新的界面设计- 创建属于您的QR码- MECARD支持- 网膜图形- 用电邮发送扫描的照片。 此外,微信、QQ也有二维码解码功能。二维码解码软件的实现依赖于二维码解码算法 , 但是二维码解码算法过程复杂 , 而且使用的相关技术繁多, 所以目前的解码算法的研究主要是对解码算法过程中关键技术的研究。二维码扫描器采用硬件解码 , 具有识别效率高可识别多种二维码适应能力强等优点, 但是技术封闭且价格昂贵; 而二维码解码软件采用软件解码 ,
15、具有成本低技术开放等优点, 但是识别效率一般 , 对运行平台要求较高, 而且目前仅能识别QR码 。此外 , 可以通过对二维码进行改造来提高识别效率Microsoft Tag , 即彩色条码可以利用较低的分辨率条码图像来提供较高的数据容量 , 与传统二维码相比, 彩色条码降低 了对采集图像分辨率的需求。Ankit Mohan 等结合光学原理和二维码技术 , 设计了一种新的载体形式 , 取名为Bokode , 基本原理为在二维码上添加透镜( 或者是具有小孔的隔光片),实现对Bokode的远距离识别。1.3 研究内容 本文主要围绕二维码的解码的关键技术进行研究,主要研究基于图像处理的二维码解码关键技
16、术。主要介绍了图像预处理 , 二维码定位技术以及数据译码过程中的关键算法。 并在此基础上详细设计了基于图像处理的QR码解码算法 , 主要对二维码的二值化算法和QR码定位算法进行改进 。本文的主要工作包 括 : 分析基于图像处理的二维码解码算法中的关键技术 ; 详细设计基于图像处理的QR码解码算法 , 对二维码图像的二值化算法和QR码定位算法进行改进。1.4 论文组织结构本文一共分为六章,各章的大致内容如下:第一章 ,绪论。本章首先介绍了本文课题的背景和意义,然后介绍了二维码识别的研究现状。最后介绍本文的研究内容和组织结构。第二章 ,二维码的编码规则。本章主要从QR Code的数据编码,数据纠错
17、,和图像掩码三个方面介绍QR Code。第三章 ,二维码识别系统的总体框架。本章主要介绍了二维码识别系统的目标,功能需求,总体流程和开发条件。第四章 ,二维码图像预处理模块的设计和实现。本章主要介绍了二维码图像的灰度化,图像的去噪和图像的二值化。并对二值化算法进行了改进。第五章 ,二维码解码模块的设计与实现。本章在第四章的基础上进行解码。主要介绍了二维码的定位算法,二维码格式信息和版本信息的实现方法,二维码模块的采样方法。二维码解码信息的设计与实现。第六章 ,系统的调试,运行和测试。本章主要介绍设计本系统遇到的问题和功能测试。第2章 QR码编码规则2.1 QR码符号结构 每个QR码由名义上的正
18、方形模块构成,组成正方形阵列,它由编码区域和包括寻像图形、分隔符、定位图形在内的功能图形组成,功能图形不能用于数据编码。符号的四周由空区包围。如图2.1所示。 图2.1 QR码符号结构(1)符号版本和规格QR码符号共有40种规格,分别是版本l搬本40,版本1的规格为21x21个模块,版本2为25x25模块。以此类推,版本N的规格每行每列为21+4(N一1)个模块。(2)寻像圈形寻像图形包括3个位置相同的位置探测图形,分别位于符号的左上角、右上角、和左下角,如图2-1所示。每个位置探测图形可以看作是由3个重叠的同心的正方形组成,他们分别为77个深色模块、5x5个浅色模块、3X3个深色模块。位置探
19、测图形的模块宽度比为1:1:3:1:l。符号中其它地方遇到类似图形的可能性极小。因此,识别组成寻像图形的3个位置探测图形,可以明确地确定视场中符号的位置和方向。(3)分隔符每个位置探测图形和编码区域之间有宽度为1个模块的分隔符,如图2-1所示。全部由浅色模块组成。(4)定位图形定位图形是垂直和水平方向一个模块宽的一列和一行,由深色浅色模块交替组成,其开始和结尾都是深色模块,如图2-1所示。(5)校正图形每个校正图形可看作是3个重叠的同心正方形,由55个深色模块、33个浅色模块以及位于中心的一个深色模块组成。校正图形的数量由QV,码的版本号决定,版本2及以上的符号均有校正图形。(6)编码区域编码
20、区域包括表示数据码字、纠错码字、版本信息和格式信息的符号字符。(7)空白区空白区为环绕在符号四周的4个模块宽的区域,其反射率与浅色模块相同。2.2 QR码编码方法 国家质量技术监督局发布的QR码标准中编码步骤如图2.2所示 图2.2 QR码编码步骤1.数据编码将输入的数据转换为一个位流,如果ECI是缺省的,那么一个数据流将包括模式指示符、字符计数指示符、数据,最后以4位终止符0000表示。其结构如图2.3所示。图2.4定义了每个模式的模式指示符,图2.5定义了采用不同版本的字符计数指示符的长度。下面介绍几种常用的编码模式。 图2.3 数据编码结构图2.4 模式指示符图2.5 字符计数指示符(1
21、)数字模式数字模式下,将输入的数据每三位分为一组转化为10位二进制数,剩余位转化为7位或4位二进制数。最后将二进制数据连接起来并在前面加上模式指示符和数字计数指示符。(2)字母模式在字母模式下,将输入的数据以两个字符为一组,将前面字符的值乘以45与第二个字符的值相加,结果转化为11位二进制数,若剩余一位,则将其转化为6位二进制数。最后将二进制数据连接并在前面加上模式指示符和数字计数指示符。(3)8位字节模式在8位字节模式模式下,直接将二进制数连接起来并在前面加上模式指示符和字符指示符。(4)中国汉字模式在中国汉字模式下,每个汉字符由两个字节表示,字符值为GB2312图形字符的内码值。将数据字符
22、两个字节为一组转化为1 3位二进制数,然后二进制数连接起来并在前面加上模式指示符和字符指示符。2. 纠错编码 QR码采用纠错算法生成一系列纠错码字,添加在数据码字序列后面,使得符号在遇到损坏时不致丢失数据。纠错共有4个纠错等级,分别是:L级纠错容量:7;M级纠错容量:15;Q级纠错容量:25;H级纠错容量30。3. 掩膜 掩模的目的是均衡地安排深色与浅色模块,以及尽可能地避免位置探测图形的位图101l101出现在符号的其他区域。掩模不用于功能图形,用多个矩阵图形连续地对已知的编码区域的模块图形(格式信息和版本信息除外)进行XOR操作。对不同掩模图形的结果计分,选择得分最低的掩模方案。第3章 二
23、维码识别系统的总体框架3.1二维码识别系统的目标QR码的主要应用的项目可分成四类:1. 自动化文字传输:通常应用在文字的传输,利用快速方便的模式,让人可以轻松输入如地址、电话号码、行事历等,进行名片、进程数据等的快速交换。2.数字内容下载:通常应用在电信公司游戏及影音的下载,在帐单中打印相关的QR码信息供消费者下载,消费者通过QR码的解码,就能轻易连接到下载的网页,下载需要的数字内容。3.网址快速链接:以提供用户进行网址快速链接、电话快速调用等。4.身分鉴别与商务交易:许多公司现在正在推行QR码防伪机制,利用商品提供的QR码链接至交易网站,付款完成后系统发回QR码当成购买身分鉴别,应用于购买票
24、券、贩卖机等。在消费者端,也开始有企业提供了商品品牌确认的服务,通过QR码链接至统一验证中心,去核对商品数据是否正确,并提供生产履历供消费者查询,消费者能够更明白商品的信息,除了能够杜绝仿冒品,对消费者的购物更是多了一层保护。3.2二维码识别系统的功能需求 本系统是实现二维码的编码与译码。首先根据二维码的编码规则生成二维码,然后采集二维码,将采集的二维码图像郊游解码器进行解码。 二维码可以包含许多信息,最常见的是一些产品信息。当然还可以包含一个链接地址;一个短信内容;一个后台应用程序等。本解码器主要实现下面几个功能:1. 显示产品信息 如果二维码包含的是这一类信息,就直接显示出来。2. 跳转链
25、接地址 如果二维码的信息是一个链接地址,那么本软件就调用相应的浏览器去打开这个链接地址。3. 发送短信 如果二维码的信息是一跳短信息,那么本软件就调用发短信的程序去发送这个短信。系统的功能需求流程图如3.1下所示。 图3.1 系统功能图3.3 二维码解码功能的设计3.3.1二维码识别系统总体流程实现规划 二维码识别系统模块之间以及系统总体算法的实现规划,各模块之间以及系统总体算法的流程,如图3.2所示。 图3.2 二维码识别系统框架图 首先对拍摄的图像进行图像预处理,预处理的步骤将在下一小节介绍。然后对预处理的图像根据二维码探测图形的特点进行定位。定位之后对图像进行旋转校正得到方形的二维码图像
26、。根据二维码的四个坐标对二维码进行模块采集得到二维码的数据流。然后根据相应的纠错算法进行纠错,纠错之后就可进行译码。3.3.2 图像预处理模块流程 图像预处理如图3.3,步骤如下: (1)对采样的图像进行灰度化处理 (2)对步骤一处理的图像进行去噪处理 (3)对步骤二处理的图像二值化处理图3.3 图像预处理流程3.3.3 二维码译码模块流程译码模块流程如图3.4,步骤如下:(1) 对格式信息译码根据采集得到的二维码模块得到二维码的信息数据,对格式进行纠错和译码。(2) 对版本信息译码根据采集得到的二维码黑白模块和版本信息在二维码中的位置得到二维码的版本信息,对版本信息进行纠错和译码。(3) 各
27、模式下的数据译码根据得到的数据流就可以对二维码进行模式译码。针对各模式的编码规则对各模式下的二维码数据流尽心数据译码。图3.4 二维码译码模块流程3.4.软件开发平台 本系统是针对android系统的,所以开发语言必须是java。由于二维码识别属于图像处理方面的,用到了许多图像处理技术,本系统调用了一些图像处理的第三方jar包。至于开发平台,本系统选用的是eclipse。 第4章 图像预处理模块的设计与实现 二维码图像预处理可以分为3个部分: 彩色图像的灰度化利用中值滤波进行图像平滑以及利用灰度图像二值化技术分割图像。4.1 彩色图像灰度化实际情况下 , 通常直接采集到的是彩色图像, 每个像素
28、有R G B 三个颜 色分量 ,每个颜 色分量的取值范围为0到255 。而二维码是以黑白模块构成 , 而颜色不包含任何信息( 这里指的是传统二维码 , 彩色条码除外) , 所以首先 要对采集到得彩色图像进行灰度化处理, 通常采用式 4.1 进行灰度化处理。其中Cr,Cg,Cb分别为R,G,B分 量的权值, 且满足Cr +Cg+Cb= 1。 W=Cr*R+Cg*G+Cb*B. (4.1)但实际上按上述的公式灰度化得到的灰度图像对光照均匀下拍摄的图像效果较好,但对光照不均匀的图像处理效果就不是太好。本文采用另一种方法灰度化图像。首先将原始RGB三通道图像分离成HSV图像,然后针对色相,饱和度,亮度
29、进行处理。将色相控制在紫色区,饱和度控制在中间区,亮度控制在中间区。消除过亮过暗的区域,消除低饱和度区域。这样得到的图像效果较好。如图4.1.1是源图像,图4.1.2是根据公式4.1灰度化结果,图4.1.3是根据分离HVS得到的结果。 图4.1.1 原图片 图4.1.2 式(4.1)得到图像 图4.1.3 由HVS得到的图像 4.2 图像去噪设备采集到的图像一般都因受到干扰而含有噪声。条码图像的噪声主要来自两个方面。首先是条码表面的各种形式的污损,这方面噪声只能凭借条码本身的纠错算法进行纠错。噪声的另外一个来源是来自光学采集系统,这部分的噪声是满足泊松分布的盐粒噪声,用适当大小的矩形窗口的中值
30、滤波非常适于条码图像。当然,由于当前各种设备的硬件性能比较好,这方面的噪声还不是很严重,对于OR这样的块状的条码,可以对每一块区域统计黑白点数,确定是黑、白块的时候直接就会去掉了盐粒噪声的影响,但是对于成像质量不是很高,而条码图像本身比较小的情况下(即最小模块宽度没有超过3个象素点),对图像进行滤波去掉噪声就显得比较重要了。中值滤波是抑制噪声的非线性处理方法。对于给定的n个数,将它们按大小有序排列。当n为奇数时,处于中间位置的那个数值称为这n个数的中值。当n为偶数时,位于中间位置的两个数值的平均值称为这n个数的中值。中值滤波的方法运算简单,易于实现,而且能较好地保护边界但有时会失掉图像中的细线
31、和小块的目标区域。邻域的大小决定在多少个数值中求中值,窗口的形状决定在什么样的几何空问中取元素计算中值。对二维图像,窗口的形状可以是矩形、十字形等,它的中心一般位于被处理点上。窗口的大小及形状对滤波效果影响很大。一般是55窗口,过大和过小都会对条码图像产生较大的副作用。本系统直接调用OpenCV 的cvSoomth()函数即可实现。4.3 图像二值化因为二维码是由黑 白模块组成的, 本身分割较为明显 , 所以二维码的图像分割通常采用二值化方法 , 二值化方法具有速度快,容易实现等优点 。 二值化方法是通过选取阈值 , 然后用阈值来对图像中每个像素进行判断 , 如果灰度值大于该阈值 , 则用灰度
32、值的最大值替换该像素值 ; 相反, 若果灰度值小于 阈值 , 则用灰度值的最小值替换该像素值 。 二值化算法过程就是求解阈值 的过程 , 根据阈值值选取范围的不同二值化算法又可以分为全局阈值值算法和局部阈值算法。全局阈值算法是选用唯一且固定的阈值对整幅图像进行二值化处理, 当图像的灰度直方图具有明显双峰时全局阂值算法处理结果较好; 局部阈值算法是通过将图像划分为若干局部窗口, 然后对每个窗口分别计算阈值并进行二值化处理 , 局部阈值算法对于复杂图像( 亮度不均,有噪声或是背景灰度变化 比较大) 二值处理效果好,但是增加算的复杂度 。本文采用的是局部阈值进行图像二值化,算法思想是: 将以当前像素
33、为中心的一个邻域内, 灰度值的最大值和最小值 的平均值做为该像素的阈值 , 然后用该阈值对当这个像素进行二值化 , 每个像 素的闭值单独计算 , 所 以 算法的复杂度较高。设当前像素坐标为 ( x ,y) , 邻域 窗 口选用 以当前像素为中心 的正方形 , 正方形边长为 2w +1.算法流程如下:(1) 计算图像中各点(x,y)的阈值w(x,y): ( 4.1) (2)对图像中的各像素点(x,y)用w(x,y)的值逐点二值化全局阈值算法复杂度最小, 但是对于图像光照不均时处理效果不好; 局部的阈值算法改进了全局阈值算法对光照不均时的处理效果, 但是相应增加了算法复杂度 , 而且会在分块边缘产
34、生边缘效应; 上述算法对光照不均的图像处理效果最好 , 但是算法复杂度最大 。下面对上述算法进行比 较 , 其中 N 为图像 的 像素个数, W 为 上述算法的正方形窗口边长 。 表4.1 二值化算法比较算法全局阈值算法局部阈值算法光照不均匀处理效果较差较好时间复杂度O(N)O(NW2) 第5章 二维码解码模块的设计与实现5.1 二维码解码流程QR码解码模块的功能架构如图5.1所示。 图5.1 QR码解码模块功能架构图QR码解码过程是编码过程的逆过程,图5.2是该过程的流程。 5.2 探测图像识别的设计与实现5.2.1 寻找探测图形 QR条码符号是由一系列的正方形模块构成的一个二维条码阵列,已
35、知QR码探测图形依次以1:1:3:l:l深浅交替变换,且这种性质在图像变形不是太严重和任意旋转的情况下稳定存在。本文根据QR码的位置探测图形特点,采用了边缘信息拟合直线的方法得到QR码符号的四个顶点。假设源图像的主体是QR码,则可以利用下述方法找到QR码的四个顶点。 图5.2 算法流程图(1) 对QR码所在图像逐行逐列扫描,。开辟一个矩阵lengthBufferx用于储存图像中某行深色或浅色模块的长度,其中第i个元素表示原图像某一行或某一列,第x段模块的长度。(2) 遍历矩阵lengthBuffer,当发现某条线段与其后四条线段的长度满足1:1:3:1:1时,(根据实际情况,每一元素宽度的允许
36、偏差为O36)。找到这条线段的起始坐标和终止坐标.将这条满足的线段保存在一个集合lineAcross中。 图5.3 位置探测图形扫描线(3) 重复步骤(1)(2),直到所有行列被扫描完。(4) 遍历集合lineAcross,若某条线段的起始坐标与其相邻线段的起始坐标相距不超过4像素,则认为是一个线段群,记录图像中这类线段群拥有线段数最大数n,当某个线段群的线段个数不小于0.8*n,则判断其为QR码中符合条件的线段群,并删除不符合的线段群。(5) 将lineAcross矩阵中记录的点用最小二乘法拟合成一条直线Y=bx+a:其中 (5.1) (5.2)这条直线就是QR码所在区域的左侧边缘线 (6)
37、 用上述方法求出QR码的边界的四条拟合直线 L1,L2,L3,L4. 如图5.4 所示.最后求取直线的交点, 作为Q R码的四个顶点, 定位结束。图5.4 直线拟合结果5.2.2 图像校正上述得到的图像可能会出现倾斜,故还需要进行旋转处理。由上述4条线就可以得到二维码图像的旋转角度和二维码的中心坐标。根据图像的旋转原理和插值算法就可以校正图像。5.3 二维码版本信息确定的设计与实现5.3.1 确定每个模块的宽和高由前面步骤提取出来的QR码的四周已经不再含有多余信息。但在拍摄的时QR码可能会变成了矩形。所以单位模块在X轴方向和在Y轴方向上的边长需要分别确定。首先在符号边缘的水平方向和垂直方向对提
38、取出的QR码进行扫描。当探测到预选区(遇到深浅模块按照1:1:3:1:1变化的地方),注意图像中一行像素与位置探测图形的外边缘相遇的第一点A和最后一点B。对该图像中的相邻像素行重复探测,记下每条探测线A,B间的距离以,以及探测线的数量N。直到在中心方块X轴方向所有穿过位置探测图形的直线被全部识别。用同样的方法扫描Y轴方向。如图5.5所示。图5.5.确定模块宽高所以QR码在X轴的宽度为: (5.3) QR码在Y轴的高度为: (5.4)5.3.2 二维码粗略版本确定 首先根据QR码的符号结构确认QR码的版本号。QR码共有40种版本,分别是版本1、版本2、版本40。版本1的规格为21模块x21模块,
39、版本2为25模块25模块。以此类推,每一版本符号比前一版本每边增加4个模块,直到版本40,规格177模块177模块。假设QR码的版本号为v,QR每行的模块数为n=4*v+17。则版本号可以由式(5.5)确定。其中,width,height分别为提取出QR码的边长。QR码每边模块数width/x=height/y. 或 (5.5) 但是由于计算机的浮点数运算产生误差,公式(5.5)得到的版本号不是太准确,所以本文采用另一种方法确定版本号。如图5.6所示,二维码的定位线是由黑白模块交叉组成的,所以可以扫描定位线的黑白模块。从a点开始扫描,如果当前像素是白色,下一个像素是黑色,则找的一个白色模块,直
40、到遍历到b点得到白色模块数n。所以即可确定模块总数N=14+(n-1)*2,版本号v=(N-21)/4+1.同理扫描垂直方向上的定位线也可以确定版本号。图5.6 二维码定位线5.4 二维码模块采样的设计与实现一般的方法是利用平均法对OR码划分N*N个网格,每个网格的中心进行取样,得到归一化的QR码图像。但是此时许多应该处于网格内的模块发生偏移,有的甚至跨越了2个栅格,平均法划分QR码往往会造成误差。这往往是由于计算机的浮点误差产生:图像的长度以像素的个数(整数)计量,而式(5.3)和式(5.4)中X,Y通常为浮点数,计算机取整数为步长。将会产生累计误差。本文采用另一种方法对二维码模块进行采样。
41、5.4.1 二维码差分图像 我们知道二维码是由黑白模块组成的,对二维码图像进行二值化处理后,二维码的每个像素是由0 1表示。假设0代表黑色1代表白色。那么一个黑色模块是由一个区域的0组成,一个白色模块是由一个区域的1组成。黑白模块的边缘是由0 1像素组成的。这就是说在一个模块的中心附近像素值几乎不变,但是在黑白模块的边缘像素值的变化很大。如图5.7,模块A B C的中心附近的像素值不变,但是他们的边缘像素值会变化,从0变成1或从1变成0。 根据这个特点我们可以对图像做行差和列差运算,就可以得到垂直边缘和水平边缘的信息。这样我们就可以划分二维码。即二维码每个模块的中心位置差分结果变化小,边缘位置
42、变化大。 图5.7 二维码二进制图像数据5.4.2 二维码模块采样 由上述原理我们就可以对二维码进行采样,步骤如下: (1)以行为例对图像做差分运算d(x,y)=|f(x,y)-f(x,y+1)|得到x方向的差分图像imgX,如图5.8。其中f(x,y)表示第x行y列的像素值。 (2)以列为例对图像做差分运算d(x,y)=|f(x,y)-f(x+1,y)|得到y方向的差分图像imgY. (3)对imgX,imgY做或运算得到二维码差分图像img=imgX|imgY; (4)通过公式(5.3)(5.4)得到的x,y得到行方向和列方向模块中点的大致取样点,在该取样点左右很小的区域(本文的区域为9个
43、像素)滑动如表5-1,找到min(p(x,y),并记下此位置。 表5-1 像素取样123405678 (5) 根据步骤(4)得到的位置,在源图像上寻找对应的点,若该点为黑色此模块就为黑色,反之,此模块就为白色。反复寻找就可归一化二维码。 图5.8 左图为源图像 右图为列差图像 5.5 二维信息解码的设计与实现5.5.1 版本信息的确定版本信息为18位,其中6位数据位,通过BCH(18,6)编码计算出12个纠错位。6位数据为版本信息,最高位为第一位。12位纠错信息在6位数据之后。只有版本740的符号包含版本信息,没有任何版本信息的结果全为0。所以不必对版本信息进行掩模。最终的版本信息应映射在符号
44、中预留的位置,见图5.9。需要注意的是,由于版本信息的正确译码是整个符号正确译码的关键,因此版本信息在符号中出现两次以提供冗余。版本信息的最低位模块放在编号为0的位置上,最高位放在编号为17的位置上。版本信息生成步骤见图5.10,版本信息的模块布置见图5.11。 图5.9 二维码版本信息 图5.10 二维码版本信息生成步骤 图5.11 版本信息模块布置由得到的采样图像就可以得到版本信息,存放在versionInfo1,versionInfo2数组中。用versionInfo1和正确的版本信息比较,如果在误差范围内,取前6位就可以得到版本信息,如果不在,用versionInfo2和正确的版本信息比较,如果在误差范围内,取前6位就可以得到版本信息,如果不在,则版本得到信息失败。5.5.2 二维码格式信息的实现如图5.12所示,格式信息有15位数据位组成,其中15 ,14位存放的是二维码纠错等级,13,12,11 位存放的是用于图像掩膜的图像数字。10-1位是对应