有关python下二维码识别用法及识别率对比分析
最近项目中用到二维码图片识别,在python下二维码识别,目前主要有三个模块:zbar 、zbarlight、zxing。
1、三个模块的用法:
#-*-coding=utf-8-*-
import os
import logging
import zbar
from PIL import Image
import zxing
import random
import zbarlight logger=logging.getLogger(__name__)
if not logger.handlers :logging.basicConfig(level=logging.INFO)
DEBUG= (logging.getLevelName(logger.getEffectiveLevel())=='DEBUG') def ocr_qrcode_zbar(filename):
img=Image.open(filename)
width, height = img.size
raw = img.tobytes() scanner = zbar.ImageScanner()
scanner.parse_config('enable')
#把图像装换成数据
zarimage = zbar.Image(width, height, 'Y800', raw)
#扫描器进行扫描
scanner.scan(zarimage) data = ''
for symbol in zarimage:
# 对结果进行一些有用的处理
data += symbol.data
if data:
logger.debug(u'识别二维码:%s,内容: %s' %(filename ,data))
else:
logger.error(u'识别zbar二维码出错:%s' %(filename))
img.save('%s-zbar.jpg' %filename)
return data def ocr_qrcode_zbarlight(filename):
img=Image.open(filename) width, height = img.size
raw = img.tobytes() #把图像装换成数据
data = zbarlight.qr_code_scanner(raw, width, height) if data:
logger.debug(u'识别二维码:%s,内容: %s' %(filename ,data))
else:
logger.error(u'识别zbarlight二维码出错:%s' %(filename))
img.save('%s-zbar.jpg' %filename)
return data def ocr_qrcode_zxing(filename):
#在当前目录生成临时文件,规避java的路径问题
img= Image.open(filename)
ran= int(random.random()*100000)
img.save('%s%s.jpg' %(os.path.basename(filename).split('.')[0],ran))
zx = zxing.BarCodeReader()
data =''
zxdata = zx.decode('%s%s.jpg' %(os.path.basename(filename).split('.')[0],ran))
#删除临时文件
os.remove('%s%s.jpg' %(os.path.basename(filename).split('.')[0],ran))
if zxdata:
logger.debug(u'zxing识别二维码:%s,内容: %s' %(filename ,zxdata.data))
data = zxdata.data
else:
logger.error(u'识别zxing二维码出错:%s' %(filename))
img.save('%s-zxing.jpg' %filename)
return data if __name__ == '__main__':
filename =r'D:\python\00025328.jpg' #zbar二维码识别
ltext = ocr_qrcode_zbar(filename)
logger.info( u'[%s]Zbar二维码识别:[%s]!!!' %(filename,ltext))
print ltext #zbarlight二维码识别
ltext = ocr_qrcode_zbarlight(filename)
logger.info( u'[%s]Zxing二维码识别:[%s]!!!' %(filename,ltext))
print ltext #zxing二维码识别
ltext = ocr_qrcode_zxing(filename)
logger.info( u'[%s]Zxing二维码识别:[%s]!!!' %(filename,ltext))
print ltext
2、使用对比
1、zbar和zbarlight内核一致,都是基于zbar的dll编译加载的。
2、zbarlight使用比zbar更简单,不过是在zbar的基础又做了一点点封装而已。
3、zxing是基于java的zxing核心的python分支,其原理是调用javaw 加载zxing的core.jar包,再获取输出结果。
zxing的调试是一个大坑,网上的资料都存在这样那样的信息过时问题,加上zxing对java的依赖问题更多,这篇博客 http://www.cnblogs.com/oucsheep/p/6269813.html 相对来说比较清晰,但是估计初学者看起来会比较累。
3、总结:
1、项目的图片来源于是纸质文件的扫描件(qrcode),实际情况相对复杂,存在打印偏移,与其他文字重叠、图片变形、色带缺墨导致图片残缺等多种可能性。虽然经过一系列的图片处理,但目前来看三个包在容错性都不算太好。
2、但是,但是…… 微信中的“扫一扫”,却可以做到正常识别,应该是微信的二维码识别是有自己的独到算法,遗憾微信没有开放接口,也没有查到相关资料。
3、支付宝的"扫一扫",识别率略次于微信,但是也比开源的几个包要强的多。
4、网上有一些付费api,识别率也一般,怀疑也是基于zxing和zbar的二次封装。
5、三流无名厂家的二维码扫描头硬件,直接扫描该纸质文件,识别率基本可以做到90%以上,当然这不排除是扫描转换时产生的信息丢失这个重要因素。
综上,以识别能力排序,硬件>微信>支付宝>zxing>zbarlight(zbar)。
软件算法以微信最高,但比起硬件还是有差距,期待高手破解或者剥离微信的算法,也欢迎商用api开发者进行交流(可以付费),联系QQ 16906913 ,谢谢。
以上……
有关python下二维码识别用法及识别率对比分析的更多相关文章
- Python 实现二维码生成和识别
今天突然想给自己自己做个头像,然后还是二维码的形式,这样只要扫一扫就可以访问我的主页.然后就开始自己的苦逼之路... 其实实现二维码java,c#,C++等都可以实现:由于自己正在学python,所以 ...
- 使用 Python 生成二维码
在“一带一路”国际合作高峰论坛举行期间, 20 国青年投票选出中国的“新四大发明”:高铁.扫码支付.共享单车和网购.其中扫码支付指手机通过扫描二维码跳转到支付页面,再进行付款.这种新的支付方式,造就二 ...
- Python生成二维码脚本
简单的记录下二维码生成和解析的Python代码 依赖下面三个包: PIL(图像处理包,安装:pip install PIL) qrcode(二维码生成包,安装:pip install qrcode) ...
- 用python生成二维码
Python生成二维码,可以使用qrcode模块, github地址 我是搬运工 首先安装, 因为打算生成好再展示出来,所以用到Pillow模块 pip install qrcode pip inst ...
- Android下二维码的扫描
Android平台下 二维码的扫描一般采用: Zxing:参考地址 Zxing功能比较强大,支持条形码和二维码的扫描,用的人也比较多,但是Zxing太大,一般开发简单的app,用起来比较麻烦. 所以网 ...
- 从Scratch到Python——Python生成二维码
# Python利用pyqrcode模块生成二维码 import pyqrcode import sys number = pyqrcode.create('从Scratch到Python--Pyth ...
- 基于opencv+python的二维码识别
花了2天时间终于把二维码识别做出来了,不过效果一般,后面会应用在ROS辅助定位上,废话少说先上图: 具体过程参考了这位大神的博客:http://blog.csdn.net/qq_25491201/ar ...
- python qrcode二维码生成与识别
二维码 二维码生成 1.用法 https://github.com/lincolnloop/python-qrcode 2.使用 简单实用 import qrcode # 二维码内容 data = & ...
- python生成二维码
1.python-qrcode是个用来生成二维码图片的第三方模块,依赖于 PIL 模块和 qrcode 库. 首先,我们要安装三个模块,qrcode,image,PIL. pip install q ...
随机推荐
- oracle如何连接别人的数据库,需要在本地添加一些配置
2.oracle如何连接别人的数据库,需要在本地添加一些配置 1.找到 listener.ora 文件,打开(一般在 C 文件夹) ORCL = (DESCRIPTION = (ADDRESS = ( ...
- 以List为例浅谈C#的学习方法
前言:关于学习方法的讨论其实是个比较模糊的概念,对于List的介绍的资料其实已经很多了,但是一般是介绍List本身,我打算分享的是,以温故List为例,来获取新知识的这么一个过程.这里的新知识也不是什 ...
- 《调试九法——软硬件错误的排查之道》【PDF】下载
<调试九法--软硬件错误的排查之道>[PDF]下载链接: https://u253469.ctfile.com/fs/253469-231196352 内容简介 <调试九法:软硬件错 ...
- zTree模糊搜索,显示全部节点和高亮显示
function searchFun() { var value; if($("#code2").val()!=null && $("#code2&quo ...
- 安装eclipse时跳转到网页提示JRE Missing
可能的原因:jdk与安装的eclipse不兼容,可能64位机器安装了32位的jdk,导致64位的eclipse不能识别.
- 历史命令~/.bash_history,查看所有别名alias,命令执行顺序,命令行常用快捷键,输入输出重定向,wc统计字节单词行数
历史命令大小:/etc/profile中字段HISTSIZE=1000 历史命令保存文件:~/.bash_history history -c 清空历史命令 history -w 把历史命令写入~/. ...
- 修改文件系统属性chattr,查看文件系统属性lsattr
chattr chattr +i 文件或目录 , chattr +a 文件或目录,chattr -i 文件或目录,chattr -a 文件或目录,chattr =i 文件或目录,chattr =a 文 ...
- jemeter——badboy导入的jmx文件自带元件解析
线程组设置与解析 含义:1秒启动100个线程,每个线程循环调用20次请求 (包括FTP请求.Java请求.http请求,根据你提交的请求而定) delay thread creation until ...
- xCode8以及iOS10 的新特性
其他:ios10中 适配问题(1.系统判断方法失效:2.隐私数据的访问问题:3.UIColor 问题4.真彩色的显示5.ATS问题6.UIStatusBar问题7.UITextField8.UserN ...
- XMPP协议的基本理解
即时通讯技术简介 即时通讯技术(IM)支持用户在线实时交谈.如果要发送一条信息,用户需要打开一个小窗口,以便让用户及其朋友在其中输入信息并让交谈双方都看到交谈的内容.大多数常用的即时通讯发送程序都会提 ...