轉載地址:http://www.cnblogs.com/zhongtang/p/5757406.html
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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
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 ,sys tessdir = os.getenv('TESSDATA_PREFIX', None) if tessdir is None : tessdir = os.path.split(os.path.realpath(__file__))[0] os.environ['TESSDATA_PREFIX'] = tessdir if 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 libtesseract from pyocr.builders import TextBuilder from PIL import Image filename ='1.png' img = Image.open(filename) #不設置成單行模式,沒有輸出 bu = TextBuilder(tesseract_layout=7) #lang爲語言,默認使用eng print 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 os
tessdir = os.getenv('TESSDATA_PREFIX', None)
if tessdir is None :
tessdir = os.path.split(os.path.realpath(__file__))[0]
os.environ['TESSDATA_PREFIX'] = tessdir
if tessdir not in os.environ['PATH']:
os.environ['PATH']= tessdir+';' +os.environ['PATH']
4、實測時發現,bu = TextBuilder(tesseract_layout=7) 這一段不寫,會導致識別出錯,這個等於以前博文提到-psm 7函數,也就是單行模式。
以上