python 調用Tesseract,dll模式,無需安裝,綠色版


系統環境:3.7.4-64+win10

最近做批量登錄,網站的驗證碼還是挺簡單的,如果說接入打碼平台,那不划算了

驗證碼類似下圖

 

然后看了下ocr識別,比較方便的就是Tesseract,識別率還行

接下去就是python調用,常規對接方式就是先安裝teseract.exe,然后python調用接口

1.cmd直接調用

2.接入庫調用,比如pyocr等

這2中方式都不是很方便,第一種需要安裝軟件,第二種也要按照,而且把項目打包成exe也是個大問題,各種導入錯誤

那么有沒有其他方法呢,網上查閱后發現.net可以直接調用dll組件來識別,既然能調用dll,那么python自然也能調用

網上搜尋一番,果然有人已經給出了解決方案,參考如下,里面給出了32位和64位的調用方法,不過沒有給dll下載地址

 https://www.polarxiong.com/archives/python-pytesser-tesseract.html

下載(32和64位都放進去了,按照自己需求使用)

鏈接:https://pan.baidu.com/s/19mFffGpLgtHq1f2tGzQqXw
提取碼:kr70

文件結構如下

 

 tessdata是訓練數據,304是主dll,172是輔助,2個需要放在一起

main.py(64位調用方法,32位不同,參照上面連接)

import ctypes

class OCR():

    def __init__(self, DLL_PATH, TESSDATA_PREFIX, lang):
        self.DLL_PATH = DLL_PATH
        self.TESSDATA_PREFIX = TESSDATA_PREFIX
        self.lang = lang
        self.ready = False
        if self.do_init():
            self.ready = True


    def do_init(self):
        self.tesseract = ctypes.cdll.LoadLibrary(self.DLL_PATH)
        self.tesseract.TessBaseAPICreate.restype = ctypes.c_uint64
        self.api = self.tesseract.TessBaseAPICreate()
        rc = self.tesseract.TessBaseAPIInit3(ctypes.c_uint64(self.api), self.TESSDATA_PREFIX, self.lang)
        if rc:
            self.tesseract.TessBaseAPIDelete(ctypes.c_uint64(self.api))
            print('Could not initialize tesseract.\n')
            return False
        return True

    def get_text(self, path):
        if not self.ready:
            return False
        self.tesseract.TessBaseAPIProcessPages(
            ctypes.c_uint64(self.api), path, None, 0, None)
        self.tesseract.TessBaseAPIGetUTF8Text.restype = ctypes.c_uint64
        text_out = self.tesseract.TessBaseAPIGetUTF8Text(ctypes.c_uint64(self.api))
        return bytes.decode(ctypes.string_at(text_out)).strip()


if __name__ == '__main__':
    DLL_PATH = 'libtesseract304.dll'
    TESSDATA_PREFIX = b'./tessdata'
    lang = b'eng'
    ocr = OCR(DLL_PATH, TESSDATA_PREFIX, lang)
    image_file_path = b'test.png'
    result = ocr.get_text(image_file_path)
    print(result)

  

做了一下簡單的封裝,這樣就能簡單調用了,打包成exe也不會有問題,無需按照,綠色軟件

注意:dll需要放到和主程序相同的目錄,這里涉及到加載的問題,因為304dll加載需要172dll,如果在文件夾內,則會出現找不到dll

當然這是我水平有限的原因,暫時沒找到更好的方法,具體可以自己修改

 


免責聲明!

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



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