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 ,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函數,也就是單行模式。

  

以上

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM