A海时时彩开奖结果 www.dtqzer.com.cn 最近項目中用到二維碼圖片識別,在python下二維碼識別,目前主要有三個??椋簔bar 、zbarlight、zxing。
1、三個??櫚撓梅ǎ?/h2>
#-*-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、使用對比
#-*-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
1、zbar和zbarlight內核一致,都是基于zbar的dll編譯加載的。
2、zbarlight使用比zbar更簡單,不過是在zbar的基礎又做了一點點封裝而已。
3、zxing是基于java的zxing核心的python分支,其原理是調用javaw 加載zxing的core.jar包,再獲取輸出結果。
zxing的調試是一個大坑,網上的資料都存在這樣那樣的信息過時問題,加上zxing對java的依賴問題更多,這篇博客 //www.cnblogs.com/oucsheep/p/6269813.html 相對來說比較清晰,但是估計初學者看起來會比較累。
3、總結:
1、項目的圖片來源于是紙質文件的掃描件(qrcode),實際情況相對復雜,存在打印偏移,與其他文字重疊、圖片變形、色帶缺墨導致圖片殘缺等多種可能性。雖然經過一系列的圖片處理,但目前來看三個包在容錯性都不算太好。
2、但是,但是…… 微信中的“掃一掃”,卻可以做到正常識別,應該是微信的二維碼識別是有自己的獨到算法,遺憾微信沒有開放接口,也沒有查到相關資料。
3、支付寶的"掃一掃",識別率略次于微信,但是也比開源的幾個包要強的多。
4、網上有一些付費api,識別率也一般,懷疑也是基于zxing和zbar的二次封裝。
5、三流無名廠家的二維碼掃描頭硬件,直接掃描該紙質文件,識別率基本可以做到90%以上,當然這不排除是掃描轉換時產生的信息丟失這個重要因素。
綜上,以識別能力排序,硬件>微信>支付寶>zxing>zbarlight(zbar)。
