对比分析python下识别二维码用法和识别率

 最近项目中用到二维码图片识别,在python下二维码识别,目前主要有三个模块:zbar 、zbarlight、zxing。

1、三个模块的用法

#-*-coding=utf-8-*-import os import loggingimport zbar from PIL import Image import zxingimport randomimport zbarlightlogger=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.dataelse:        logger.error(u'识别zxing二维码出错:%s' %(filename))        img.save('%s-zxing.jpg' %filename)  return data    if __name__ == '__main__':     filename =r'D:python25328.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的依赖问题更多,这篇博客  相对来说比较清晰,但是估计初学者看起来会比较累。

立即学习“Python免费学习笔记(深入)”;

 

 

3、总结:

1、项目的图片来源于是纸质文件的扫描件(qrcode),实际情况相对复杂,存在打印偏移,与其他文字重叠、图片变形、色带缺墨导致图片残缺等多种可能性。虽然经过一系列的图片处理,但目前来看三个包在容错性都不算太好。

2、但是,但是…… 微信中的“扫一扫”,却可以做到正常识别,应该是微信的二维码识别是有自己的独到算法,遗憾微信没有开放接口,也没有查到相关资料。

3、支付宝的”扫一扫”,识别率略次于微信,但是也比开源的几个包要强的多。

4、网上有一些付费api,识别率也一般,怀疑也是基于zxing和zbar的二次封装。

5、三流无名厂家的二维码扫描头硬件,直接扫描该纸质文件,识别率基本可以做到90%以上,当然这不排除是扫描转换时产生的信息丢失这个重要因素。

综上,以识别能力排序,硬件>微信>支付宝>zxing>zbarlight(zbar)。

软件算法以微信最高,但比起硬件还是有差距,期待高手破解或者剥离微信的算法,也欢迎商用api开发者进行交流(可以付费),联系QQ 16906913 ,谢谢。

以上……

 

以上就是对比分析python下识别二维码用法和识别率的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2268237.html

(0)
上一篇 2025年2月27日 10:37:39
下一篇 2025年2月19日 07:45:18

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • 电脑编程语言有哪些类型

    根据用途、功能和语法结构,电脑编程语言可分为几类:面向过程语言:强调数据结构和控制流,如 C、C++、Java、Python。面向对象语言:组织代码为对象,如 C++、Java、Python、C#。函数式语言:专注于数学函数应用,如 Has…

    2025年2月27日
    200
  • Python环境下安装MySQLdb模块

    ———————-【针对Windows下python 的MySQLdb模块安装】—————&#82…

    编程技术 2025年2月27日
    200
  • 电脑用的编程语言有哪些

    计算机编程语言是指导计算机执行任务的语言,允许将人类指令转换为机器代码。流行的编程语言包括:低级语言:汇编语言机器语言高级语言:PythonJavaC++C#JavaScriptSQL特定领域的语言: 电脑使用的编程语言 计算机编程语言是用…

    2025年2月27日
    200
  • Python–AES加密与解密方法指导

    起源: 视频下载,解析到一个网站时,发现其视频id是用AES加密过的,用的是这个库。解密很简单的一句js代码: t.video = CryptoJS.AES.decrypt(t.video, secret).toString(CryptoJ…

    编程技术 2025年2月27日
    200
  • 电脑编程主流语言有哪些

    目前最流行的电脑编程语言:1. Python(数据科学、机器学习);2. Java(企业级应用程序);3. C++(高性能应用程序);4. C#(Windows 应用程序);5. JavaScript(动态 Web 页面);6. SQL(数…

    2025年2月27日
    200
  • Python基础入门–函数

    8.函数 函数是带名字的代码块,用于完成具体的工作。def函数定义,指出函数名。定义函数的时候,我们把参数的名字和位置确定下来,函数的接口定义就完成了。对于函数的调用者来说,只需要知道如何传递正确的参数,以及函数将返回什么样的值就够了,函数…

    编程技术 2025年2月27日
    200
  • python入门教程之列表操作

    python列表操作——增 append:追加一条数据到列表的最后 name = [“Zhangsan”,”XiongDa”,”Lisi”]name.append(“wangwu”)print name输出结果:[‘Zhangsan’, ‘…

    编程技术 2025年2月27日
    200
  • [flask/python/web]学习flask web开发(Miguel著)遇到的一些问题及其解决方案

    今天解决了第11章_不显示博文表单的问题,时间太晚了,先留个坑,明天写出详细的解决方案。 同时也将前11章(当我结束本书学习时会将所有的问题一一列出并给出中文的解决方案)的常见问题给予解答。 以上就是[flask/python/web]学习…

    编程技术 2025年2月27日
    200
  • 详细讲解Python中的元类及其用法

    1、用元类验证子类 每当我们定义新类的时候,元类就会运行雅正代码,以确保这个新类符合规定的规范。python系统把子类的class语句处理完毕,就会调用元类的 __new__ 方法。元类可以通过 __new__ 方法,获取子类、孙子类的名称…

    编程技术 2025年2月27日
    200
  • Python基础学习之类的介绍

      在python中,首字母大写的名称指的是类。这个类定义中的括号是空的,因为我们要从空白创建这个类。我们编写了一个文档字符串,对这个类的功能作了描述。类中的函数称为方法。   以Student类为例,在Python中,定义类是通过clas…

    编程技术 2025年2月27日
    200

发表回复

登录后才能评论