论文在线分享-基于图像处理技术的条形码识别系统设计-CNKI知网查重网站

论文在线分享-基于图像处理技术的条形码识别系统设计

2021-06-16 10:24:14
作者:杭州千明

  在信息技术迅猛发展的今天,人们的日常生活已经和移动计算机的应用、智能化的设备密不可分,无法互相切割。随着与物联网相关产业的发展和兴起,自动化识别技术在物联网中扮演着十分重要的角色。自动化识别技术主要用于物品的识别和信息的读取,能够让人们对物品信息肉眼可见。作为信息存段的重要手段的条形码,在物联网时代发挥着举足轻重的作用。条形码可以标识出产品的生产商和产品分类,以便于人们仅通过条形码便能清楚地了解物品信息。此外,条形码还可以进行防伪标识,正规合格产品都能够通过扫描条形码识读出来。

  对于条形码的识别通常采用的是光电识别技术。一般的光电识别设备首先是通过线性扫描的方式读取到条码信息后,再经过硬件设备对条形码进行识读。由于条形码可能存在印刷不清晰或者由于磨损和脏污造成的噪声等情况的出现,会导致识别率大大的降低,会造成一定的经济损失和市场混乱。其次,在运输过程中条码的磨损以及出现的脏污等文艺也会影响到条码的识读。近年来,随着数字图像处理技术的发展,采用与图像处理技术相关的智能算法对条形码进行识别乃大势所趋,它可以有效解决利用硬件识别带来的技术和成本问题。

  本文正是在此背景之下,根据实际应用需求,利用图像处理相关技术,对一维条形码的识别进行了研究,并利用MATLAB软件设计出识别系统,克服了基于光电技术的条码识别带来的局限性。

  1.2国内外研究现状

  条形码技术的应用和推广始于20世纪80年代。条形码产业的形成带领零售领域中的交通、物流、电子贸易和产品飞速发展,推动我国经济大幅度增长。十多年来的条形码技术代码仍然专注于发展,加强服务。

  条形码的出现和使用最早是在美国,是由美国的两位工程师发明创造的。起初是想设计一种可以在超市收银台自动记录商品信息和销售的方法。由于技术和设备的落后,虽然制造出了条形码的生成和识读,但是条形码本身无法存放信息。因此,条形码的发展停滞了将近十年之久。随着激光技术的出现和计算机技术的发展,在20世纪60年代,计算机已经能够快速识别和处理条形码包含的信息。美国条形码的使用和推广最早是在超市和商品领域,紧随其后的是汽车生产厂商。而在今天使用条形码的领域越来越宽广。

  在20世纪80年代初期我国条形码才逐渐深入研究和发展,国务院在1988年成立了“物流编码中心”机构,用来负责中国条码编码规则。由于中国当时的发展缓慢,所以在条形码技术方面落后与西方国家。随着科技技术迅猛发展,我国条形码技术日益成熟。目前条形码已经使用在不同的领域用以携带信息,比如说物流、图书等。随着经济全球化发展,条形码技术的应用已经深入市场,站稳脚跟。

  1.3本文主要研究内容

  本文本着以学习条形码的编码原理和图像技术为目的,设计了条形码识别系统。该系统实现了对条形码图像的处理和条形码信息的识别。

  论文的研究内容主要包括以下几个方面:

  (1)了解条形码的发展历史及其优点;

  (2)调查和研究条形码的结构和编码规则;

  (3)对条形码的图像进行处理以及图像预处理的几种算法介绍;

  (4)设计制作条形码识别系统,实现条形码信息的读取。

  1.4章节安排

  论文结构安排如下:

  第一章节,首选介绍条形码的发展背景以及研究意义,了解国内国外对条形码的研究;然后简明阐述本文研究的内容和所要解决的关键问题。

  第二章节,首先介绍了条码的分类及其优点,主要介绍了本文所研究的条码的结构,介绍了条码的编码规则和编码原理。

  第三章节,主要讲解了条形码识别程序的设计。包括条形码图像的读入、处理、识别设计。

  第四章节,主要对条形码系统进行设计,完成条形码识别系统的制作和系统的测试。对条形码识别系统测试结果分析。

  第五章节,对该系统的设计进行总结和对其未来的发展进行规划。

  2一维条形码的编码原理

  2.1条形码的优点及分类

  2.1.1条形码的优点

  条码识别技术是自动识别技术中最具成本效益的技术,具有以下优势:

  (1)条码高速输入。由于速度无法与手动输入相匹配,它比键盘输入高出100倍。

  (2)条码可靠性高。根据统计数字,一个字符的条码的误读率仅为百万分之一,相比于人工输入,使用条码技术输入数据的方式提供了很高的可靠性。

  (3)条码收集的大量信息。传统的一维条形码可以一次获得几十个比特的信息,并具有一定程度的自动校正误差的能力。

  2.1.2条形码的分类

  条形码是平滑排列的、是空的,其由相应的文字列排列。条形码的信息由条形码条和空之间不同的宽度传递,条形码信息容量的大小由条形码的宽度和条形码印刷质量所决定。条形码的宽度越宽,包含信息的量越多,条形码印刷的质量越好,在清晰的单位长度内传递更多的空条形码信息,这种条码计算器识别起来很容易,翻译成二进制和十进制非常方便。

  世界上的一维条形码有200多种,它们都有自己的编码标准。每一个字符、数字和文字都是由几个空白或几条线组成。目前使用频率最高的一维条形码有EAN-13码、EAN-128码、code-128码等。EAN-128条形码码是与美国编码委员会、国际编码协会共同开发、共同采用。主要用于显示重量、批次、产地、生产日期等更多的商品信息。其他条形码码主要应用于一些特殊情况,如血液库、包裹、图书馆管理等跟踪管理多用标签码;code-25码用于航空运输系统和包装系统。EAN-13条形码是国际通用的符号,没有特别的意义,其主要用于携带商品的信息和商品管理。其厂商码和商品码由厂家自行申请发放,一种条形码只能代表一种商品。本文主要研究了EAN-13条形码。

  2.2条形码的编码原理

  2.2.1 EAN-13条形码的结构

  EAN-13条形码由空白区、起始符、终止符、数据区和校验字符模块组成。其条形码符号结构如下图所示:

  图2.1EAN-13条形码符号结构

  EAN-13条形码的符号具有以下几个特征:

  (1)条码是矩形的。是由相互平行的许多宽度粗细不均匀的黑白线条交叉组成。

  (2)条、空符号是由1到4个相同的宽度、深浅的模块符号组成的。通常情况下深色用"1"符号表示,而浅色则是用"0"表示。

  (3)条形码符号可以设计成既可以让人用固定的手拿扫描设备和仪器同时识读,又或是一种可以提供固定的扫描仪器设备同时进行的全向扫描。

  (4)空白区条码符号的大小是可以按规定变化的,用来适应人们对不同印刷设备工艺的特殊需求以及对于印刷设备面积的各种特殊要求。

  EAN-13条形码符号可以包含总共113个模块。其中左侧的空白区符号位于条形码最左侧占11个模块;右侧空白区条形码最右侧位于占7个模块;起始符位和终止符分别位于3个模块中;左侧空白区数据符表示厂商的代码占4个模块;中间的分隔符号是一种特殊符号,用来表示平分条形码符号占5个模块;右侧数据符用来存段物品信息占35个模块;检验符占7个模块[3]。其条形码符号构成示意图如图2.2所示:

  图2.2条形码符号构成示意图

  2.2.2 EAN-13条形码的编码方法

  条形码的编码方法指的是条形码条和空的编码规则并且用二进制逻辑值将其表示出来。因计算机只能读取二进制数据,而且必须是符合要求的二进制计算系统。条形码是由不同的二进制数据中的条形码和一个空白部分之间的中间的组合来提供。通常条形码有两种编码方式:一种是模块组合法,另一种是宽度调节法。

  (1)模块组合法:条形码条模块的空间由许多组合不同的代码与二进制数字“1”的标准宽度来表示,并且条形码的空模块由二进制“0”表示。EAN-13条形码每个模块的标准宽度是0.33mm,两个条和两个空构成一个特殊字符,而且我们每个条或者空都是由1-4个标准的模块设计宽度构成。

  (2)宽度调节法:基于条形码的宽窄设置的不同,用二进制的“1”表示宽单元,而用二进制的“0”表示窄单元,如果宽窄比过大,容易增大判别过程中的误码率,所以宽单元和窄单元的比值控制在2到3之间。

  2.2.3 EAN-13条形码的编码原理

  EAN-13条形码的信息用13个字符表示,其中第一位是前置码用来决定左侧数据的编码方式,最后位是校验码,用以检验条形码译码结果是否正确。条形码符号结构如图2.3所示:

  图2.3EAN-13条形码符号示意图

  条形码中每个条和空都称作单元,每个单元都有1~4个模块构成。由图2.3可知在EAN-13码中每个数字都有7个模块组成,这7个模块又被分成了4个单元,也就是两个条单元两个空单元。例如右侧数据符‘2’的逻辑值为‘1101100’表示成条形码就是两个模块的条,以个模块的空,两个模块的条,两个模块的空。每个数字都有它固定的逻辑值,其中左侧的数字是有两种编码方法的,依据数字的位数不同,所选择的编码方式也不同。其数字的编码如表2.1所示:

  表2.1 EAN-13数字编码规则

  数字左侧数据符右侧数据符

  A类编码B类编码C类编码

  0 0001101 0100111 1110010

  1 0011001 0110011 1100110

  2 0010011 0011011 1101100

  3 0111101 0100001 1000010

  4 0100011 0011101 1011100

  5 0110001 0111001 1001110

  6 0101111 0000101 1010000

  7 0111011 0010001 1000100

  8 0110111 0001001 1001000

  9 0001011 0010111 1110100

  注:0为空白,1为线条

  此外还有起始符、中间分隔符和结束符。因条形码的左侧字符有两种编码方式,所以其采用哪种编码方式是由前置字符决定。这也为我们判别前置字符提供了依据。我们也依靠左侧字符的编码方式不同来判定条形码的前置字符。左侧数字编码规则如下表2.2所示:

  表2.2左侧字符编码选择规则表

  前置字符左侧字符编码方式选择

  0 A A A A A A

  1 A A B A B B

  2 A A B B A B

  3 A A B B B A

  4 A B A A B B

  5 A B B A A B

  6(中国)A B B B A A

  7 A B A B A B

  8 A B A B B A

  9 A B B A B A

  条形码编码示例:对“9787514700329”进行EAN-13编码。“9”是前置字符决定左侧字符的编码方式是“ABBABA”,“787514”是左侧数据,“70032”是右侧数据,“9”是校验数通过计算得到,其校验位的计算方法会在后面的章节讲解。

  起始符和终止符的编制都是相同的都是101;左侧数据区数据“787514”通过表2.1进行编码得到“0111011 0001001 0010001 0110001 0110011 0100011”,中间分隔符是固定的为“01010”,右侧数据区数据“70032”通过表2.1进行编码得到“1000100 1110010 1110010 1000010 1101100”,校验数“9”进行编码得到“1110100”。将这些字符通过图形表示得到如下条形码:

  图2.4EAN-13编码结果图

  3条形码识别程序的设计

  3.1程序总体设计

  条形码图像处理和识别的程序设计是在MATLAB仿真软件下完成,因其拥有丰富的函数资源,使得编程变得相对简单,语言通俗易懂。MATLAB最突出的特点是简洁,不用搭建复杂的开发环境。给用户带来最直观、最简单的程序开发平台。其主要语言特点如下:

  (1)语言简洁。MATLAB编程采用的是高级阵列语言,编程相对简单。其内部具有庞大的控制语句和功能函数并具有面向对象编程的特点。

  (2)运算丰富。MATLAB的语言环境是C语言,其提供运算函数较多,使用简便。

  (3)图像处理能力强。MATLAB具有强大的数字图像处理能力,并且具有图像可视化功能。

  (4)结构化控制语句。MATLAB既有半结构化的控制相关语句,又有面向对象编辑的特性。程序要求不严格,自由度大。

  此程序的设计主要包括条形码图像的读入、处理、识别三个部分,系统的条形码图像处理模块是将条形码图像经过灰度化、去噪、滤波和二值化等操作,转换成便于条码识别的二值化图像。通过对条形码字符的判定确定条形码数据区。接下来就是对条形码的识别和译码,通过既定的译码原理,实现条形码信息的读取。以上所有功能的实现都是通过MATLAB仿真软件实现,最后识别出条形码包含的信息,在研究设计条形码识别程序的同时对其中出现的问题进行分析、解决,并寻求更优的解决方法。

  首先将条形码图像通过程序控制将其读入到设计好的条形码识别系统中,之后此条形码将以矩阵的形式存放在该系统中。然后对条形码进行灰度化、去噪滤波、滤波、二值腐蚀等预处理。通过相应的译码方式得到条形码中的信息,并将结果通过文本的形式显示出来。条形码图像的识别处理流程图如下图所示:

  图3.1主程序流程图

  3.2条形码图像处理

  3.2.1条形码读入

  要准确的识别条形码就首先要对条形码图像进行一定的处理。对条形码进行预处理,首先是将条形码图像读入,在条形码图像读入这个步骤中,我们的首要任务是把条形码图像放置在条形码识别系统的的工作区中去。当图片经过imread()函数命令后,MATLAB会给条形码新建一个存段条形码的空间,然后把条形码图像各像素点的值段存到矩阵中。

  在Matlab中使用imread()函数对图像进行读取。在读取条形码之前先使用uigetfile()函数打开存放条形码的文件夹,然后再将所选中的条形码进行读取。其读入操作格式如下:

  [filename,pathname]=uigetfile({'*.jpg';'*.bmp';'*.png';'*.gif'},);

  A=imread([pathname,filename];

  条形码读入后就开始条形码的处理。条码图像读入计算机后,因传输、存段因素的影响,条形码图像的质量可能会受到影响。因此,对条形码图像进行滤波操作显得十分有必要。或者可以人为加入噪声,然后选用合适的方法进行滤波。最后进行二值腐蚀操作,得到二值化后的条形码图像。

  3.2.2灰度化处理

  在计算机领域中,灰度化处理就是把彩色图片经过计算机处理技术转换成灰度图像。在灰度化处理中,用R、G、B三个分量来表示色彩,三个色彩的取值范围都相同,都是从0到255,共有256个值。图像的灰度化处理有很多种方式,在Matlab中对条形码进行灰度处理采用了加权平均值的算法,即将R、G、B的值求平均得到一个灰度值,该算法可以获得较柔和的灰度图像。

  (3.1)

  在MATLAB中具有图像灰度化处理的功能函数,用以实现图像的灰度化。其调用格式如下:

  X=rgb2gray(I);该语句实现了对图像I的灰度化处理,减少了条形码图像的数据量,便于条形码的后续处理。

  3.2.3噪声处理

  在传输图像的过程中可能会产生噪声和污染,造成条形码无法正确识别,因此十分有必要对条形码进行去噪处理。在数字图像处理中常见的噪声有以下三种:高斯噪声(主要是由电阻成分产生的性)、皱褶噪声(主要是通过在黑色图像中的噪声或光伏泊松过程切割图像)。目前最经典的图像去噪算法主要有三种:平均滤波、中值滤波和维纳滤波。

  在该识别系统设计中,所识别的条形码基本是由在线条形码生成器生成。因此,要展现出条形码进行去噪处理后的效果,先要对条形码进行加噪处理。

  Matlab图像处理工具提供加噪函数,可通过imnoise()函数给条形码增加不同的噪声,函数调用格式如下:

  J=imnoise(I,’type’,parameters);

  表3.1列出了imnoise函数产生的噪声类型和相关参数。

  表3.1imnoise函数支持的噪声类型和相关参数说明

  type partmeters说明

  gaussion m,v均值为m,方差为v的高斯噪声

  localvar v均值为0,方差为v的高斯噪声

  possion无泊松噪声

  Slat&ppepper无椒盐噪声

  speckle v均值为0,方差为v的均匀分布随机噪声

  例如:J=imnoise(B,'speckle',0,0.01);

  条形码经过加噪处理后对信息的采集和识别会对最终的识别效果产生影响。任何一个优秀的图像处理系统,去噪已经是图像处理中及其重要的步骤。在此对条形码图像加噪完成后,开始进行去噪处理,在Matlab工具箱中采用wedencmp()函数对条形码图像进行去噪处理。其图像去噪函数调用格式如下:

  [y,t,g]=ddencmp('den','wv',J);

  K=wdencmp('gbl',J,'sym4',2,y,t,g);

  3.2.4直方图增强

  直方图均衡化是调节直方图对比度的图像处理方法,其主要用来增强图像的局部亮度。条形码图像经过直方图增强处理将像素比较少的灰度分配到别的灰度中去,这样能够使像素相对集中,有效的增强条形码图像的清晰度。

  在Matlab工具箱中,通常使用imadjust()函数进行条形码图像的灰度进行调整,该函数调用格式如下:

  D=imadjust(I,stretchlim(I),[0,1]);

  stretchlim(I)用来获取条形码图像的灰度值极限,[0,1]指把条形码的灰度值归一化到该范围。

  3.2.5中值滤波

  中值滤波是一种非线性平滑图像处理技术,它能将每个像素点的灰度值改变成该像素点周围窗口内的像素灰度值的中值,从而去除被孤立出来的噪声,有效保护条形码图像的信息。因此在此条形码图像处理中选择了中值滤波。在Matlab中可直接使用自带滤波函数对条形码图像进行滤波函数调用格式如下:

  L=medfilt2(I);该语句可以对加噪后的条形码图像I进行滤波处理。

  3.2.6二值腐蚀

  条形码的二值化就是为了使整个条形码图像只能显示黑白效果将条形码图像上的点的灰度值设置为0或者255。二值化处理可以减少条码图像数据量,使条码轮廓更加清晰。经过二值处理后接下来就是对二值图像的腐蚀操作,经过腐蚀的条形码图像会“细化”,方便条形码码后续的译码。Matlab用imerode()函数实现图像腐蚀。其用法为:

  se=strel(shape,parameters);其中shape是用来创建指定形状,参数parameters用来控制se的大小。

  A=Imerode(I,se);其中I是待处理的图像,se是结构元素对象。

  3.3条形码识别

  3.3.1条形码译码原理

  EAN-13条形码的译码方法主要有三种,接下来就简单介绍这三种译码方法:

  (1)宽度测量法;通过测量条形码条和空所含的像素个数来确定条空的宽度值[6]。

  (2)平均值法;精确进行定位条形码的位置,进而通过测量条形码的整个设计宽度,然后除以95得到单位模块包含的条码宽度,最后可以通过分析计算得到整个条形码条空宽度值[6]。

  (3)相似边距离测量法;测量确定在所述条形码符号相邻字符之间的逻辑值的元素之间的距离[6][7]。

  EAN-13条形码的译码原理和编码相似,先计算出出条形码的条和空的宽度以及每个字符的宽度,然后根据条空的宽度确定字符的编码,识读条形码的信息。

  图3.2EAN-13条形码宽度示意图

  由EAN-13条形码的编码规则可以看出来条形码的一个字符的宽度是由两个条和两个空组成,图中T表示一个字符的宽度,那么单位模块的值是Q=T/7[5]。设用ni来表示每个条空的宽度值,那么ni=Ci/Q(i的取值为1,2,3,4)。通过计算得到ni的值,然后根据条形码编码表进行对比,便能得到条形码的数字字符。例如:

  (1)假设测得ni(i的取值为1,2,3,4)的值分别是1、1、3、2;条形码的排列首位是空,则通过条形码码字集符可知条形码编码为0100011,是左侧奇性字符4。

  (2)假设测得ni(i的取值为1,2,3,4)的值分别是1、1、1、4;条形码的排列首位是条,则通过条形码码字集符可知条形码编码为1010000,是右侧偶性字符6。

  EAN-13条码一共包含10个数字符。在条码符号中,每字符由7个模块二进制数表示,表示形式见条形码字符示意图,其中黑色表示二进制数“1”,白色表示二进制数“0”。首先以条形码地起始坐标确定条形码数据区域。确定条形码的数据区域后就可以对条形码图像进行译码。

  在该程序设计中采用宽度测量法对条形码进行译码处理,根据条形码的开始字符和结束字符的边缘,确定条形码的数据区域。然后测量出条形码每个字符条和空的宽度,与条形码码字集符信息表进行信息匹配,从而确定条形码信息。因其对条形码的质量要求比较严格,如果实际测量出来的值和条形码的标准值存在一定误差,就无法实现准确的译码。

  图3.3EAN-13条形码字符集示意图

  条形码字符集示意图如上图所示,A和B子集的条码字符是从左方到向右方按顺序排列的,以一浅色的模块作为开始,以一个深颜色的模块作为结尾。C子集的条码字符则是从左到右依次以一个深色模块开始,一浅色模块结束。

  3.3.2条形码信息读取

  条形码识别流程图如下图所示:

  图3.4条形码识别流程图

  条形码图像经过预处理后进行信息读取。首先对条形码的字符数进行确定,判断条形码类别,然后对条形码每个字符进行定位,计算条形码的条和空的宽度值,与条形码码字集数据库进行对比,读取出条形码信息,最后输出在结果显示框中。

  3.3.3输出结果校验

  译码完成后,要确定译码是否正确,利用校验码计算方法,对条形码进行校验。检验方法如下:

  从条形码代码序号位置2开始,将所有的偶数位的数字求和得到数值Q,然后将上述求和的数值Q乘以3得到数值W。从条形码位置序号3开始,所有奇数位的条形码数字求和得到数值E。将数值W和数值E相加得到数值R,用10减去数值R的个位即得到条形码的校验位数值。

  例:013745227811的校验码的计算如表3.2。

  表3.2校验码计算示意表

  代码位置序号13 12 11 10 9 8 7 6 5 4 3 2 1

  数字码0 1 3 7 4 5 2 2 7 8 1 1 x

  步骤1:1+8+2+5+7+1=24

  步骤2:24*3=72

  步骤3:1+7+2+4+3+0=17

  步骤4:72+17=99

  步骤5:10-9=1

  步骤6:校验码为1

  4条形码识别系统的设计及其实现

  上节对条形码图像的处理和识别进行了阐述和程序设计。为了能够清楚地表述该程序的运行,在此以可视化界面的方式将条形码的处理和识别展示出来,用户可以通过按键控制来实现条形码图像的处理等操作,使之具有极大的观赏性。

  4.1MATLAB可视化界面的设计

  4.1.1GUI可视化界面简介

  GUI(Graphical User Interface)也被称作图形用户接口,是一种以可视化图形的方式显示计算机操作用户界面。其主要功能是实现人通过对可视化界面的操作。通过简单易懂的图形将晦涩难懂的电脑语言包装成我们所要表达的内容。用户通过输入设备对界面实现菜单和按钮的功能操作,以代码命令或者程序调用的方式执行任务。与键盘输入或者字符命令的方式执行任务相比较,图形用户界面有着不可比拟的优势。通过对界面的美化让用户有着更舒适的视觉体验。开发者对图形用户界面不断改良使得信息数据的传输更加方便、快捷、准确。给用户带来了良好地体验,实用性特别强。

  用户可通过Matlab开发环境快速创建和设计GUI界面。根据用户需求自定义设计GUI界面布局,生成M文件。可视化图形用户界面具有以下几个工具:

  (1)布局编辑器:用于放置控件对象,调整界面布局。

  (2)几何排列工具:用于调整各个控件对象之间的位置。

  (3)属性编辑器:查询控件的属性并且修改属性值。

  (4)对象浏览器:可以获取MATLAB图形用户管理界面程序中全部研究对象信息技术以及发展对象不同类型,甚至可以浏览控件的名称,用鼠标点击相对应的控件名称可进入其属性编辑区。

  (5)菜单编辑器:用以设计和构成MATLAB设计的系统中所需的菜单,其主要用于界面可视化设计中。菜单功能的实现需编辑回调函数,其布局程序是存段在M文件中[8]。

  4.1.2可视化界面设计步骤

  图形用户界面设计的原则是简洁、整齐、大方。用户可以直观的看到设计者的设计思路和设计理念,能精准的认知到设计该系统的目的。采用Matlab提供的GUI向导,就可以进入演示系统界面的设计。

  (1)GUI界面启动

  启动GUI图形用户界面设计方法有两种:使用可视化界面环境和通过编写程序启用图形用户界面,通过两者的比较,选择使用可视化界面环境来绘制图形界面比较简单方便。图形用户界面设计工具有以下两种进入方法:

  ①命令方式:使用guide命令语句启动用户界面GUI设计工具,建立名字为.fig的图形用户界面。

  ②菜单方式:在Matlab主页中选择新建同窗,然后在同窗中的文件下选择新建GUI。

  图4.1新建GUI界面图

  (2)GUI模块选择

  在GUI可视化界面设计中Matlab一共有四个模块。分别是系统默认的空白模板、带有Uicontrol对象的模板、带坐标轴和菜单的模板和带问答式对话框的模板。为了更好的展示系统的功能,使其具有美观性,一般开发者会选择Blank GUI(空白模板)作为系统设计的模板。如下图所示:

  图4.2 GUI模板图

  (4)GUI界面制作

  左侧的工具栏具有控件和组件,拖动设计所需要的控件放置在界面上,然后对组件的属性和外观进行编辑修改。界面设计完成后对控件所实现的功能编写回调函数,最后保存和运行设计的可视化界面系统。

  4.2条形码识别系统的设计

  条形码识别系统的GUI界面设计主要包括以下两个模块:一个是条形码的显示区域,另一个是控制按钮区域。条码显示区域包括原条码显示区域和处理后的条码图形区域。通过按键实现条码的读入和处理后的条码显示。

  条形码显示区域设计方法是将控件对象Axes用鼠标选择将其放置在布局区域内,调整坐标区位置和大小,让条形码显示区域放置在居中位置。

  图4.3条形码显示图

  为改变条形码显示区域的美观,双击坐标区改变检查器里面的Color选项让坐标区变为黑色;点击左侧工具栏里面的面板控件放置在界面底部选择颜色。得到如下形码显示区域:

  图4.4条形码显示美化图

  条形码显示区域的功能:

  (1)条形码显示区放置要处理的条形码图像,其条形码的显示是通过按键控制的方法将其显示在坐标轴中。

  (2)图像处理区主要放置经过处理后的条形码图像。通过按键实现图像的处理后将条形码处理结果显示在该区域中。

  按键控制区域主要包括读入条形码、图像的预处理、识别、关闭系统等按键。其功能是通过按键来实现条形码的读取、处理和识别,获取条形码的信息。

  控制按钮区域的设计和条码显示区设计方法如出一辙,将系统所需要的控件按钮用鼠标选择将其放置在布局区域内,调整坐标区位置和大小,然后分别进入每个控件按钮属性检查器修改string显示内容,每个按键显示的文本内容就是该按键所要实现的功能。在左侧放置静态文本框,用来显示译码结果。得到下图显示的控制按钮图:

  图4.5像处理控制按钮图

  按键控制控制区域设计完成后对界面进行美化,在左侧工具栏中选中面板控件设置面板颜色。为凸显识别结果栏将其属性颜色设置为黄色。美化后的控制按钮区域如下图所示:

  图4.6图像处理控制按钮图

  在GUI可视化界面设计平台下,成功地做出了下图所示的条形码识别系统,该系统包含了条形码的读取、处理、识别和关闭。条形码图像的处理结果在图片处理区域展现,其识别结果在底部静态文本中显示。

  图4.7条形码识别系统设计图

  条形码识别系统界面设计完成后,保存设计界面。利用工具栏上的运行按钮激活条形码识别系统界面。系统激活后会自动生成m文件和fig文件。条形码识别系统各个按键的功能是在m文件下编写回调函数实现,程序详见附录。

  4.3条形码识别系统测试

  为观察条形码识别系统图像处理后的变化和条形码译码结果的正确性,条形码识别系统设计完成后对该系统进行测试。条形码识别系统测试数据如下:

  (1)读入条形码:

  图4.8条形码读取图

  图4.9条形码读入结果图

  通过测试发现当点击读入条形码按钮时,系统会自动弹出文件夹用户自动选择要进行识别的条形码。条形码选中后,其显示结果会出现在条形码显示区域。

  (2)灰度化处理:

  图4.10灰度处理结果图

  条形码原图像经过灰度化处理操作结果如上图所示,经过会灰度化处理后的条形码图像的色彩发生变化,图像变为灰度图,其运行结果达到预期要求。

  (3)加噪、去噪处理:

  在该系统中测试的条形码大多为网站条码生成器(网址:www.t-x-m.com)在线生成的条形码,噪声处理不是特别明显。因此在条形码图像在去噪处理中加入了均值为0方差为0.02的高斯噪声,然后对加入噪声的条形码图像进行去噪处理。

  图4.11加噪图像

  条形码图像经过加噪处理后结果如上图所示,在系统设计中将加噪和去噪处理都放置在图像去噪按钮中,按键实现对条形码图像加噪后进行去噪处理,系统只显示条形码去噪后的结果图。

  图4.12条形码图像去噪结果图

  (4)直方图增强:

  直方图增强处理能将像素比较少的灰度分配到别的灰度中去,这样能够使像素相对集中,有效的增强条形码图像的清晰度。通过测试发现系统将去噪后的条形码图像变得清晰,亮度均匀分布在条形码区域。测试结果如下图所示:

  图4.13条形码直方图增强结果图

  (5)中值滤波:

  条形码图像经过直方图增强后进行滤波处理,目的是去除条形码中孤立的噪声点,使得每个像素点的灰度值相同。测试结果如下图所示:

  图4.14中值滤波结果图

  (6)二值腐蚀:

  二值化处理是将条形码图像只呈现出黑白色彩,减少条形码图像的数据量。腐蚀能够细化条形码的轮廓,使得条形码黑白效果更加明显。经过处理后的条形码如下图所示:

  图4.15二值腐蚀结果图

  (7)识别:

  对条形码图像处理后就进行条形码信息的识别,识别结果如下图所示:

  图4.16条形码识别结果图

  通过对条形码识别系统的测试,该系统能够完成对条形码图像的处理和识别。条形码的前置字符主要是为了规定条形码数据字符的编码规则,在这里只识别了前置字符为0的条形码,在识别结果中没有显示出来,主要是因为程序中没有设计识别前置字符,导致了前置字符结果无法显示。

  为了防止条形码识别系统识别成功的偶然性,对其他类别的条形码也进行了识别,测试结果如下图所示:

  图4.17条形码原图

  图4.18条形码识别结果图

  图4.19条形码原图

  图4.20条形码识别结果图

  上述识别的条形码是code类型条形码,code-39码比较特殊,识别结果的显示是以*开始和结束。通过测试发现该系统能够准确识别条形码,达到了条形码识别系统的预期效果。

  4.4误差分析

  系统经过测试,该程序识别条形码正确率为90%。实验选择了30张图片作为样本,能够正确识别27张。对其他的3张图片做了进一步的分析发现问题出现在以下几个方面:

  (1)系统问题。因为本人知识段备不足,专业技术能力有限,程序设计存在一些不足,导致系统不能提取条形码有效的信息,从而造成了不能准确的识别。经过对程序的修改和完善,程序正确识别率相比于之前有所提高。

  (2)条形码质量。有些条形码在生产和运输的过程中沾染了污渍,或者经过长时间的暴晒,会导致条形码变得模糊看不清楚,这将严重影响条形码的误读。

  (3)环境问题。该系统是在MATLAB2018a版本软件下设计完成,在运行的过程中,条形码识别系统存在卡顿,运行比较缓慢,对运行结果产生了一定的影响。