zbar识别条形码和QR二维码

原文链接:http://www.juzicode.com/archives/1399

前几天有位朋友联系桔子哥,他们的发货系统故障导致货物包装上的条码都没有录入到系统中跟踪,积累了上千张“打码”的照片。后期尝试人工读取照片中的条码,也试图在一些网站上传图片获取条码信息,但是操作繁琐工作量实在太大几近崩溃,想看看桔子哥是否有好的方法。桔子哥让朋友先发来几十张图片看了看,这些图片中的条码都还拍的比较清晰,而且都是些条形码,而zbar正好是一种可以用来识别条形码和QR二维码的图像库,桔子哥当即表示可以马上安排。

我们可以先在sourceforge下载windows版本的安装包感受下zbar的威力:

下载后运行exe文件进行安装,在安装目录下的bin文件夹中有2个exe文件,zbarimg.exe是解析本地图片的可执行文件,zbarcam.exe是通过摄像头抓取图像解析的可执行文件:

解析本地图片文件的方法运行“zbarimg.exe 文件名称”,从下面的几个例子可以看到条形码在图片中水平、竖立、反转都能得到正确的解析结果。

从摄像头解析图片的方法是直接运行zbarcam.exe文件 ,将要识别的条形码或者二维码放置在摄像头前,就能得到解析结果:

前面介绍zbar的使用方法是基于运行可执行文件实现的,这么好的工具应该有Python版本吧,没错,接下来我们来聊聊zbar的Python版本: pyzbar,注意名称为“zbar”的库目前只能在python2上使用,而“pyzbar”则能用在python2和python3上。

因为pyzbar自身并不支持打开图片以及做一些图片的预处理,所以需要借助pillow或者opencv等第三方库打开图片文件,所以需要先用pip安装pillow或者opencv等库文件。下面的例子中使用pillow进行图片的预处理。

准备工作完成后就是安装pyzbar:

pip install pyzbar

接下来从pyzbar导入decode,从PIL导入Image:

from pyzbar.pyzbar import decode
from PIL import Image

利用Image.open()打开图片文件,假设要解析的图片文件和编写的py文件在同一个目录,文件名称可以任意,这里为qr1.png,利用open方法打开图片同时会生成一个img实例:

#打开图片
img = Image.open('qr1.png')

然后用decode()解析open方法生成的图片实例img:

#解析图片
res = decode(img)

从res中提取解析值,因为一个图片中可能有多个解析值,所以res是一个list。遍历解析值list,每个解析值的type属性是解析出来的条形码或二维码的类型,data属性则是解析的结果:

#打印结果
print(res)  
for re in res:
    print('data:',re.data)  
    print('type:',re.type) 

从下面解析的例子来看,只要图片足够清晰,解析的效果还是非常好的:

回到朋友的需求,将要识别的图片全部保存到todo文件夹中,然后遍历该文件夹下的所有文件,如果识别成功将这些图片复制到ok文件夹下,如果识别失败则复制到ng文件夹下留着人工判断,同时生成一个报表文件,包含了文件名称和识别结果的一一对应关系,做出来的效果就是这样的:

附上完整实现源码:https://github.com/juzicode00/dip/tree/master/pyzbar

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注