基于DSP的PDF417快速解码终端的设计与实现
扫描二维码
随时随地手机看文章
本文介绍的解码终端采用专用条码摄像头采集条码图像,在基于TMS320C6713的DSP平台上实现了PDF417条码的准确、快速读取。
1 PDF417条码概述
PDF417是一种堆叠式二维条形码。组成条码的每一个符号字符代表编码集中的一个码字,并且均由4条4空共17个单位模块构成。图1给出了PDF417条码结构图[1]。条码由多层一维条码从上至下堆叠而成,每一层都可分为静区、起始符、行指示符、信息码字、结束符几个部分。条码每层具有相同的起始符与结束符,对应的条空序列分别为81111113和711311121。
条码采用文本、字节和数字三种数据压缩模式将原始数据转换为0~928的码字。三种压缩模式分别对不用类型的数据具有较高的压缩率,三者之间用模式转换与模式锁存进行灵活的转换。
PDF417采用Reed-Solomon码对条码数据进行检错与纠错,最高级别含有512个纠错码字,可复原条码50%的码字。
2 硬件平台
系统的硬件架构如图2所示。系统硬件主要包含图像处理和图像采集两个模块。
2.1 图像处理模块
系统的图像处理模块采用DSP外配SDRAM的方式实现图像的快速处理。DSP芯片选取TI公司的高性能32位浮点处理芯片TMS320C6713B;SDRAM芯片为Micron公司的MT48LC32M8A2,其存储空间为256 MB。C6713芯片的高速浮点处理能力保证了条空宽度确定的速度与准确性。系统工作过程中,SDRAM的作用为:缓存图像数据;存放图像运算的中间变量;作为系统的堆栈空间和常量及表的存放空间。
2.2 图像采集模块
视频数据采集模块由条码采集摄像头、FPGA和乒乓RAM 3个部分组成。摄像头采用Microscan公司的条码图像采集专用激光摄像头QUADRUS MINI Imager。由于TMS320C6713B芯片无video port接口,不能直接和摄像头进行逻辑连接,因而采用ALTERA公司的EP1C6作为控制核心,将Camera采集的视频信号流以帧为单位保存到高速SRAM中,并在合适的时机将SRAM总线切换给DSP以供运算处理。乒乓RAM以FPGA和DSP之间的通信接口RAM而存在,解决了DSP和摄像头连接的问题。另外,该模块还为摄像头配备LED补光系统以改善采集图像的质量。
3 软件设计
解码终端软件的设计强调提升条码识别率、解码正确率和系统实时性3个指标,主要包含二值化、区域定位、精确定位、条码分层等模块。图3为系统软件架构。
3.1 不均匀光照条件下的图像二值化
条码图像二值化要考虑不均匀光照的影响以及系统实时性解码的要求。本文改进了Bernsen算法[3],成功地去除了不均匀光照的影响。该算法处理步骤如下:
(1)用大津法取得粗阈值为T。扫描整个f(x,y)灰度图像,如果f(x,y)>T+a,则b(x,y)=255;如果f(x,y)<T+a,则b(x,y)=0。其中a为Bernsen算法的处理区间宽度,取值范围15~30,b(x,y)为二值化后图像。
(2)对发生光照不均匀最严重的区域,即落在区间T-a<f(x,y)<T+a的点进行处理,取w为阈值计算窗口,计算方法如下:
如果T3>a,则取T2为阈值;否则,取T4为阈值,对区间内的点进行二值化。
Bernsen算法只用T2作为阈值对区间内点进行二值化,忽略了全局阈值的作用,而改进的算法采用双阈值对不均匀光照的区域进行二值化处理,减少了伪影现象。该算法是全局阈值算法和局部阈值算法的结合,同时兼顾了处理效果和时间复杂度。
3.2 条码的区域定位
条码的区域定位计算较为复杂,因此算法的选择需要兼顾处理速度和处理效果。本文采用了基于连通域的区域定位算法[2],算法包括条码方向提取、条码区域连接和连通域标记3个步骤。图4给出了区域定位算法框图。[!--empirenews.page--]
条码方向的提取决定了膨胀运算所使用的结构体。由于对图像直接进行膨胀运算很容易受噪声的影响,算法首先将图像区域分为水平、垂直、45°和135° 4种大致方向,而后提取条码的方向并根据条码不同的方向使用4种不同的膨胀结构体。这样有效防止了与条码接近的其他文字等背景由于使用各向同性的结构体进行膨胀运算而连接到条码中。方向提取先得到图像横向和纵向的梯度信息,而后以适当的阈值对得到的梯度图二值化并进行比较。认为含有较多边界信息的图指示的方向为条码的走向。如果两图边界的差值在一定范围内,则用同样的方法检测45°和135°两个方向。
膨胀算法将条码连成一个紧密的连通区域,之后要进行连通域的标记以定位条码区域。算法包含3个步骤:
(1)如果当前点A是前景点并且其前一点未被标记,则认为A是一个连通域的外轮廓点;跟踪这个外轮廓,并将所有外轮廓点都标记为与A属于相同的连通域。
(2)如果当前点A下方的点是背景点且A的前一点已被标记,则认为A是连通域内轮廓点;跟踪这个内轮廓,并将所有内轮廓点都标记为与A属于相同的连通域。
(3)如果前景点A的前一点已被标记且不属于情况1和2,则将A标记为与其前一点属于相同的连通域。
边界的跟踪是通过搜索像素点8临域实现的,用顺时针排布的1~7分别代表8临域点,搜索方向更新公式为:
系统采用的连通域标记法舍弃了传统的二次标记方式,而采用跟踪连通域外轮廓的方法,只需要对图像进行一次扫描,因此具有更快的速度。
3.3 条码的精确定位
本文提出时间复杂度较低的边缘跟踪算法,精确定位了条码的4个顶点,为条码倾斜和几何形变的校正提供条件。图5给出了精确定位算法流程图。
以搜索左上角顶点为例。系统用参考点数组记录搜索到的条码起始符或结束符的边缘走向,步进点数组沿起始结束符黑色边界方向逐点步进。若步进过程中某一时刻,步进点数组与参考点数组夹角超过45°,说明步进点数组已步进到条码边缘,则将步进点数组中心点位置确定为条码的左上顶点。用类似的方法搜索,可得到条码的其他3个顶点。
条码的4个顶点确定以后,再经过旋转变换、错切变换和透视变换,将几何形变的不规则四边形条码校正为矩形条码。条码的旋转使终端的解码不再局限于水平和垂直的条码,实现了PDF417的全方位解码。
3.4 条码分层及码字读取
PDF417是堆叠式条形码,需要确定条码的层次以进行逐行码字的读取。确定条码层次的步骤如下:
(1)用Sobel边缘检测算子作用于图像,提取图像边界。
(2)将得到的分层界限进行水平投影,记录投影点数目p(i)。
(3)隔行差分。按照dif(i)=p(i)-p(i-2)计算第i行的投影差分值。若当前行投影差分值大于零,而其下一行差分值小于零,则认为该行为分层界限。
(4)伪边界去除。将投影高度小于投影峰值1/4的边界去除,以消除由噪声产生的伪边界。
得到条码的层边界后,系统采用层内投影并判断投影高度的方法来读取每层条码的条空信息。实践证明该方法具有较高的正确率。
用条空的宽度除以单位模块的宽度得到条码的条空宽度序列,如:81111113….31111334….711311121。单位模块宽度求解方法为:
其中,Wm为单位模块宽度,Wl为层宽,n为一层条空总数。
最终译码采用查表的方式将条空序列转换为码字序列。码字序列经过检错与纠错后,按照3种压缩模式编码的反方向进行译码,最终得到PDF417条码的原始数据。
4 实验结果
对采集到的28 000幅、分辨率为320×480的图像进行测试。测试结果表明,本终端对PDF417条码的识别率可达99.76%,识别码解码正确率为100%,解码速度达10次/s以上,具有国内领先的技术水平。