基于图像识别条形码模块硬件实现

2022-09-19 01:35魏陈鸿王仁平陈荣林
关键词:译码条形码阈值

魏陈鸿,王仁平,陈荣林

(福州大学 物理与信息工程学院,福建 福州 350108)

0 引言

随着经济的发展和商品的快速流通,条形码技术已经成为一种常用的商品识别技术,通过条形码识别后,计算机可以快速得到该商品的生产地、生产厂家、产品代码等信息[1],已经广泛应用于各个领域[2]。条形码的识别通常是使用激光扫描器通过线性扫描的方式得到条码对应的电平信号[3],再通过计算机进行译码。由于激光扫描器成本过高,并且需要人为的将商品条形码垂直于扫描器[4],才能正确读取出条形码信息,导致只有一些中大型超市才会使用,无法普及到每一个店家。本文在基于激光扫描器价格昂贵、使用不方便的情况下,利用图像处理技术对EAN-13商品码识别进行研究,设计使用OV7670摄像头的条形码识别模块。该模块可以有效降低条形码读取设备的价格,简化设备的使用难度,因此具有较大的应用前景。

1 条形码模块设计

基于图像识别的条形码模块总体设计如图1所示,通过外部摄像头OV7670采集得到640×480 RGB565图像,对其进行图像单色处理、图像定位、图像分割、图像倾角矫正、条形码译码识别等操作。

图1 条形码模块总体设计

1.1 图像定位功能

图像定位功能细化如图2所示。图像的位置跟其轮廓有关,因此采用索贝尔算子(Sobel operator)进行边缘检测[5],检测后用得到的图像边缘信息替代原图;但只有图像的边缘信息,加上边缘检测中可能存在的边缘信息丢失,可能将导致图像轮廓不明确,因此设计对边缘检测的结果进行膨胀,来补全丢失的边缘信息[6-7]。为了达到最好的膨胀效果,在MATLAB上多次试验后,算子大小为13×13时,膨胀效果最理想。膨胀后图像中彼此连通的点形成了一个闭合的区域。用连通域定位的方式可以快速定位各个区域的坐标信息。

图2 图像定位细化

常用基于行程和基于轮廓的2种算法[8],都不适合使用硬件电路实现。前者需要大量的缓存空间,耗费大量的硬件资源;后者需要同时读取大量存于随机存取存储器(random access memory, RAM)的像素点,需要大量时间。考虑到条形码区域为规则矩形,本文提出基于硬件实现的二次扫描配合逆序读写方式进行连通域定位的方法,在单端口的RAM的条件下,做到在较短的时间内完成全部区域的判断和标记,实现硬件资源优化,其连通域定位思路如图3所示。

图3 连通域定位思路

1.2 图像倾角矫正功能

图像倾角矫正需要先计算出图像的倾斜角度,再进行图像的旋转。图像倾斜角度的计算方法有通常两点法、最小二乘法、Hough变换法以及Radon变换法等。其中两点法和最小二乘法虽然计算量小,但抗干扰能力差,并且需要做大量的除法运算。Hough变换法和Radon变换法则具有较好的鲁棒性,抗噪声能力强,精度较高,虽然运算量比较大[9-10],但不需要使用除法器更适合硬件实现,因此本文采用Hough变换法计算旋转角度。

1.3 条形码译码识别功能

商品码EAN-13的结构由左侧空白区、起始符、左侧数据符、中间分隔符、右侧数据符、校验符、终止符、右侧空白区组成,总共有59个黑白条块,且平行并列排布。每一个数据字符都会由2个白色条块和2个黑色条块组成,每一个条块都由1~4个标准条块组成,即每一个数字字符都由7个标准条块组成[11-12]。如何得到每个条块的宽度以及标准条宽的宽度是正确译码的关键。

