二维条码识别系统设计原理

当前位置:条形码控件网 > 条形码控件技术文章 > >正文

二维条码识别系统设计原理

发布时间:2014-10-27

二维条码PDF417中PDF为Portable Data File的缩写,每一个PDF码的储存量可高达1 108字节,若将数字压缩则可存放2 729字节。作为一种新的信息存储和传递技术,PDF417具有成本低、信息可随载体移动、不依赖于数据库和计算机网络、保密防伪性能强等优点,广泛应用在国防、公共安全、交通运输、医疗保健、工业、商业、金融、海关及政府管理等领域,PDF417码的例子如图1所示,了解PDF417译码相关知识请点击。
1 系统总体设计
本系统在FPGA上使用SOPC技术来实现无线手持二维条码识读器,与传统一维条码识读器最大的区别在于完全脱离后台数据库,以及在高达50%破损率的情况下能够进行高效率识别。

图1 PDF417二维条码

SOPC技术是一种基于FPGA解决方案的SOC,由美国Altera公司于2000年提出。基于SOPC平台的开发结合了FPGA灵活可编程与片上。NioslI软核处理器的用户可配置等特点。在实现某功能时,通过在NiosII处理器下编写C程序运行,也可以使用硬件模块来加速。本系统综合两种实现思路,采用高性价比的Cyclone II EP2C35系列FPGA实现,系统总体结构如图2所示。

图2 二维条码识别系统总体结构框图

整个系统由低到高分为三个层次:条码识别的硬件平台、μC/OS—II操作系统、条码译码核心算法。最底层硬件平台采用Altera公司的Cylone II EP2C35与ADI公司的视频解码芯片ADV7181B,具有8 MB的Flash存储器,1.MB的SRAM等外设;中间层μC/OS—II操作系统提供任务调度和设备驱动,以及提供各种中断来实现对外界请求的响应,如模式切换、LCM.显示、射频传送等,有效地提高了系统运行速率;最顶层条码译码核心算法包括了对条码图像的预处理和对译码数据的RS纠错,采用C语言在NiosII的集成开发环境中(IDE)实现。
1.1 系统硬件结构
系统通过配置视频采集芯片ADV7181B,通过图像采集子系统将CCD采集到的条码数据存储在SRAM中后,产生硬件中断,处理器响应中断,Nios对SRAM中的数据进行图像预处理、译码及纠错,通过译码算法硬件加速模块对耗时较多部分算法进行优化,在实现条码数据译码及纠错后,产生射频传送和LCM显示中断,进入中断程序将译码数据通过射频传输模块发送到上位机,并且在LCM实时显示。其硬件平台结构原理如图3所示。

图3 二维条码识别系统硬件平台结构原理

1.2 图像采集子系统
由于本设计采用的是灰度图,因此图像采集子系统的主要功能是:配置采集芯片,从解码芯片读出数据流,根据行场同步信号对数据流进行分离,提取出亮度信号,并将采集到的亮度信号通过乒乓缓存存入SRAM中。
在设计中,采用ADI的解码芯片ADV7181B进行图像信号的数模转换,FPGA中的I2C模块是作为主设备来对ADV7181B进行配置的,而ADV7181B作为从设备来接受I2C总线传来的数据,实现芯片的初始化、寄存器的配置等。图4中T_DA为数据信号,TD_VS为场同步信号,TD_HS为行同步信号。

图4 二维条码识别系统图像采集子系统

系统上电时,I2C配置模块将对ADV7181B的内部寄存器进行配置,ADV7181B将模拟信号转换为Y:U:V为42:2:2的8位CCIR656数字信号,其中输出的时序包括行场同步、行场消隐、行频场频及场识别等信号。

