Python pytesseract - 找不到 eng.traineddata - oem 2

Posted

技术标签:

【中文标题】Python pytesseract - 找不到 eng.traineddata - oem 2【英文标题】:Python pytesseract - can't find eng.traineddata for -- oem 2 【发布时间】:2020-03-27 03:18:11 【问题描述】:

我正在尝试从一个简单的图像中提取文本。

当我使用默认引擎(oem 3)时,文本被提取(很差)。我想使用其他引擎(oem 2)看看输出是否可以提高。

import pytesseract

#this is the config that gives a poor output
config = '--tessdata-dir "C:/Program Files/Tesseract-OCR/tessdata" -l eng --oem 2 --psm 6'
text = pytesseract.image_to_string(crop, config=config)

当我尝试传递更改引擎的选项时,我收到一个错误,提示找不到语言文件:

pytesseract.pytesseract.TesseractError: (1, "Error: Tesseract (legacy) engine requested, but components are not present in C:/Program Files/Tesseract-OCR/tessdata/eng.traineddata!!加载语言失败'eng ' Tesseract 无法加载任何语言!无法初始化 tesseract。”)

#experimental config
config = '--psm 6'
text = pytesseract.image_to_string(crop, config=config)

如您所见,我明确地传入了 eng.traineddata 的目录,但找不到语言文件。

我有两个问题:

    如何通过第一个配置文件提高 OCR 的质量? 为什么找不到语言文件?我有 eng.traineddata、eng.user-patterns 和 eng.user-words 在提到的文件夹中,以及安装在那里的一些其他文件和文件夹。

我还确保我的环境变量是正确的(因此第一个配置文件可以工作)。

谢谢

【问题讨论】:

【参考方案1】:

在执行 OCR 时,在将图像放入 Pytesseract 之前对其进行预处理非常重要。特别是对于这张图片,我们可以去掉水平和垂直的网格线。这是预处理后的图像:

Pytesseract OCR 的结果

XXX XXX XXX XXX XXX XXX XXX XXX XXX XXX
89 987 98 7 987 9 789 87 987 9
978 9 78 978 9 789 78 987 9
78 987 9 78 *978 97/8 %9 “78 978 9
78 978 978 978 978 98 9
78 978 978 978 978 978 987 978 7897
978 9 9 78 9 89 98 978 9

代码

import cv2
import pytesseract

pytesseract.pytesseract.tesseract_cmd = r"C:\Program Files\Tesseract-OCR\tesseract.exe"

# Remove horizontal and vertical lines
image = cv2.imread('1.png')
kernel_vertical = cv2.getStructuringElement(cv2.MORPH_RECT, (1,50))
temp1 = 255 - cv2.morphologyEx(image, cv2.MORPH_CLOSE, kernel_vertical)
horizontal_kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (50,1))
temp2 = 255 - cv2.morphologyEx(image, cv2.MORPH_CLOSE, horizontal_kernel)
temp3 = cv2.add(temp1, temp2)
result = cv2.add(temp3, image)

data = pytesseract.image_to_string(result, lang='eng',config='--psm 6')
print(data)

cv2.imshow('result', result)
cv2.waitKey()

【讨论】:

知道为什么我不能使用 oem 选项运行 pytesseract.image_to_string 吗?如何自动删除网格线(动态结构化元素大小?)? 我也无法运行--oem 2,但--oem 3 对我有用。我得到了你得到的同样的错误。看看这些configuration options也许会有所帮助。自动删除网格线很困难,因为每条线的宽度可能因图像而异,因此获得动态内核大小并不容易。如果您的图像仅使用“标准”网格线,那么您可以使用通用内核结构 看看tesseract-ocr.github.io/tessdoc/…【参考方案2】:

可能是 tesseract 认为您的 CPU 支持 AVX 而实际上并不支持(请参阅/proc/cpuinfo 的输出)

如果您使用的是开源 Tesseract,一种解决方法是 在configure.acAX_CHECK_COMPILE_FLAG([-mavx], [avx=true], [avx=false])中更改此行 致AX_CHECK_COMPILE_FLAG([-mavx], [avx=false], [avx=false])

并在arch/simddetect.h中更改此行static inline bool IsAVXAvailable() return detector.avx_available_; static inline bool IsAVXAvailable() return false;

然后重新编译源代码。

Reference

【讨论】:

以上是关于Python pytesseract - 找不到 eng.traineddata - oem 2的主要内容,如果未能解决你的问题,请参考以下文章

Tesseract 找不到 eng.traineddata

python pytesseract模块,报错

Python之pytesseract模块-实现OCR

PyCharm 在 Mac 上找不到 Tesseract

如何使用 pytesseract 获得每一行的信心

python下调用pytesseract识别某网站验证码