条形码译码设计如图4所示。首先,顺序遍历图片,判断是否为有效信息行(像素产生至少59次跳变),同时记录跳变位置以及满足条件的行数;其次,求出标准条宽,并计算出95个数据信息;最后,通过EAN-13条形码库得出当前所对应的13个编码数据。在实际运行中存在一些问题:①容易因为噪声干扰,导致59个色块寻找错误;②筛选出来的行数是个变量,硬件实现中需要综合出除法器,资源占用大。针对出现的问题,优化思路如下:①有效行判断时,加上起始位和终止位的条形码特征判断,若不出现起止位,则此行数据无效;②固定使用32条有效行来以移位代替除法计算,并且获取37条有效行后,舍弃前面的5行,防止因为条形码顶行跳变不稳定导致的误差。

图4 条形码译码设计

2 条形码模块实现算法优化

以硬件方式实现图像算法,需要对图像算法进行适合硬件化优化,以减少硬件资源的使用和加快处理速度,因此文中从速度优化、精度优化和面积优化3个方面介绍条形码模块实现算法的优化。

2.1 速度优化

本模块采集640×480的图像数据,在设计过程考虑采用UMC 55n1P6M工艺流片,而UMC 55n1P6M工艺仅提供单端口8位宽的RAM 存储器,这种RAM只有一组地址线,且一个地址对应的存储空间只能读写一个8位的数据。从RAM中读取整张图像的时钟周期数达到640×480=307 200个时钟,将整张图像写入RAM 存储器也需要同样的时间,若不对存取数据进行优化则图像定位的每一步至少需要640×480×2=614 400个时钟周期,严重影响整个模块的工作效率。考虑到Sobel算法的输出结果经过阈值比较后,可以转化为1和0两种状态,同时膨胀的结果也是1和0两种状态,加上单端口ram的8位位宽,因此在硬件设计过程中,采用数据组合方式和逆序读写方式进行优化。

2.1.1 数据组合方式

将Sobel的输出结果,以每8个结果为一组,组合成一个8位的数据存到RAM的一个地址里。这种方式下640×480的图像被压缩成80×480的图像。Sobel每一个时钟完成一个像素点的计算,该模块写入时,需先完成每一个点计算,所以图像数据组合对边缘检测模块的读写周期无影响,同时也不会影响图像信息,压缩前图像信息如图5(a)所示,图像数据在压缩后,只有左侧的80列存在数据,如图5(b)所示,在左侧的80列中将图5(a)的图像,每8列合并在一起,导致图像人眼看起来模糊,但实际图像信息未丢失。

(a)压缩前图像信息

图像数据组合可以显著优化图像膨胀模块,在该模块读写数据时,数据组合后图像膨胀模块只需要读取一张80×480图像的时钟,同时写入的数据也变为80×480个时钟,膨胀原图效果如图6(a)所示,膨胀压缩后图像如图6(b)所示。

(a)不压缩

同时,连通域定位模块第一次扫描时的数据读取,也变成了读取一张80×480的图像,明显节省时钟周期的数量。数据压缩前后时钟周期数对比和节约时钟周期数见表1。

表1 数据压缩前后时间对比

2.1.2 逆序读写方式

模块中图像膨胀部分,传统方式为从左到右、从上到下对原图像进行读取,同时为了保证原图数据的有效性,必须读取完前面的7行,得到13×13算子计算窗口的数据后,才能将膨胀后的数据写回第一行,导致这个模块需要缓存7行的数据才能保证每一个计算窗口的结果正确;但图像数据压缩之后,每一个地址实际存放的是8位数据,读取2个地址就取得16个数据,达到算子的一行数据量,因此设计使用从上往下的方式进行数据读取,只需缓存第1列的数据,读取到第2例数据时,就达到13×13算子所需的数据量。同时考虑组合后的数据只存放在RAM控制的左侧1/8的位置[图5(b)],而右侧的7/8都是处于空闲状态。假如不对输出的结果进行压缩,且仍使用从左往右的方式读取时,将造成读2个地址写13个地址的情况,导致新的数据覆盖原有数据,影响后续的判断。本设计使用从右往左的方式进行数据处理,可以直接将数据存到右侧的剩余空间,由于右侧有7/8的空闲空间,因此不会影响原始数据。膨胀输出不压缩,且膨胀到一半的效果如图7(a)所示,膨胀后压缩的效果如图7(b)所示。

