专栏首页python爬虫日记有关python下二维码识别用法及识别率对比分析

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

以上……

本文参与 腾讯云自媒体分享计划 ,欢迎热爱写作的你一起参与!
本文分享自作者个人站点/博客:http://www.cnblogs.com/zhongtang/复制
如有侵权,请联系 cloudcommunity@tencent.com 删除。
登录 后参与评论
0 条评论

相关文章

  • 难得干货,揭秘支付宝的2维码扫码技术优化实践之路

    本文引用自“蚂蚁金服科技”公众号,原文由支付宝技术团队原创分享。 本次收录时有改动。

    JackJiang
  • 二维码扫码技术优化方案

    在过去的 2017 年,支付宝的线下场景不断扩大,收钱码、口碑、共享单车、充电宝、停车缴费等产品让我们的生活越来越便利。二维码因为成本低、兼容性好成为了线上线上...

    ios-lan
  • 启动耗时可以这样测~

    启动耗时作为App一项核心性能指标,腾讯地图现在是基本上每个版本都会进行数据的收集。纵向的对比(与自己)之前我们都依赖于开发埋点,横向的对比(与竞品)就是人工拿...

    腾讯移动品质中心TMQ
  • 【AI专栏】识别类评测之数据篇

    区别于传统测试的重路径,识别类评测更重数据。识别类的输入不被限制在软件可控范围内,而是包罗万象各种可能。不同的输入数据组合,得出来的评测结论也会截然不同。手机Q...

    腾讯移动品质中心TMQ
  • 视觉搜索是移动搜索的未来?

    罗超为虎嗅网、钛媒体、TECH2IPO、DONEWS、爱科技和新浪科技撰稿。 愚人节当天发布消息很容易会让人产生联想。比如苹果的道歉,再比关于百度的两则消息:一...

    罗超频道
  • 爸爸去哪儿玩转黑科技:快来测测自己和老爸有多像?

    Neinei 和 Max 两姐弟颜值完胜吴尊!96.72%相似度!Jasper 和陈小春难道真是一个模子刻出来的?

    腾讯AI加速器
  • 微信一年扫出多少个二维码?

    图像作为一种特殊的语言形式,它克服了音声语言的转瞬即逝性,把信息长久保存下来,传播不再单纯依赖人类记忆力。 二维码通过图形记录着一组二进制数据,成为设备之间交...

    腾讯大讲堂
  • 解构首个城市级公共服务平台,依图凭什么?

    2020年,基于福州市“e 福州”平台架构及资源基础,福州市建立起城市级人脸识别公共服务平台,在此平台上建设“地铁刷脸通行”应用场景,及其他五个拓展试点应用场景...

    AI掘金志
  • 测试从0到1OCR初探培训(九)

    又来到了测试网络会议的第九期培训,本期的主讲人皮卡丘,培训的是关于OCR-tesseract 使用,话不多说详情如下:

    厦门-安仔
  • 高阶爬虫实战:破解极验滑动验证码

    今天给大家带来的是极验验证码的selenium破解之法,是不是有点小激动呢,小伙伴们等不及了,让我们赶紧直入主题吧。

    Python中文社区
  • 极验验证码破解之selenium

    这一篇写完很久了,因为识别率一直很低,没办法拿出来见大家,所以一直隐藏着,今天终于可以拿出来见见阳光了。

    星星在线
  • 验证码识别最佳方案,你不来试试?

    验证码分析:图片上有折线,验证码有数字,有英文字母大小写,分类的时候需要更多的样本,验证码的字母是彩色的,图片上有雪花等噪点,因此识别改验证码难度较大。

    flowerdrop
  • 用 Python 生成有“灵魂”的二维码

    这是 HelloGitHub 推出的《讲解开源项目》[1]系列,今天给大家推荐一个 Python 开源生成二维码的项目——qrcode

    HelloGitHub
  • 10行python代码做出哪些酷炫的事情?

    Python凭借其简洁的代码,赢得了许多开发者的喜爱。因此也就促使了更多开发者用Python开发新的模块,从而形成良性循环,Python可以凭借更加简短的代码实...

    Python研究者
  • 图像中二维码的检测和定位

    所谓开操作是指先腐蚀后膨胀的操作。在之前的文章二值图像分析:案例实战(文本分离+硬币计数)曾经介绍过开操作的用途。

    fengzhizi715
  • 国家级人工智能基金筹划进场,各省“跑马圈地”悄然开启

    量子位(QbitAI) | 牧北 发自 Tonlifornia ? 声势日隆,连全国两会都在热议人工智能。 李彦宏委员,三个提案全部与人工智能有关。雷军代表,也...

    量子位
  • DIY自动化测试【智能音箱】

        笔者从事智能音箱系统测试,这是一款基于android系统的智能语音助手产品。基本功能特性和测试方法都已稳定,目前多产品快速迭代,涉及的场景较多且数据量大...

    Apan

扫码关注腾讯云开发者

领取腾讯云代金券