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

当然这是我水平有限的原因,暂时没找到更好的方法,具体可以自己修改

 

posted @ 2020-03-30 23:13  darkspr  阅读(2079)  评论(0编辑  收藏  举报