CCD摄像头采集的图像实际尺寸为768×576像素,每帧图像由奇场数据和偶场数据交错组合而成,奇场数据与偶场数据在时间上是先后输入的。本设计使用的是320×240的液晶显示屏,在处理过程中也采用的是320×240的图片格式,所以要对摄像头采集的图片进行提取。在设计中仅采奇场数据的中间240行,并对每行中间的640个数据每两个像素抽取一个像素,从而得到符合系统要求的图像大小。由于一帧图像的奇场数据与偶场数据实际上非常接近,而每行的相邻两个像素值也几乎没有差异,因此可以得到原输入图的缩小图像而不会有失真。
图像存入SRAM采用了乒乓缓存,如图5所示,是为了防止写出速度快于写入速度而导致出现错误数据。采用两个行缓存进行乒乓切换,在数据提取子模块向行A写入数据时,数据写出子模块读取行缓存B中的数据输出到总线;在对下一行进行采集时,对行缓存A读数据,对行缓存B写数据。因此行缓存写路选器与行缓存读路选器在同一时刻选通的一定是不同的行缓存。

图5 乒乓缓存

2 条码识别核心算法
条码译码主要流程是首先对条码进行自适应二值化,然后对条码进行定位、旋转、分割。分割出单个码字后,通过边缘检测,得到条码条空序列模块宽度后,再进行纠错解码。
传统条码识别算法在对条码定位时多采用Hough变换,通过Hough变换提取条码图像中的直线倾角来旋转条码。但是Hough变换的大运算量并不适用于实时性要求高的的嵌入式设备。笔者结合PDF417条码自身的特点,采用4点定位的方法来分割条码,有效提高条码识别速度。核心算法流程详细步骤如下:
(1)条码定位
实际采集条码时会出现各种倾斜,如图6所示。如何定位条码是关键的问题。可以利用条码起始头特有的比例来定位。按照国标的定义,PDF417二维条码的起始符黑白条空比是81111113,终止符黑白条空比是711311121。扫描图像的每一行,分别匹配起始符和终止符的条空比。考虑到条码采集过程中,边缘受高斯点扩展函数的影响,只要黑白条空比例的误差不超过三位,可近似认为符合比例。标记所有符合起始符条空比比例条码线段,可以得到4个控制点a、b、c、d,用同样的方法可以寻找符合终止符条空比的条码线段,确定点e、f、g、h。判断a、c、e、g是否为正确控制点的标准是,平行边长度误差在5个像素点内,且相邻边角度为90°,其误差角度为2°。

图6 PDF417二维条码起始点和终止点的确定

(2)行条码分割及行高确定
由于PDF417条码是层叠式条码,在对单行条码码字进行识别时,必须得到条码的行数,然后分离出每一行。首先对条码使用Sobel算子进行水平边缘检测,如图7所示,然后向水平方向投影,如图8所示。

图7 Sobel算子水平边缘检测

图8 水平边缘投影

已知p(x)对应投影的峰值,也就条码的边界,通过对投影下来的每个值求一次差分▽ p(x),然后逐个判断各个差分值,如果连续两个投影的差分值前一个是负数而后一个是0或者正数,则说明此点是峰值。峰值处的坐标即为条码分层的地方,考虑到条码层与层连接的地方在二值化时会出现噪点,则取每层条码图像中间的50%作为有效图像。

(3)码字识别
分割出单个码字后,得到条空的像素个数,记为{M1,M2,…,M8},因为4个条和4个空的总模块数为17,可以根据式(1)得出条模块数的集合{T1,T2,T3,T4)。同样,用Ki替代式(1)中的Ti,可得到空模块数的集合{K1,K2,K3,K4}。

图9 二维条码系统软件设计流程图

