苏瑞芳 ,陆明海 ,陈 拓 ,陈鑫辉
(1.金华市妇幼保健院,浙江 金华321000;2.金华职业技术学院 信息工程学院,浙江 金华 321007)
随着物联网、云计算技术的迅速发展,移动支付在日常生活中越发重要,人们对于信息提取和处理效率有了更高的要求[1]。二维码利用不同编码方式能快速准确的存储大量信息[2],主流编码类型为矩阵式(Quick Response Code,QR Code)。传统二维码识别技术较为简单[3-4],在下雨天、灰尘等复杂环境下的识别率较低,且移动手机平稳拍摄受制于人体肢体,造成扫描的二维码图片模糊,扭曲和歪斜。
当前存在多种二维码识别技术,朱癑[5]等提出一种利用OpenCV实现机器视觉的方法。初炳旭[6]采用不同算法在复杂环境下进行试验,但二维码尺寸、位置等发生变化时,识别技术结果均不尽如人意。其中特别需要说明的是微信和支付宝的二维码识别技术,两种识别算法在多重二维码以及二维码尺寸不确定时的安全性有待考量。此外,在手机端识别算法时有额外的闪光灯补足光源,回避了光照条件不确定的问题,但此类方法迁移至电脑端则无法适用。卷积神经网络(Convolutional Neural Networks,CNN)作为专用图像处理算法[7],能较好地解决此类环境干扰对于二维码识别的影响。在多种环境下二维码识别的技术突破难点在于:在变化的、复杂的环境下,找到属于二维码不“变”的地方即二维码特征因子。图像特征因子的质量直接影响着神经网络训练和识别成功率。通过对CNN网络进行多次训练学习,最终得到的特征因子比人工定制的图像特征,在识别速率、准确率上具有较大的提升。
因此,本文提出一种基于CNN算法的二维码识别方案,通过对二维码图像优化处理,提高图像可识别度,实现更高精度的二维码识别。
本算法功能主要为二维码识别以及信息内容读取。算法结构如图1所示,首先二维码图片转化为二进制像素矩阵,然后利用鼠标监听事件选择感兴趣区域(Region of Interest,ROI),进一步聚焦待识别区域;最后采用线性变换方法突显图片细节,利用神经网络和OpenCV实现二维码识别功能。信息内容读取通过对所获得的二维码信息取模后输出在液晶屏。
图1 算法结构框图
算法整体流程为:首先,设计摄像头调用函数获取原始图片,鼠标监听事件选取ROI和图片降噪,提升识别效率;其次,利用二维码识别器构建训练集和测试集,采用CNN算法进行训练和学习;最后,采用OpenCV设计二维码识别算法。算法整体流程如图2所示。为避免二维码内容为空,以识别内容长度作为判定值,当识别后没有信息时,显示二维码错误。
图2 算法流程图
视频显示的原理是通过短时间内连续快速地显示图像内容,从而在视觉上形成视频的效果。VideoCapture函数可以实时捕捉图片内容,也能类似地实现上述视频拍摄功能。视频捕获程序流程大致为用户设备摄像头逐帧读取图片,通过帧的快速处理实现视频的实时捕获,最后释放摄像头资源。如图3所示,在循环中对目标二维码进行捕获。当待识别对象符合二维码识别值标准时,进入后续识别过程,否则返回上一步,进行重新识别。
图3 鼠标监听事件选择ROI区域
鼠标监听事件有鼠标移动、鼠标点击、鼠标经过等,鼠标点击包含左击、右击和双击。ROI待识别对象区域可以剔除图片中冗余和不相关内容,实现更高效率的图片识别[8]。本文中ROI区域通过鼠标左键、释放和拖动等监听事件实现。在二维码识别过程中,使用左键和移动事件进行ROI区域选取,ROI区域即为待识别对象所在区域,如图3所示。ROI区域可以缩小输入图片尺寸,减少冗余和干扰像素聚焦待识别区域。
图片的预处理在二维码识别算法中起着至关重要的一步,提前进行图像降噪、清晰度提高处理,有利于后续图像特征因子提取。首先对待识别图片做线性变化处理,输入图片的像素点矩阵与特定阈值进行逐一比较。当像素点超过阈值时对该像素点进行放大运算,反之则进行缩小运算,通过强化对比值突出图片细节,原理如式(1)所示:
其中,O(x,y)为输出图片像素值,I(x,y)为输入图片像素值,γ为放大比例系数,定值。
目标图片经过线性运算后,图像矩阵中像素值均发生改变。该程序通过对目标图片进行平滑处理,降低了环境因素干扰引起的识别失败概率。图像模糊和歪斜是常见的两种干扰因素,雨水是极端天气下的典型干扰物。为验证算法的抗干扰性,本文分别对模糊、歪斜和在雨水环境中的图像进行测试。如图4所示,图片处于模糊的情况下经过线性变化处理后,二维码区域清晰度明显增强。当图片处于歪斜和雨水的干扰下,通过后处理技术使得图片中雨滴影响减小,同时对歪斜的二维码进行相应幅度的修正,如图5所示。图4和图5中的图像预处理方法,均采用的是线性变换技术,该技术利用图像起始灰度映射关系调整图像灰度,能有效增强图像特征使二维码更加清晰。
图4 图片在模糊情况下线性变化的效果对比
图5 图片在歪斜和雨天干扰下线性变化的效果对比
CNN网络架构如图6所示,对在复杂环境下的目标二维码集进行训练。输入图片经过两层卷积核(3×3)和池化层(2×2)后,隐藏层分别学习二维码局部特性,得到输入图像的多个局部特性,全连接层将各个神经元学习的特征相关联。训练过程中通过实际输出与训练集标签进行比较验证,若识别错误,则根据反向迭代算法计算识别误差,更新神经网络权重值,然后重新推断识别。识别正确则进行下一张图片的训练识别,直至完成训练集中全部二维码识别。
图6 CNN网络架构
识别过程需要对图片进行定位和信息解码。本文识别程序以Zbar库为函数基础,其丰富的基础函数可以完成图像扫描、滤波、边缘梯度等功能,调用其中的OpenCV函数实现定位和解码功能[9]。定位过程通过检测二维码四个直角边实现,当确定其中三个定点位置即可推出二维码的具体位置。解码过程为加载二维码图像和四个顶点坐标,从而提取二维码的信息内容,具体过程如图7所示。
图7 二维码定位和解析过程
摄影分为启用、运行和关闭摄像头三个阶段。如图8所示,测试时所调用摄像头正常启动并处于工作状态,实时拍摄图片直至按下键盘“q”,程序成功释放摄像头资源并结束运行,测试结果表明设备调用和释放功能均正常。
图8 摄像头调用
启用阶段:开启程序能快速响应,窗口建立反应及时并稳定,无延时或窗口不协调等问题。运行阶段:摄像及其视频平稳运行,实时传递,无花屏,程序崩溃等。
关闭阶段:键盘“q”键作为指令,程序响应迅速,无残留进程,说明该程序成功关闭。
图8中的视频窗口清晰展示了摄像设备摄影的内容,其图片像素足够,图片尺寸满足
寻找图像特征的要求,不仅是成功的摄像设备调用和测试,也是证明图像对于特征描述的基本满足。
识别率是验证算法正确性以及性能的重要指标之一,通常以一定数量的数据集进行测试,计算识别正确图片数占测试数据集的比例。识别率影响因素众多,除了算法自身以外,图像噪声等外界干扰也会影响所采集的图像质量,导致算法识别准确率降低。本文共构建100张二维码,分为训练集和测试集,其中训练集60张,测试集40张。测试结果如图9所示,随着CNN网络的不断深化学习,对于测试数据的成功率达98%以上,错误率为2%以下,损失函数值低于0.1。相比传统二维码识别算法,实验结果表明,采用突触权重多态特性构建权重与图像像素的映射关系所设计的CNN网络学习,具有在线学习和抗环境干扰的优势。类似大脑中神经元之间以及突触前后膜传输和处理信息的工作原理,程序识别可自动小幅过滤环境干扰、对环境干扰采取降噪、截取等优化方式。
图9 二维码图片识别率
本文设计了一种用于终端智能设备的二维码识别算法,利用ROI和线性函数优化待识别图片,提高识别效率,卷积神经网络解决传统识别算法在极端环境下二维码识别率低的问题。实验结果表明所设计算法识别准确率高达98%,损失函数收敛值接近0,具有一定的工程应用价值。