有关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 ,谢谢。

以上……

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏玉树芝兰

如何对PDF文献做可视化分析?

看了大量文献后,你的硬盘上想必存下不少PDF文件。能否充分利用它们,挖掘出你独特的领域知识地图呢?本文为你提供一种简便易行的办法。

1312
来自专栏美图数据技术团队

美图AB Test实践:Meepo系统

感谢阅读「美图数据技术团队」的第 8 篇文章,关注我们持续获取美图最新数据技术动态。

2051
来自专栏ThoughtWorks

测试矩阵

迷阵 “单元测试,集成测试,端到端测试,安全测试,性能测试,压力测试,契约测试,冒烟测试,验收测试,API测试,UI测试,兼容性测试……” 不知道你是不是像我一...

4519
来自专栏大数据挖掘DT机器学习

京东JData算法大赛-高潜用户购买意向预测(github源码)

github地址: 在公众号 datadw 里 回复 京东 即可获取。 这是一位热心的参赛者提供的一份入门程序,涵盖了数据清洗、数据(统计)分析、特征抽取、...

8335
来自专栏AI科技大本营的专栏

AI 技术讲座精选:数学不好,也可以学习人工智能(三)

【AI100 导读】学习人工智能到底要不要学好数学,这俨然已经成了一个争议话题了?之前 AI100 刊发了本系列的前两篇文章,也发表了作者子白的《放弃幻想,搞 ...

45317
来自专栏专知

【下载】Scikit-learn作者新书《Python机器学习导论》, 教程+代码手把手带你实践机器学习算法

【导读】哥伦比亚大学老师Andreas C. Müller同时也是著名机器学习Python包scikit-learn的主要贡献者 Andreas Muller ...

6735
来自专栏华章科技

近期GitHub上最热门的开源项目(附链接)

2 月份 GitHub 上最热门的开源项目又出炉了,又有哪些新的项目挤进热门榜单了呢,一起来看看。

832
来自专栏AI科技大本营的专栏

AI 技术讲座精选:5款新手也能快速构建的深度学习应用(使用Python)

前 言 深度学习从根本上改变了我们周围的一切。很多人认为必须成为深度学习的专家,才能将深度学习用到自己的应用中。然而,实际并非如此。 在我之前的文章中,我讨论了...

3457
来自专栏AI研习社

2017 十大最受欢的迎机器学习 Python 库

2017 年即将结束,又到了做年终总结的时候,本文盘点了今年最受欢迎的十个 Python 机器学习库,同时在文末选出了一些值得关注的 Python 库。如果本文...

3226
来自专栏Spark学习技巧

Kylin及数据仓库的技术概念详解

一 cube 1, Table cube数据源的hive表的定义,在build cube之前需要进行同步。 2, Data Model 这描述了一个星型...

3188

扫码关注云+社区

领取腾讯云代金券