因PDF417条码用了三个簇的数据来组成一个条码,三个簇的数据量较大,且每个簇中的数据与条空比无一致对应关系,所以就涉及把条空比转换成条码数据的问题。本算法采用的解决方案是:用哈希算法来查找:
F=Z×1400+K2×216+T3×36+K4×6+T (2)
式(2)中Z为空1模块数和条2模块数的组合,再利用F的值进行查找,实现数据流的译码。数据流译码不是本文重点,这里不再详细阐述。 
3 系统软件设计
系统软件是在Nios II的μC/OSII操作系统下进行C语言编程的。系统初始化主要包括对采集芯片、射频传输控制模块、网络接口的初始化,整个系统动态扫描条码图像和实时译码。系统主要流程如图9所示。其中,系统初始化时利用函数IOWR(SIGNAL_CAP_O_BASE,O,1)将采集模块全局信号复位,然后使用函数alt_irq_register。(SIGNAL_CAP_0_IRQ,NULL,sig_cap_irq_proc)来建立一个用户中断程序,对按键中断响应进入中断服务程序sig_cap_irq_proc,向摄像头发送采集指令。当采集模块完成一幅条码图像采集后,产生一个硬件中断,将标志FLAG置1。当主循环程序判断FLAG为1时,就可以从外扩的SRAM中将图像数据读入SDRAM中,接着进行图像预处理和译码,其中包括用自定义用户指令和硬件模块实现的一些运算量大的部分。射频传输与NiosII的PIO口相连,通过函数IOWR_ALTERA_AVALON_PIO_DA_TA来实现。
4 实验与分析
本识别系统工作频率为100 MHz,图像采样分辨率为320×240,一幅条码图像识别时间为60 ms。本系统有如下几个特点:
①利用PDF417码本身的特点来定位分割条码,与传统的条码定位分割算法相比,大大提高了条码识别速率。传统二维条码定位分割多采用Hough变换来确定条码倾斜角度,不能满足手持式嵌入式条码识读器的实时性要求。
②在FPGA中嵌入NioslI软核处理器,简化硬件设计,同时使系统更加稳定。FPGA的可重配置以及SOPC的可裁减使系统具有很高的资源利用率,而且方便升级和维护。
③利用自定义模块、自定义指令、C2H硬件加速等方法刮对部分耗时算法进行优化,大大提高了整个系统识别速率。
笔者针对不同环境下采集的300幅条码图像进行了三次测试:第一次是在条码无破损的情况下,第二次是在条码有5%破损和污染的情况下,第三次随机识别100幅条码。本文所采用的算法平均识别率达96.7%,耗时60ms,如表1所列。

表1 测试结果

-->

推荐产品

条形码控件新闻

更多

条形码控件开发代码

更多

北京龙博中科软件有限公司旗下网站

站长统计

分享到

分享到:

时间: 2024-10-12 16:44:49

二维条码识别系统设计原理的相关文章

Atitit java 二维码识别 图片识别

1.1. 解码11.2. 首先,我们先说一下二维码一共有40个尺寸.官方叫版本Version.11.3. 二维码的样例:21.4. 定位图案21.5. 数据编码31.6. 错误修正容量L水平7%的字码可被修正M水平15%的字码可被修正Q水平25%的字码可被修正H水平30%的字码可被修正31.7. QR是怎么对数据码加上纠错码的?31.8. 画二维码图41.9. 简要的编码过程:数据分析:确定编码的字符类型,按相应的字符集转换成符号字符: 选择纠错等级,71.10. qr长度容量7 1.1.解码编

关于viewport引起的微信二维码识别区域偏移的问题讨论与解决

一.问题概述 在开发一个含有二维码的微信页面时,我遇到了这样一个问题:使用iPhone第一次进入该页面时,二维码可以长按识别,但第二次进入时长按无法识别到二维码.安卓机都能识别. 二.我进行了以下尝试: 移除控制进入条件的脚本,即部分第一次第二次,长按不能识别二维码.暂时排除脚本原因. 移除二维码所有样式,发现并不是不能识别到二维码而是识别区域发生了偏移.(图1) 移除所有元素,页面上只留一张二维码,发现识别区域变大.虽然整张图都被识别了但图片外面的区域也会被识别.(图2) 图1 图2阶段性结论

基于opencv3.0和zbar下的条形码与二维码识别

