计算机视觉在条码识别上的应用
作者:马塞洛阿劳霍·阿尔梅达、阿尔瓦罗·曼努埃尔·德索萨·苏亚雷斯
摘要:条形码是世界上应用最成功的识别技术(identification technology)之一,这项技术诞生于在二十世纪下半叶并迅速的在工业和商业领域得到应用。本论文主要讨论一维条形码39码(code39)和交叉25码。并且讨论了获取编码在条形码中的信息的技术,并且将这项技术扩展到其他其他的符号识别技术中去。本文的目的是提出一种基于摄像头的开放解决方案,并使得通过计算机视觉来解码条形码成为可能。该方案可以分为四个基本模块:图像采集,预处理,解码,结果显示。我们对一些样品进行了实际测试并得到了令人满意的结果,这也验证了我们处理方法的正确性。我们达到了我们所提出的目的,实际的测试也验证了我们提出的方案的正确性也为条码解码部分做出了一些贡献。
关键字:计算机视觉,图像处理,条形码,Java
1.介绍
条形码是世界上应用最成功的识别技术之一,这个技术最初出现于二十世纪二十年代中期并迅速被工业和商业领域所接受。在制造业中通过在产品上标记条形码来跟踪物品的流通直到产品送至客户手中。条形码技术的应用也使得通过自动化的方式来优化物品的分检以及运输。条形码获得成功的最大的原因是条码技术易于维护且材料成本很低,而且用于解码的的仪器成本费用也非常低。即使后来有新的自动识别技术出现,例如射频识别技术(RFID—Radio Frequency identification)但这些技术目前还无法应用到具体的产品中,并RFID的识别设备以及编码设备的费用太高,因此难以商业化。
传统的条形码识读设备有很多种形式的具体应用,例如扫码枪、扫描笔等识读终端设备。作为一种光源发射装置,传统的扫描设备采用激光或者LED。这些识读设备的主要优势是通过发射别外界干扰光强很多的光线来相对减小外界光的干扰,通常使用红光来扫描印有条形码的区域,条码暗条纹的反射光线较弱,而亮条纹反射光线较亮。然后识读设备将反射光的强度翻译成二进制代码。这些识读设备是基于这种技术的,因此这也带来了一个限制:在距离较远的检测中外界光会严重的干扰到识读设备发射出的光。这些识读设备本身所固有的另一个问题是条码必须整齐的和扫描光线的扫描方向一致。有一些设备通过使用不同角度的复合扫描来解码条形码的信息。
条形码的广泛传播也带来了一些问题,例如必须使用一些不适合产品的材料,必须使用抛光的金属。为了解决这些问题,发展出了通过CCD等图像传感器来进行图像识别的条码识读器。这些基于图像处理的条码识读器能够从更大的区域获取到条码信息,其识读能力取决于图像的分辨率以及图片拍摄的角度。因此在进行解码操作前需要对图像进行一些操作来定位、放大或者旋转等预处理。但是采集的图像常常会有一些干扰来影响后续处理,条码区域常常会有一些噪声、斑点或者分辨率过低等问题。这些质量问题都是由识读设备的限制引起的,例如摄像头的分辨率太低、图片的拍摄环境太差、光照度太低等因素。拍摄环境差可能是由于图像采集过程中物品正在移动(来自流水线传送带的震动等)或者图像采集的环境光源很复杂从而使环境光强不可控,从而影响到目标区域的拍摄质量。
条形码的条和空之间要有很高的对比度,避免使用那些会使识读器难以识别甚至出现识读错误。因此,将获取的图片转换成单色图可以是图像的提取以及解码过程更加稳定。将灰度图转换为二值图的阀值技术常常用作条码识别的预处理,二值化过程可以突出图片的一些特征,但同时也有可能带来一些干扰影响到条码信息。
本论文主要研究了条码系统的特点和结构,以及一些用于解码,数据还原等图像处理的计算机算法。
论文的组织结构如下:第二部分介绍了条形码的结构以及主要要素;第三部分介绍了使用的技术以及算法细节;第四部分介绍了解码过程的结果;第五部分给出了结论以及将来的工作。
2.条码系统
条码系统由一系列不同宽度的条和空构成,这些条和空中存储着代表了不同含义的信息,并被称作符号,种形式的条码被称作条形码或者一维码。而二维码虽然也被称作条码,但是二维码更多是使用其他元素来代表信息例如正方形、点、六边形后者其他几何元素。
AIM(自动识别和移动,automatic identification and mobility)协会是代表制造商、设备供应商以及供应系统自动识别的贸易协会。包括条形码、射频识别技术、磁条类型识别、光学字符识别、语音识别以及视觉系统。
1983年,AIM技术符号创建委员会(TSC)为条码通用标准的制定提供了技术援助。TSC创建了5种统一符号规范或者直接用USS来描述五种非商业应用的常见条形码:USS-39,USS-I 2/5,USS-codebar,USS和USS-128-93。
条形码的基本组成单元是条和空以及左右的空白区域。这些基本组成单元由预先定义的宽度组成,这中预先定义的宽度被称作模块。模块的宽度直接影响了条码编码的密度。条码的模块越小,越多的符号可以在相同的空间进行编码,因而条码的编码密度越大。在一般情况下,模块小于0.254毫米的码被称作高密度码,模块大于0.508毫米的码被称作低密度码。
条形码的条通常是一些黑色或深色的细长的线,宽度在一个模块至多个模块之间变化。条形码的空通常是一些白色或其他浅色的空,宽度在一个模块宽度至多个模块宽度之间变化。一般情况下,每个单位宽度的条代表二进制数“1”,每个单位宽度的空代表二进制数“0”。在条码中,有着特定顺序的条和空形成了特定的符号,这些符号里存储着与其他条码不同的信息。
空白区域是保留的边界区域,位于第一个符号之前和最后一个符号之后,与条码信息无关,只是单独的空白区域,其宽度至少是代码模块宽度的十倍。条形码由初始空白区域、起始符、编码数据、结束符号和最后空白区域构成。有些符号可能还有信息分离符合校验位等编码信息。
条码上的符号可以由一个叫做中间分隔符的中性区域分隔开,分隔符不是不是条码代码的一部分。条码上的符号也可以是连续的中间没有分隔符,条码上的所有空间都是编码的一部分。
39码创建于1974年,大约在1982年由国防部(LOGMARS)通过,主要用于服务管理局(GSA)和美国汽车业。它最初被设计使用瓦楞纸板来打印。
USS-39码或39码,如图1所示,是一个有全套字母数字字符的条码符,相同的开始字符与结束字符,七个特殊字符。其名称“39”来源于代码结构,3三宽元素,一共由9个元素组成,这9个元素包括5个条和4个空。窄条和宽条之间的比例可以由1/2或1/3模块来表示。条和空是相互穿插的,并且每一个符号都是一斜线来开始和结束的。在一个完整的条码集合中,条码通过中间分隔符来分隔开。
图1 39码全套字母数字字符
25码1068年被开发,并随后在1972年被命名为“交叉25码”。它常用与产品的包装,以便于产品的存储和流通。
USS-I 2/5编码规范中规定,符号是能够仅代表该组数字的符号,并使用一个特殊符号来表示起始字符另一个特殊符号来表示终止字符。
“交叉25码”这个名字是从其对字符的编码规则中得来的。在一个符号中,两个字符表示在一起,条代表第一个字符而空代表第二个。每个字符由三个宽单元两个窄单元(共5个基本单元)构成,这5个基本单元可以是条也可以是空。宽单元和窄单元之间的比例类似于39码,可以是1:2个模块宽度也可以是1:3个模块宽度.
“交叉25码”的特性使得它能够代表一组信息,当它具有奇数个数字字符时,通常在条码的左侧加上一个0。每个字符的条和空的位置不是固定的,因此每对信息都有唯一的表示。“交错25码”的中间没有分隔符,也就是说条码中的每个元素都代表了编码信息。如果一个二进制码使用1:2的模型比例来进行提取,起始字符以及终止字符将始终具有相同的表示,分别使用1010和1101。这种码制由14个二进制宽度,并且第一个数字由“1”表示,第二个数字由“0”表示。
3.软件开发
一个典型的计算机视觉软件能够获取,处理和解释的图像。无论是有个人还是由系统自动化来进行,计算机视觉软件要能够起到帮助决策的效果。根据一般使用的图像处理系统的概念,本文提出的系统采用了一个摄像机、一个AD转换器以及一个专用的条形码解码软件。
对于应用程序开发,选择了基于Eclipse平台上的Java语言被,并选择了基于Eclipse平台的IDE(integrated development environment,集成开发环境)。在开源开发环境当中,Eclipse具有很多优点,其最最大的优点是Eclipse为全世界的开发者提供了一个巨大的开发工具集合,并且Eclipses是一个快速进步发展的平台。该平台的目的是在整个软件生命周期中提供编译、发布和管理系统的手段。
除了为多任务处理提供原生的支持,Java语言还有一个巨大的特点,它非常适合用于开发分布式应用的程序,这点与它的平台特性无关Java拥有这种独立性是因为Java的编译器不会生成特定于与平台的说明,但中间代码被称作二进制码,可以理解为一个在物理上并不存在的虚拟处理器的语言机器。在JVM(Java虚拟机)中,它是一个模拟处理器:编译的Java代码可以由一个二进制码解释器来执行。JVM将负责字节码到本机机器指令的翻译。JVM的指令集小而紧凑,有时需要牺牲语言的表现来确保这一指令集的精简。
为了便于从摄像机采集图像,选择使用DSJ(DirectShow Java)安装包。所谓DSJ,是一个允许Java访问Microsoft Windows的图像组件的底层库。这是一套可用于任何Java开发的工具和资源,能够方便的将多媒体功能添加的到他们的应用程序。
软件的开发使用了DSFFiltergraph类来采集条码图像以及进行后续的解码过程。采集到条码图像后下一步是将图像转换成二值化图像,使用阀值分割法是图像只含有黑色或白色像素。二值化的图像实际上是一个只含有元素0和1的二维矩阵,0和1分别代表黑白色调。在这种格式的图像下,条形码的识别被简化。
在图2中,可以看到解码的初步步骤。因为不同的条码分析方法之间差异很大,所以字符的编码模式必须被明确的识别出来并随着二进制图像一起输入软件中。
开始
条码图案的二值化图像
位向量
在图像上选择像素行
解码过程
反转位向量
是否反转量
能否码制
否
是
是否有像素行未被分析
是
否
结束
处理的第一步是分析图像,并合理设置线扫描的策略以使信息处理更加稳定更加快速,也使解码消耗的时间更少。该过程从图像的水平中心线开始,在没有搜索到条码的情况,移动到下一行进行分析或移动到距中心线相同距离的下一行来进行分析。因此图像会被持续扫描,直到找到条码区域或整个图像区域已经全部分析完。
每个所选的二维线图像中的数值会被传递到一个一维数组中。如果该过程失败则会尝试执行下一步以避免显示颠倒的代码
解码过程开始于数据从条形码符号到存储器的加载。在条形码符号加载的同时通过线扫描的方法来寻找起始字符。如果没有找到,下一个符号会被加载为新的起始字符并执行搜索操作。程序会从找到开始字符的地方开始扫描条码的编码信息直到发现终止字符。
图像的识别是通过一个处理位矩阵的函数(见程序清单1)来完成的,积累序列中的0和1的数目并将其存储在另一个数组中,0或1的宽度代表条或空的宽度间隔。而字符就是按照这种条和空的间隔宽度来完成解码的。使用这种方式能够将窄元素(条或空)与宽元素区别开。下一步处理过程是把从图片中检索的宽度信息与符号表中的条码标记机进行比较来解码字符。
程序清单1
/ * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*@param row = vector of pixels
*@param start = Nwmber of columns to ignor
*@param counter = vector store the sequence bits(bar or spaces)
*@throws Not Found Exception if the code is not found
* * * * * * * * * * * * * * * * * * * * * * * * * * * */
protected static void recordPattern( BitArray row, int start, int[] counters) throws NotFoundException{
int numCounters = counters.length;
for (int i = 0; i lt; numCounters; i ) {
counters[i] = 0;
}
int end = row.getSize();
if (start gt;= end) {
throw NotFoundException.getNotFoundInstance();
}
boolean isWhite = !row.get(start);
int counte
剩余内容已隐藏,支付完成后下载完整资料
资料编号:[151091],资料为PDF文档或Word文档,PDF文档可免费转换为Word
以上是毕业论文外文翻译,课题毕业论文、任务书、文献综述、开题报告、程序设计、图纸设计等资料可联系客服协助查找。