python发票二维码条码识别_Python zxing 库解析(条形码二维码识别)

各种扫码软件

最近要做个二维码识别的项目,查到二维码识别有好多开源的不开源的软件

http://www.oschina.net/project/tag/238/

Zbar

首先试了一下Zbar,python加载ZBar时各种报错。可能的原因是zbar的dll文件是32位的,而我系统是64位的,所以运行不了。只能自己拿源码编译一个64位的出来,对于我这种伸手党来说自己编译源码是难以接受的,所以就放弃了。后来看到文章说Zbar不能识别倾斜的条形码,而且也不能定位条形码区域。

Zxing

zbar不可行,就试一下zxing吧。很容易的找到了zxing在github上的页面。

https://github.com/zxing/zxing/

然后发现zxing还有python版本:

495890-20170110162230588-69703737.png

一阵激动啊,点进去(https://github.com/oostendo/python-zxing),发现作者对这个python包的描述是:A quick and dirty wrapper for theZXing barcode library.(一个快速且简陋的zxing外壳)

495890-20170110162231744-1106553225.png

把zxing文件夹还有其他几个文件都下载下来,下面开始折腾这个简陋的包。

建立Python Zxing项目

在Eclipse里新建一个PyDev项目,把zxing文件夹拷贝进去。

495890-20170110162232806-126106756.png

由于包含__init__.py这个文件,文件夹被自动识别为一个包。

tests.py是一个调用zxing识别条形码的例程。主函数中调用了一个test_codereader()函数来识别当前目录下一张图片 sample.png 中的条形码。

495890-20170110162233713-1682369398.png

而test_codereader()则调用了这个为python开发的zxing包中decode()函数

zx = BarCodeReader()

barcode = zx.decode(testimage)

顺藤摸瓜,打开__init__.py,里面有BarCodeReader()这个类的实现代码。

Python调用jar包

在decode函数中,用subprocess包中的Popen实现了调用jar包的操作,类似于VB,VC中的管道通讯。

(stdout, stderr) = subprocess.Popen(cmd, stdout=subprocess.PIPE, universal_newlines=True).communicate()

上面这句就是调用jar包的核心代码,cmd是发给jar包的命令。cmd的类型是list,每个元素是一个参数,最终输入给jar的命令形式如下。

['java', '-cp', '.;javase.jar;core.jar;jcommander-1.48.jar', 'com.google.zxing.client.j2se.CommandLineRunner', 'sample.png']

subprocess的使用方法网上有好多教程,这里主要的问题出在了调用jar包的命令本身。

出现的问题及解决方法

既然是例程,拿到手当然直接运行,却卡在了subprocess.Popen()这里,报的错误是无法加载java主类。

1、错误: 找不到或无法加载主类 com.google.zxing.client.j2se.CommandLineRunnercmd

于是把cmd命令输出了一下,这句命令是 java –cp 包路径/jar报名.jar java类名。

首先发现的问题是我的目录里没有程序里指定的这两个jar包(javase.jar;core.jar),而且路径也不对。于是从网上搜到这两个包的地址下载下来(当然也可以下载zxing的源码手动编译)。

关于如何编译zxing的文章: http://blog.sina.com.cn/s/blog_76adb0160102uxqb.html

下载zxing的两个jar包的文章:http://blog.csdn.net/rongbo_j/article/details/47055795

“zxing的jar包我们可以从maven资源库中获取,打开maven资源库http://www.mvnrepository.com/,搜索zxing即可”

下载完jar包,把名字改为core.jar和javase.jar(为了跟代码配合去掉了后面一串数字),拷贝到刚才项目的中的zxing文件夹中即可。

495890-20170110162234588-433072561.png

注意到原版程序中还给jar包加了目录 libs = ["javase/javase.jar", "core/core.jar"]

我们需要把这句改成libs = ["javase.jar", "core.jar"],就是这么简单粗暴。

再试一下,还是不行,输出的cmd为:

['java', '-cp', '../javase.jar;../core.jar', 'com.google.zxing.client.j2se.CommandLineRunner', 'sample.png']

中jar包的路径变成了../javase.jar;../core.jar,这斜杠和点一加,目录就不对了。

于是找到给路径加斜杠的那句代码:

libraries = [self.location + "/" + l for l in self.libs]

把斜杠给删掉,改成

libraries = [ l for l in self.libs]

这样就去掉了路径中的双点和斜杠,再次运行,迎接新的问题。

2、NoClassDefFoundError: com/beust/jcommander/JCommander

具体信息如下:

Exception in thread "main" java.lang.NoClassDefFoundError: com/beust/jcommander/JCommander

at com.google.zxing.client.j2se.CommandLineRunner.main(CommandLineRunner.java:52)

Caused by: java.lang.ClassNotFoundException: com.beust.jcommander.JCommander

at java.net.URLClassLoader.findClass(Unknown Source)

at java.lang.ClassLoader.loadClass(Unknown Source)

at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)

