python下以api形式調用tesseract識別圖片驗證碼

轉載地址: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函數,也就是單行模式。

  

以上

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章