你好,游客 登錄 注冊 搜索
背景:
閱讀新聞

有關python下二維碼識別用法及識別率對比分析

[日期:2017-07-11] 來源:  作者:朝花夕拾 [字體: ]

 最近項目中用到二維碼圖片識別,在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)。

收藏 推薦 打印 | 錄入:Cstor | 閱讀:
本文評論   查看全部評論 (0)
表情: 表情 姓名: 字數
點評:
       
評論聲明
  • 尊重網上道德,遵守中華人民共和國的各項有關法律法規
  • 承擔一切因您的行為而直接或間接導致的民事或刑事法律責任
  • 本站管理人員有權保留或刪除其管轄留言中的任意內容
  • 本站有權在網站內轉載或引用您的評論
  • 參與本評論即表明您已經閱讀并接受上述條款
棋牌app搭建教程视频 河南11选5分布走势图一定牛 乐彩合买可靠吗 吉林11选5直选遗漏 七位数体彩号码预测专家 百赢棋牌官方网站下载 北京快乐8实时开奖结果 澳洲幸运8历史开奖 极速十一选五组选 今日股票行情实时查询 安徽11选5开奖号码查询