利用python实现对GS1 您所在的位置:网站首页 GS1-128条码符号检测参数 利用python实现对GS1

利用python实现对GS1

2024-07-02 13:14| 来源: 网络整理| 查看: 265

条形码课程实验

任务需求:根据所学的知识,设计一个针对GS1-128条码的计算机自动识别软件系统技术方案,并编程实现之。 功能要求: 1:可自动识别SSCC条码; 2:可自动识别包含表6-88(P183)1的Al标识符; 3:可自动识别含有401,402,403,410,413,420,421,310n,330n等Al标识符 4:可自动识别具有链接功能GS-128条码 5:可双向自动识别GS1-128条码 6:具有友善的人机接口,能读取印制有GS1-128条码的图像文件(jmp,or JPEG任选一种即可,可不必考虑图像的旋转)识读出其对应代码在屏幕上显示出来。 7:每次只在水平方向上测试一个符合GS1-128条码长度尺寸及字符数量要求的条码;

在做这个实验设计的时候,我还没有了解到pyQt,所以是队员使用tkinter编写的界面,不过本次实验也确实是我学习pyQt的契机,为我打开了一扇简易图形化程序设计的大门,也让我更加深入地体会了Python的美妙。

考虑到需要图像识别等等操作,为了简便,我和组员选择了相对较为简单的Python语言,不再多言,直接进入正题。

提取图像信息

我们应该知道条形码的条空排列记载了信息,就如同英文字幕的排列构成不同的单词,不够条形码的规则更严格,要识别条形码,就必须要得到条形码的条空排列,条空宽度,那么如何从一张条形码图像中得到我们需要的条空组合的信息呢? 在这里插入图片描述 第一感觉是图像识别,但是此前我们完全没有类似的开发经验,所幸,我们在简书上找到了一篇译文《怎样用Python识别条形码?[译]》2,里面也对条形码的编码规则作了一个大致介绍,我们采用了上面的方式获取图像中的信息。

大体思想就是:使用python的crop截图操作,从图片中间截取高度为1像素,宽度等于原图的图,这个图等同于一条线,转化成灰度图,再使用np.asarray()得到每个像素的颜色值,0为黑色,255为白色,为了方便条为1,白为0,我们对黑白进行倒转。

img = Image.open(image_path) #载入图片 width, height = img.size #获取图片宽高 basewidth = 3*width #拉伸三倍宽度以使得数据图更直观,对解码没影响 img = img.resize((basewidth, height), Image.ANTIALIAS) #设置图片宽高 hor_line_bw = img.crop((0, int(height/2), basewidth, int(height/2) + 1)).convert('L') #从正中间切割一条像素宽度为1的线 hor_data = np.asarray(hor_line_bw, dtype="int32")[0] #获取线的像素颜色值,黑色为0,白色为255 hor_data = 255 - hor_data #倒转数据使得大数代表(黑)条 avg = np.average(hor_data) #求平均值作为分界线

到这一步,可以将获得的像素值进行绘图,看看情况

plt.plot(hor_data) plt.show()

此为绘制手机拍书上的条形码得到的数据图,虽然十分不整齐,但是依然可以识别出正确数据,证明采用平均值作为判断条空的依据是很合理的 在这里插入图片描述 此为条形码生成网站生成的标准条形码图 在这里插入图片描述

求取单位宽度

得到条码图像信息之后,就要开始对其解码,GS1-128条码除了终止符,其它的都由11个单位条空单元组成,例如数字“01”,就可以被编码成“11001101100”,可是不同图像有不同的大小,随之条空的宽度也会不同,那么我们如何知道一个条或空是几个单位构成的呢?一个条到底是“11”,还是“111”?

所幸虽然绝对宽度在变化,但是一个正确的条码,宽度比例应当是不变的,所以我们要通过一些方式,算出每一张图片中一个单位的宽度,结合GS1-128条码的起始符是“1101”,于是就有了如下方法

pos1, pos2 = -1, -1 #初始化 bits = "" for p in range(basewidth - 2): if hor_data[p] avg: #如果从空到条 bits += "1" if pos1 == -1: #如果还没有对pos1赋值,也就是还没有遇到过条 pos1 = p #记录此时p的指向,指向第一个条的前一个位置 if bits == "101": #如果已经遍历完了起始符“1101” pos2 = p #记录此时p的指向,指向“1101”中的“0” break if hor_data[p] > avg and hor_data[p + 1] avg and hor_data[p + 1]


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有