at java.lang.ClassLoader.loadClass(Unknown Source)

... 1 more

找不到JCommander类,虽然还是有问题,但主类总算找到了。。。

查了一下,原来JCommander是一个Java的命令行解析类,并不包含在zxing的jar包里面。需要单独下载并放到项目目录下。

参考链接:http://stackoverflow.com/questions/30435688/getting-java-lang-noclassdeffounderror-com-beust-jcommander-parameterexception

链接里5楼的回复比较给力,因为给出了JCommander的下载地址:http://central.maven.org/maven2/com/beust/jcommander/1.48/jcommander-1.48.jar

把jar包放到zxing文件里,并在lib中添加这个包,即:

libs = ["javase.jar", "core.jar","jcommander-1.48.jar"]

495890-20170110162235697-820840924.png

现在的cmd命令变成了:

['java', '-cp', 'javase.jar;core.jar;jcommander-1.48.jar', 'com.google.zxing.client.j2se.CommandLineRunner', 'sample.png']

程序运行成功,但是条形码的信息并没有输出,我们可以在调试的时候手动输出一下。返回的信息存储在file_results中,输出一下即可。

495890-20170110162237088-616173040.png

可以看出这个二维码对应的是一个网址,大家可以用手机的扫一扫验证一下对不对。

条形码也可以

找了个条形码的图片,放到目录下试了试,也可以识别。

495890-20170110162238260-1941243264.png

495890-20170110162239166-402693702.png

本文源码

本文项目的源码(包含那几个jar文件)已上传到CSDN:

http://download.csdn.net/detail/sheep7777777/9733896

除了使用 ZBar ,还有其他方法可以在 Python识别二维码。以下是一些常用的方法: 1. pyzbar pyzbar 是一个 Python ,可以用于识别和解码常见的一维和二维条码。它基于 ZBar ,并提供了更易于使用的接口。 示例代码: ```python from pyzbar.pyzbar import decode from PIL import Image # 读取图像 img = Image.open('qrcode.png') # 识别二维码 results = decode(img) # 遍历识别结果 for result in results: # 打印二维码类型和内容 print("Type:", result.type, "| Content:", result.data.decode("utf-8")) ``` 2. OpenCV OpenCV 是一个计算机视觉,可以用于图像处理和分析。它可以用于检测和识别二维码。 示例代码: ```python import cv2 import numpy as np # 读取图像 img = cv2.imread('qrcode.png') # 转换为灰度图像 gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 使用 cv2.QRCodeDetector 检测二维码 detector = cv2.QRCodeDetector() data, bbox, _ = detector.detectAndDecode(gray) # 如果检测到二维码,打印内容 if bbox is not None: print("Content:", data) ``` 3. zxing zxing 是一个开源的条码二维码处理,支持多种编程语言。在 Python 中,可以使用 pyzxing 来调用 zxing。 示例代码: ```python from pyzxing import BarCodeReader # 创建 BarCodeReader 对象 reader = BarCodeReader() # 读取图像 img = open('qrcode.png', 'rb').read() # 识别二维码 data = reader.decode(img) # 如果检测到二维码,打印内容 if data: print("Content:", data) ``` 需要注意的是,不同的识别二维码时可能具有不同的准确率和速度,您可以根据自己的需求选择适合的
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值