(a)输出膨胀不压缩,膨胀一半

2.2 精度优化

图像识别过程中,Hough计算模块和译码识别模块在开始工作前,需要对原图数据进行二值化以达到简单滤波的效果,这个简易二值化滤波的阈值对模块输出结果的准确性造成很大的影响,因此本设计时使用多档阈值来提高模块的输出精度。而对于图像旋转模块,传统正向的方式在旋转后会产生空白噪点[13],解决办法是使用反向映射的方式提高旋转精度。

2.2.1 Hough变换模块的阈值变化设计

考虑到条形码的特征,所有的编码都是直线,每一个条码的斜率都相同,这个斜率同时是整个图像的斜率,因此在裁剪后的图像中心提取一个40×40的图像窗口进行Hough变换并计算直线的斜率。在通过阈值判断后,二值化后的数据中可能存在有效点数量少的情况,导致Hough计算出来的角度错误。由于代码编写问题,设计中这种情况也会显示角度为45°。为解决该问题,添加一个阈值变化设置,当计算的角度是45°时,修改阈值重新判断。若2次的结果不一样时,以非45°的为准;若2次结果一样时,判断角度为45°,具体实现的框架如图8所示。

图8 Hough计算修改阈值框架

在Verilog硬件实现中使用查找表代替三角函数计算,导致最终的角度存在一定的误差。经过大量对MATLAB结果和Verilog结果进行分析,计算出来的角度误差在1°~3°,对后续的译码结果不会产生影响。

2.2.2 条形码译码模块的多档阈值设计

条形码译码过程中,噪声的干扰可以通过起始位和终止位的条形码特征判断解决,有效行数不确定导致出现除法情况可以通过固定行数来解决;但由于条形码译码时输入数据是8位的原图数据,因此通过阈值二值化后有时会出现数据缺漏,本设计采用8档阈值进行条宽识别和定位码检测改进,改进后条形码译码设计思路如图9所示。

图9 改进后条形码译码设计思路

当译码出现错误时,自动切换阈值结果,再进行编码查询,确保译码结果的正确,Verilog译码结果跟MATLAB译码结果比较结果如图10所示。

(a)MATLAB译码结果

2.2.3 反向映射提高旋转精度

图像旋转部分为了防止图像在旋转之后需要的存储空间大于RAM的存储空间和减少三角变换后地址缺失[14],本设计解决办法是采用反向映射法来进行图像旋转。反向映射法中目标图像坐标(x1,y1)与原图坐标(x0,y0)变换关系如式(1)所示。

(1)

将目标图像的坐标与原图的坐标进行匹配,若在原图像中能找到匹配的图像,将该点数据存入目标图像坐标;若在原图中找不到该点,则不作处理。Verilog输出结果跟MATLAB自带旋转函数的旋转结果对比效果如图11所示。

(a)MATLAB自带旋转函数结果

2.3 面积优化

图像边缘检测、图像膨胀、连通域定位、条形码译码等都需要大量的空间储存计算过程中的数据,且一个时钟内需要同时读取多个数据,采用RAM储存不适合,需要使用寄存器。而这些寄存器会占用大量的硬件资源,增加芯片面积,因此本设计减少使用寄存器数量和共用存器组进行深入研究。

2.3.1 连通域定位的算法优化减少寄存器数量

传统的二次扫描第一次遍历图像时,使用从左到右、从上到下的8邻域判断方式,标记遍历的每一个区域[图12(a)],记录下每一个区域的左上角、右下角的顶点坐标和当前区域有效点的数量,用于后续的最大最小区域的判断,同时还需要记录下每个区域相邻的编号,给出区域的等量关系[图12(b)]。第二次扫描时,重新从左到右、从上到下根据第一次给出的等量关系[图12(c)],重新修改每一个区域的编号和对应的存储信息。传统的二次扫描会导致等量关系的数量不确定,尤其对于倾斜的图案需要大量的寄存器来记录这个等量信息。