其中对条码与二维码的识别分为以下4个步骤 1. 利用opencv和Zbar(或者Zxing)对标准的条形码图片(即没有多余背景干扰,且图片没有倾斜)进行解码,将解码信息显示出来,并与原始信息对比. 2. 利用opencv和Zbar(或者Zxing)对标准的QR二维码图片(即没有多余背景干扰,且图片没有倾斜)进行解码,将解码信息显示出来,并与原始信息对比. 3. 对非标准条形码,进行定位,然后用Zbar(或者Zxing)解码显示. 4. 对非标准的QR二维码图片,进行定位,然后用Zbar(或者Zx

聊一聊二维码扫描登录原理

扫二维码登录现在比较常见,比如微信.支付宝等 PC 端登录,并且好像每款 APP 都支持扫码登录,不搞个扫码登录都不好意思.作为技术人员,不知道您对这背后的实现逻辑是否敢兴趣,反正我是一直都对这背后实现好奇.最近刚好看到一个关于扫码登录原理的视频,于是就整理出来了这篇文章,希望对您有所帮助. 本文共三个主题: 什么是二维码. 移动端基于 token 的认证机制. 二维码扫码登录的原理. 1.什么是二维码 二维码又称二维条码,常见的二维码为QR Code,QR全称Quick Response,是一

iOS 花式二维码生成和二维码识别

iOS 原生的二维码识别非常之棒,反正比 ZXing 和 ZBar 效果都好些,所以以后打算尽量用原生的二维码识别,然后最近把原生的二维码生成也顺便做了一遍,并且在原有基础上加了一些样式参数,封了一个小库方便以后使用. 项目地址:https://github.com/EyreFree/EFQRCode EFQRCode 是一个用 Swift 编写的用来生成和识别二维码的库,它基于系统二维码生成与识别进行开发. 生成:利用输入的水印图/图标等资源生成各种艺术二维码: 识别:识别率比 iOS 原生二

支持一些线性和二维条码类型的条形码生成控件IDAutomation ActiveX Barcode Control

IDAutomation ActiveX Barcode Control条形码控件是一个易于使用的图形对象,无需使用位图或特殊字体就可用它创建条码图像.此外,这个条形码ActiveX组件还能自动地格式化生成的条码结果,包括了所有必要的开始和结束字符以及校验计算.支持一些线性和二维条码类型,包括Code 39,扩展的Code 39, USS Code 128, GS1-128, Interleaved 2 of 5, LOGMARS, Codabar, EAN-128, UPC-A, UPC-E,

Python zxing 库解析(条形码二维码识别)

各种扫码软件 最近要做个二维码识别的项目,查到二维码识别有好多开源的不开源的软件 http://www.oschina.net/project/tag/238/ Zbar 首先试了一下Zbar,python加载ZBar时各种报错.可能的原因是zbar的dll文件是32位的,而我系统是64位的,所以运行不了.只能自己拿源码编译一个64位的出来,对于我这种伸手党来说自己编译源码是难以接受的,所以就放弃了.后来看到文章说Zbar不能识别倾斜的条形码,而且也不能定位条形码区域. Zxing zbar不可

QRCode - 二维码识别与生成

来源:Yi'mouleng(@丶伊眸冷) 链接:http://t.cn/R40WxcM 前言 有关二维码的介绍,我这里不做过多说明, 可以直接去基维百科查看,附上链接QR code(https://en.wikipedia.org/wiki/QR_code). IOS7之前,开发者进行扫码编程时,一般会借助第三方库.常用的是ZBarSDKa和ZXingObjC,IOS7之后,系统的AVMetadataObject类中,为我们提供了解析二维码的接口.经过测试,使用原生API扫描和处理的效率非常高,

java qr二维条码生成器

原文:java qr二维条码生成器 代码下载地址:http://www.zuidaima.com/share/1550463250156544.htm qr二维码,不过是未加密的 标签: java 二维码 qr二维码话题: 文本解析和文件处理 脚本和工具 java qr二维条码生成器