python下以api形式調用tesseract識別圖片驗證碼,
一、背景
之前在博文中介紹在python中如何調用tesseract ocr引擎,當時主要介紹了shell模式,shell模式需要安裝tesseract程式,並且效率相對略低。
今天介紹api形式的調用方式,因為博主主要是基於windows環境進行開發,所以這裡的api調用主要是指dll調用(linux之類是.so調用)
二、tesseract dll下載網址
https://github.com/charlesw/tesseract 這個網址中包含了編譯好的exe及dll檔案,而且x86,x64兩種架構都有。
(特別說明:選擇x86還是x64版本dll,只依賴於你的python架構,而不是作業系統的架構,即便是在64位作業系統,假如你的python是32位版本,這裡也要選用x86版本dll)。
博主使用的64位Python,所以進入 tesseract/src/lib/TesseractOcr/x64/目錄,分別下載 liblept172.dll、libtesseract304.dll 兩個dll。(若是你想用shell形式調用,也可以下載tesseract.exe,與之前的博文改善的地方,就是免去安裝tesseract。)
三、語言套件 下載網址(tessdata)
注意說明裡有這一段話,You will also need to download the language data files for tesseract 3.04 from tesseract-ocr.
網址:https://github.com/tesseract-ocr/tesseract ,下載其中的tessdata目錄即可,跟dll放到同一目錄。
四、vc 2015++發行包下載
注意說明裡這一段話:
Since tesseract and leptonica binaries are compiled with Visual Studio 2015 you'll need to ensure you have the Visual Studio 2015 Runtime installed.
意思就是,這個tesseract 的dll是使用vs 2015編譯的,所以必須安裝其發行包,同樣分X64,X86兩個版本,還是依賴於你的開發環境,不依賴於作業系統。
五、安裝pyocr for python 包
用pip就可以安裝: pip install pyocr,也可以到官網下載源碼,手動安裝: https://github.com/jflesch/pyocr
最新的pyocr是0.4.1,其源碼還是基於tesseract 3.0.2 ,而前文下載的tesseract 已經是3.0.4版本了,所以需要改下pyocr源碼。 (需要說明的是pyocr包,比起以前博文提的pytesseract包要更複雜一些,同時支援shell、api 、Cuneiform 三種形式。)
修改源碼檔案 :C:\Python27\Lib\site-packages\pyocr\libtesseract\libtesseract_raw.py檔案。
如下所示: 紅色字型行,把302dll改成304dll
TESSDATA_PREFIX = os.getenv('TESSDATA_PREFIX', None)if sys.platform[:3] == "win": libnames = [ # Jflesch> Don't they have the equivalent of LD_LIBRARY_PATH on # Windows ? "../vs2010/DLL_Release/libtesseract302.dll", "libtesseract304.dll", #libtesseract302.dll ]else: libnames = [ "libtesseract.so.3", ]
六、編寫測試程式
直接放源碼 pyocr-test.py :
#coding=utf-8 '''目前的目錄必須有tessdata ,libtesseract304.dll ,liblept172.dll'''import os ,systessdir = os.getenv('TESSDATA_PREFIX', None)if tessdir is None : tessdir = os.path.split(os.path.realpath(__file__))[0] os.environ['TESSDATA_PREFIX'] = tessdirif tessdir not in os.environ['PATH']: os.environ['PATH']= tessdir+';' +os.environ['PATH'] #sys.path.append(tessdir)print os.environ['PATH']print os.environ['TESSDATA_PREFIX']from pyocr import libtesseractfrom pyocr.builders import TextBuilderfrom PIL import Imagefilename ='1.png'img = Image.open(filename)#不設定成單行模式,沒有輸出bu = TextBuilder(tesseract_layout=7)#lang為語言,預設使用engprint libtesseract.image_to_string(img,lang='fontet',builder=bu)
幾個注意點:
1、前文下載的dll 與tessdata語言套件檔案夾,預設放到 pyocr-test.py 的同一目錄下;
2、必須安裝vc++ 2015 發行包(vc_redist.x86.exe 或vc_redist.x64.exe),否則會ctypes.cdll.LoadLibrary(libname)會調用dll失敗。
3、源碼裡的第一段,主要就是用來解決python找不到dll的問題,這段代碼主要功能:把目前的目錄加到系統PATH環境變數裡,以確保dll能被搜到。
這個地方容易出問題,主要是os.path.realpath 、__file__這幾個內建函式和常量,貌似在不同的開發環境,甚至不同的開發工具下都會有不同的結果,跟pyocr無關,主要是python的問題。
import ostessdir = os.getenv('TESSDATA_PREFIX', None)if tessdir is None : tessdir = os.path.split(os.path.realpath(__file__))[0] os.environ['TESSDATA_PREFIX'] = tessdirif tessdir not in os.environ['PATH']: os.environ['PATH']= tessdir+';' +os.environ['PATH']
4、實測時發現,bu = TextBuilder(tesseract_layout=7) 這一段不寫,會導致識別出錯,這個等於以前博文提到-psm 7函數,也就是單行模式。
以上