本设计提出第二次扫描时使用逆向读取结果的方式免除对于等量信息的储存,节省寄存器数量。逆向读取结果方式采用从下到上、从右到左重新读取每一个地址的信息,同时采用4邻域方法,即当前点的周围有其他编号的点,那么直接将当前点的编号修改为4邻域判断出来的编号结果,同时修改对应的储存信息。第一个修改点是编号为3且靠近1的点,当判断到这个点时,由于周围存在比3小的编号且相邻,因此将这个点的编号修改为1,同时修改1号编号的顶点坐标和有效点数量[图12(d)]。

(a)一次扫描结果

这种逆向读取结果的方式在规则图像判断的结果跟传统方式一致,但是可以省去记录等量关系的寄存器。根据图像区域的数量和倾斜角度,大概可以节约10%~30%的寄存器数量,Verilog输出结果跟MATLAB输出比较如图13所示。

(a)MATLAB输出

2.3.2 寄存器组的共用设计

图像的边缘检测使用3×3的Soble算子,需要读取完前面的2行数据才可以进行算子的计算,边缘检测的数据缓存情况如图14所示。

图14 边缘检测的数据缓存情况

图像膨胀即使对读取的数据进行了压缩,还是需要对前一列读出的数据进行一些缓存,图像膨胀的数据缓存情况如图15所示。

图15 图像膨胀的数据缓存情况

无论是8邻域还是4邻域的连通域定位,至少需要对上一行的数据进行缓存,同时对于每一个区域的顶点坐标和区域有效点的数量进行缓存,连通域定位的数据缓存情况如图16所示。

图16 连通域定位的数据缓存情况

在条形码译码时期,也需要对条形码的每一个条宽的大小,位置信息以及解析后的95个数据信息进行缓存。

本设计为了减少芯片面积,只使用2片320 k×8 bit的静态随机存取存储器(static random-access memory,SRAM)缓存图像数据,一片SRAM用于缓存原图像,一片SRAM用于缓存过渡数据,整个流程需要前一张图像处理完后再处理后一张图像。条形码模块内部每个部件也是顺序执行的,前一个部件的储存空间在该部件结束后就空出给后一个部件使用,条形码模块每个部件缓存空间结构如图17所示。

图17 缓存空间结构

用逻辑综合工具Design Compiler基于UMC 55n1P6M工艺对标准单元面积优化前和优化后的大小进行对比,优化前标准单元的面积为1 252 374.178 183 μm2,优化后标准单元面积为383 742.652 668 μm2,优化前大概是优化后的3倍。

3 结论

本设计针对一维条形码中的EAN-13商品码的识别技术,基于图像处理技术,从硬件设计的角度提出了图像采集到条形码译码的方法,在VCS的前仿真和后仿真中,导入的1 012张的条形码图像中,除去4张光照过强、3张光照过暗、5张拍摄模糊、1张条形码破损严重,剩下的999张都译码正确,图像识别率达到了98.7%。使用VC709 FPGA的板级验证中,实现正常译码。本模块已经和RISC-V组成SoC芯片,于2022年1月送往联华电子台湾晶圆厂进行MPW。

猜你喜欢
译码条形码阈值
极化码自适应信道译码算法
土石坝坝体失稳破坏降水阈值的确定方法
基于扩大候选码元范围的非二元LDPC加权迭代硬可靠度译码算法
创意条形码
分段CRC 辅助极化码SCL 比特翻转译码算法
基于校正搜索宽度的极化码译码算法研究
采用红细胞沉降率和C-反应蛋白作为假体周围感染的阈值
条形码里有数学
有趣的条形码
辽宁强对流天气物理量阈值探索统计分析