潘观潮 王峰 王宏武 王晓洒 刘进辉
摘要:该文是在Ubuntu16的环境下,使用OpenCV开源视觉库和Zbar开源二维码识别库,对带有QR二维码的图片先进行二维码提取,然后识别显示。该文介绍了二维码的概况,开发工具的配置,并详细阐述了图片中二维码的定位提取过程:灰度转化、高斯滤波、中值滤波、边缘检测、二值化、闭运算、膨胀、提取区域,以及二维码的识别过程。
关键词: OpenCV;Zbar;二维码;识别;图像处理
中图分类号:TP319 文献标识码:A
文章编号:1009-3044(2019)16-0191-03
开放科学(资源服务)标识码(OSID):
随着经济和科技的高速发展,智能手机在人们生活的普及促进了二维码技术的发展与成熟,运用二维码技术进行信息存储与传递正变得越来越高效与便捷,例如微信/支付宝扫码支付、二维码身份认证、二维码存储信息等,这些都极大地方便了人们的学习、生活和工作。因此,对于二维码图像的提取与识别技术的相关研究也日趋重要,同时也更具研究价值。
1 二维码简介
二维码 (2-dimensional bar code),又被称为二维条码,是现代生活中非常流行的一种编码方式,最常见的形式是QR Code。二维码将数据符号信息按照一定的几何图形规律记录在二维平面分布的黑白相间的图形中,这种编码巧妙地利用计算机内部逻辑基础的“0”“1”比特流的概念,使用若干个与二进制相对应的几何形体来表示各种类型的数据信息[1]。相对于传统的一维条形码,二维码能够在横向和纵向两个方向,利用两个维度对信息进行存储,极大提高了信息存储能力[2]。二维码还具有可靠性强,效率高,成本低,易于制作,构造简单,灵活实用,高密度,纠错功能,多语言形式,可表示图像等特点[3]。
在现实生活中拍摄到的二维码图片,除二维码图案外,通常还包含其他的背景信息,二维码图案只占其中的一部分。因此在识别二维码前,应先定位出二维码的大致区域,并将其提取出来,去掉无用的背景干扰信息,以提高识别的速度和准确率。
2.1 OpenCV与Zbar概述
OpenCV(Open Source Computer Vision Library),译名为“开源计算机视觉库”,是一个基于开源开发的跨平台计算机视觉库。OpenCV主要由一系列C函数和C++类组成,拥有包括500多个C函数的跨平台的中高层API,它提供了大量的开源图像算法,是计算机视觉领域中使用极为广泛的图像处理算法库[4]。图1所示为OpenCV的Logo图形。
Zbar是一个开源软件套件,主要用于从各种来源读取二维码/条形码信息,例如视频流、图像文件和传感器等。它支持许多流行的二维码/条形码类型,包括EAN-13 / UPC-A,UPC-E,EAN-8,Code 128,Code 39,Interleaved 2 of 5和QR Code。图2所示为Zbar的Logo图形。
2.2 开发工具配置
本文实验在Ubuntu16系统上进行,因此在Ubuntu上实现对OpenCV和Zbar的配置。
安装OpenCV之前,先要安装它的依赖项libgtk2.0-dev、libjpeg-dev、libtiff4-dev等。接着在OpenCV官网上选择OpenCV for Linux版本下载,会得到一个像opencv-3.4.6.zip这样的压缩包,将它解压到任意目录下。解压后进入目录,创建并进入build文件夹,分别执行cmake ..、make、sudo make install命令。至此,OpenCV编译安装完成,默认安装在/usr/local目录下。
之后安装Zbar,首先要在官网上下载Zbar的源码,选择的是Source Code版本里的ZBar-0.10,之后对其解压缩。解压后进入文件夹,执行./configure –prefix="",此时默认安装在/usr/local/bin目录下。最后分别执行make、sudo make install命令。
3 二维码提取过程
本实验主要通过调用OpenCV中的函数实现二维码的提取。其实现步骤为:(1)灰度转化;(2)高斯平滑滤波;(3)中值滤波;(4)边缘检测;(5)二值化;(6)闭运算;(7)膨胀;(8)获取码的区域。
3.1 灰度转化
做图像处理时,灰度图是个二维矩阵形式,相对于RGB图的三个维度更容易处理,消除颜色干扰。cvtColor()函数是OpenCV里的颜色空间转换函数,可以实现RGB颜色向灰度的转换,代码如下:
3.2 高斯平滑滤波
高斯滤波是一种线性平滑滤波,可以消除高斯噪声。GaussianBlur()函数的作用是用高斯滤波器来模糊一张图片,代碼如下:
3.3 中值滤波
中值滤波是一种非线性滤波方法,该方法在去除图像噪声的同时,又能很好地保留图像的边缘细节。因此该方法非常适用于二维码图像的正确识别过程。代码如下:
3.4 边缘检测
边缘检测是图像处理和计算机视觉中的基本问题,常用来提取目标区域的轮廓。图像边缘检测可以大幅度减少图像处理的数据量,有助于消除与二维码识别不相关的背景图像信息, 保留二维码区域图像信息。本文使用Sobel边缘检测算法,先分别求图像X、Y方向的梯度,再将两个方向的梯度结果进行叠加。代码如下:
3.5 二值化
3.6 闭运算
3.7 膨胀
3.8 获得码的区域
4 二维码识别过程
二维码图像提取完成后,就可以利用Zbar对二维码进行识别,其步骤如下:1)初始化Zbar扫描器,并设置;2)获取图像信息,定义扫描范围;3)扫描二维码,得到数据。
4.1 初始化Zbar扫描器,并设置
4.2 获取图像信息,定义扫描范围
设置好Zbar扫描器之后,读入前面提取到的二维码图像image,先转化为灰度图像,然后获得灰度图像行列像素及地址信息,并构造一个Image对象,以此定义扫描范围,代码如下:
4.3 识别二维码,得到数据
完成上述准备工作后,通过调用图像扫描器的scan()方法,开始读取图像中的二维码数据,并进行显示,代码如下:
5 结语
本文首先简单介绍了二维码的编码、应用、特点等概况,接着对识别二维码的开发环境进行配置,最后基于OpenCV实现了二维码图像的提取过程和基于Zbar实现了二维码图像的识别过程。经过多张图片的实验,二维码识别效果好、识别率高,多数常用的二维码以及条形码均可成功识别。但对于少数背景干扰信息复杂、存在多个二维码的图片,识别效果欠佳,这有待进一步完善。
参考文献:
[1] 杨军,刘艳,杜彦蕊.关于二维码的研究和应用[J].应用科技,2002(11).
[2] 徐国辉,陈婕娴.手机二维码技术原理及应用[J].信息与电脑,2013(1):18-19.
[3] 凌骁珺,王煜.二维码技术的分析与研究[J].电脑知识与技术,2018,14(21):47-49.
[4] 贾小军,喻擎苍.基于开源计算机视觉库OpenCV的图像处理[J].计算机应用与软件,2008(04):276-278.
[5] 毛星云.OpenCV3编程入门[M].北京:电子工业出版社,2015.
[6] Rafael C.Gonzalez,Richard E.Woods.数字图像处理[M].2版.阮秋琦,译.北京:电子工业出版社,2007.
【通联编辑:代影】