各种扫码软件

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

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版本:

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

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

建立Python Zxing项目

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

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

tests.py是一个调用zxing识别条形码的例程。主函数中调用了一个test_codereader()函数来识别当前目录下一张图片 sample.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文件夹中即可。

注意到原版程序中还给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"]

现在的cmd命令变成了:

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

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


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

条形码也可以

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

本文源码

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

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

Python zxing 库解析(条形码二维码识别)的更多相关文章

  1. Opencv+Zbar二维码识别(标准条形码/二维码识别)

    使用Opencv+Zbar组合可以很容易的识别图片中的二维码,特别是标准的二维码,这里标准指的是二维码成像清晰,图片中二维码的空间占比在40%~100%之间,这样标准的图片,Zbar识别起来很容易,不 ...

  2. 使用Python的库qrcode生成二维码

    现在有很多二维码的生成工具,在线的,或者安装的软件,都可以进行生成二维码.今天我用Python的qrcode库生成二维码.需要预先安装  Image 库 安装 用pip安装 # pip install ...

  3. Android二维码识别 开源项目ZXing的编译

    Android二维码识别 开源项目ZXing的编译 Android端的条形码/二维码识别功能 因为手机端的输入不是很方便,所以条形码/二维码的扫描是一种很有效的解决手段. 比较流行的手机应用中,常用的 ...

  4. Java 条形码 二维码 的生成与解析

    Barcode简介 Barcode是由一组按一定编码规则排列的条,空符号,用以表示一定的字符,数字及符号组成的,一种机器可读的数据表示方式. Barcode的形式多种多样,按照它们的外观分类: Lin ...

  5. 实例源码--ZXing识别条形码和二维码识别源码

      下载源码 技术要点: 1.ZXing库的 使用 2.识别条形码和二 维码 3.自定义视图 4.源码带有非常详 细的中文注释 ...... 详细介绍: 1.ZXing库 ZXing是个很经典的条码/ ...

  6. Java条形码/二维码生成和解析

    注意-本类依赖jar包文件:core.jar和zxing-javase.jar 下载jar文件,到本博客文件栏目下载. import com.google.zxing.BarcodeFormat; i ...

  7. 在Android上使用ZXing识别条形码/二维码

    越来越多的手机具备自动对焦的拍摄功能,这也意味着这些手机可以具备条码扫描的功能.......手机具备条码扫描的功能,可以优化购物流程,快速存储电子名片(二维码)等. 本文使用ZXing 1.6实现条码 ...

  8. ZBar 是款桌面电脑用条形码/二维码扫描工具

    ZBar 是款桌面电脑用条形码/二维码扫描工具 windows平台python 2.7环境编译安装zbar   最近一个项目需要识别二维码,找来找去找到了zbar和zxing,中间越过无数坑,总算基本 ...

  9. java生成二维码,读取(解析)二维码图片

    二维码分为好多种,我们最常用的是qrcode类型的二维码,以下有三种生成方式以及解析方式: 附所需jar包或者js地址 第一种:依赖qrcode.jar import java.awt.Color; ...

随机推荐

  1. base64自定义编码表 php版本

    在一次接口对接中,要用到base64自定义编码表来进行编码和解码,从网上搜索了一下,讲原理的比较多也比较透彻,提供的编码的例子但是没有解码的,以下是自己实现的一个base64自定义字典解码的例子,比较 ...

  2. 提高MySQL数据库查询效率的几个技巧(转载)

    [size=5][color=Red]提高MySQL数据库查询效率的几个技巧(转)[/color][/size]      MySQL由于它本身的小巧和操作的高效, 在数据库应用中越来越多的被采用.我 ...

  3. 编程修养-C语言篇(二)

    1.版权和版本——————— 好的程序员会给自己的每个函数,每个文件,都注上版权和版本.  对于C/C++的文件,文件头应该有类似这样的注释: /*************************** ...

  4. ListView中分割线的设置

    1.在布局文件中ListView元素中通过属性设置 android:divider="#fffff" 分割线颜色 android:dividerHeight="1px&q ...

  5. Unix/Linux环境C编程入门教程(38) shell命令进阶演示

     1.w命令 该命令也可以查看登录当前系统的用户信息.与who命令相比,w命令的功能更强大,它不但可以显示当前有哪些用户登录到系统,还可以显示这些用户正在进行的操作,并给出更加详细和科学的统计数据 ...

  6. 【转】Android虚拟平台的编译和整合

    原文网址:http://blog.csdn.net/rickleaf/article/details/6369065 概要 Android从2008年开始到本文写的2011年,短短三年的时间里成为手机 ...

  7. UESTC_摩天轮 2015 UESTC Training for Dynamic Programming<Problem K>

    K - 摩天轮 Time Limit: 10000/4000MS (Java/Others)     Memory Limit: 262143/262143KB (Java/Others) Submi ...

  8. HDU3994(Folyd + 期望概率)

    Mission Impossible Time Limit: 30000/10000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Oth ...

  9. SoftLayer®凭借Flex Images™消融物理与虚拟服务器之间的界线

    网摘文档留存,日后有用; 达拉斯--(美国商业资讯)--随着SoftLayer Flex Images的推出,物理与虚拟IT资源之间的界线正在变得模糊.Flex Images让用户能够捕捉.复制并存储 ...

  10. Unity 关于属性的get/set

    学习Unity的可能多数是C#转过来的, 一进来的时候你会发现Unity编写代码,在一些视频或文章中.基本都没有用过get/set使用, 多数是public string name;这样写的公开字段, ...