然后看了下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
当然这是我水平有限的原因,暂时没找到更好的方法,具体可以自己修改