Pythonzxing库解析(条形码⼆维码识别)
各种扫码软件
最近要做个⼆维码识别的项⽬,查到⼆维码识别有好多开源的不开源的软件
Zbar
⾸先试了⼀下Zbar,python加载ZBar时各种报错。可能的原因是zbar的dll⽂件是32位的,⽽我系统是64位的,所以运⾏不了。只能⾃⼰拿源码编译⼀个64位的出来,对于我这种伸⼿党来说⾃⼰编译源码是难以接受的,所以就放弃了。后来看到⽂章说Zbar不能识别倾斜的条形码,⽽且也不能定位条形码区域。
Zxing
zbar不可⾏,就试⼀下zxing吧。很容易的到了zxing在github上的页⾯。
然后发现zxing还有python版本:
把zxing⽂件夹还有其他⼏个⽂件都下载下来,下⾯开始折腾这个简陋的包。
建⽴Python Zxing项⽬
在Eclipse⾥新建⼀个PyDev项⽬,把zxing⽂件夹拷贝进去。
由于包含__init__.py这个⽂件,⽂件夹被⾃动识别为⼀个包。
tests.py是⼀个调⽤zxing识别条形码的例程。主函数中调⽤了⼀个test_codereader()函数来识别当前⽬录下⼀张图⽚ sample.png 中的条形码。
⽽test_codereader()则调⽤了这个为python开发的zxing包中decode()函数
zx = BarCodeReader()python新建项目教程
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)municate()
上⾯这句就是调⽤jar包的核⼼代码,cmd是发给jar包的命令。cmd的类型是list,每个元素是⼀个参数,最终输⼊给jar的命令形式如下。['java', '-cp', '.;javase.jar;core.jar;jcommander-1.48.jar', 'ing.client.j2se.CommandLineRunner', 'sample.png']
subprocess的使⽤⽅法⽹上有好多教程,这⾥主要的问题出在了调⽤jar包的命令本⾝。
出现的问题及解决⽅法
既然是例程,拿到⼿当然直接运⾏,却卡在了subprocess.Popen()这⾥,报的错误是⽆法加载java主类。
1、错误: 不到或⽆法加载主类 ing.client.j2se.CommandLineRunnercmd
于是把cmd命令输出了⼀下,这句命令是 java –cp 包路径/jar报名.jar java类名。
⾸先发现的问题是我的⽬录⾥没有程序⾥指定的这两个jar包(javase.jar;core.jar),⽽且路径也不对。于是从⽹上搜到这两个包的地址下载下来(当然也可以下载zxing的源码⼿动编译)。
下载完jar包,把名字改为core.jar和javase.jar(为了跟代码配合去掉了后⾯⼀串数字),拷贝到刚才项⽬的中的zxing⽂件夹中即可。
注意到原版程序中还给jar包加了⽬录 libs = ["javase/javase.jar", "core/core.jar"]
我们需要把这句改成libs = ["javase.jar", "core.jar"],就是这么简单粗暴。
再试⼀下,还是不⾏,输出的cmd为:
['java', '-cp', '../javase.jar;../core.jar', 'ing.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
le.zxing.client.j2se.CommandLineRunner.main(CommandLineRunner.java:52)
Caused by: java.lang.ClassNotFoundException: com.beust.jcommander.JCommander
at java.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包⾥⾯。需要单独下载并放到项⽬⽬录下。
把jar包放到zxing⽂件⾥,并在lib中添加这个包,即:
libs = ["javase.jar", "core.jar","jcommander-1.48.jar"]
现在的cmd命令变成了:
['java', '-cp', 'javase.jar;core.jar;jcommander-1.48.jar', 'ing.client.j2se.CommandLineRunner', 'sample.png']
程序运⾏成功,但是条形码的信息并没有输出,我们可以在调试的时候⼿动输出⼀下。返回的信息存储在file_results中,输出⼀下即可。可以看出这个⼆维码对应的是⼀个⽹址,⼤家可以⽤⼿机的扫⼀扫验证⼀下对不对。
条形码也可以
了个条形码的图⽚,放到⽬录下试了试,也可以识别。
本⽂源码
本⽂项⽬的源码(包含那⼏个jar⽂件)已上传到CSDN:
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论