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

来源:http://www.cnblogs.com/zhongtang/archive/2017/07/11/7148375.html
-Advertisement-
Play Games

最近項目中用到二維碼圖片識別,在python下二維碼識別,目前主要有三個模塊:zbar 、zbarlight、zxing。 1、三個模塊的用法: 2、使用對比 1、zbar和zbarlight內核一致,都是基於zbar的dll編譯載入的。 2、zbarlight使用比zbar更簡單,不過是在zbar ...


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

以上……

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 把編譯安裝的httpd 實現服務腳本,通過service和chkconfig 進行管理 1 編譯安裝httpd 把httpd編譯安裝在/app/httpd/目錄下。 2 在/etc/rc.d/init.d/目錄下新建一個文件httpd 這個文件的目的在於讓service 命令可以管理編譯安裝的htt ...
  • 概述Docker已經熱了有一兩年了,而且我相信這不是一個曇花一現的技術,而是一個將深遠影響我們日後開發和部署、運營應用系統的一種創新(很多人將其作為devops的一種非常重要的基石)。學習docker的最好方式,莫過於它的官方文檔 ,有興趣 的同學請參考 https://www.docker.com... ...
  • 上一篇博客我講解了TagHelper的基本用法和自定義標簽的生成,那麼我就趁熱打鐵,和大家分享一下TagHelper的高級用法~~,大家也可以在我的博客下隨意留言。 對於初步接觸asp.net core的騷年可以看看我對TagHelper的瞭解和看法: 《asp.net core新特性(1):Tag ...
  • 在這篇文章中,我將介紹在ASP.NET Core MVC中 IControllerActivator 是如何創建控制器的,以及通過依賴註入創建控制器存在的差異。 ...
  • 這是很簡單。。 HTML <div> <input type="file" id="myfile"> <input type="button" value="上傳" onclick="HeadPortraitPicture()"> </div> JS代碼 function HeadPortraitP ...
  • 沒時間介紹了,廢話不說先上車 以下所有扯淡都是建立在.NETCore2.0環境已經搭建好 右鍵解決方案>新建項目> 選擇Web>ASP.NETCoreWeb應用程式(.NET Core) 選擇Web應用程式,暫時不選擇啟用Docker,身份驗證選擇個人用戶賬戶(會自動生成一系列和用戶認證的代碼) 隨 ...
  • JdbcTemolate類的介紹 JdbcTemplate是Spring JDBC的核心類,封裝了常見的JDBC的用法,同時儘量避免常見的錯誤。該類簡化JDBC的操作,我們只需要書寫提供SQL的代碼和如何返回的結果的代碼。JdbcTemplate可以執行查詢、更新等操作、初始化對ResultSets ...
  • argparse 是一個用於解析 命令行選項,參數以及 子命令的庫 源碼來自 Lib/argparse.py 主要功能: 1、使得用戶編寫命令行變得簡單 2、針對程式需要的參數,argparse知道如何從sys.argv中解析這些參數 3、針對用戶給程式無效的參數,argparse可以自動生成幫助u ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...