烦人的Python Tesseract错误:无法打开数据文件 ./tessdata/eng.traineddata

4 投票
2 回答
9570 浏览
提问于 2025-04-18 12:46

我遇到了一个错误,这让我有点抓狂。这个错误出现在一个叫做tesseract的Python模块上,它是用来处理图像文字识别的。

这是我尝试运行的Python代码:

img = cv2.imread(image, 0)
api = tesseract.TessBaseAPI()
api.Init(".","eng",tesseract.OEM_DEFAULT)
api.SetPageSegMode(tesseract.PSM_AUTO)
tesseract.SetCvImage(img,api)
url = api.GetUTF8Text()
conf=api.MeanTextConf()
print('Extracted URL : ' + url)
api.End()

然后我得到了这个结果:

Error opening data file ./tessdata/eng.traineddata
Please make sure the TESSDATA_PREFIX environment variable is set to the parent directory of your "tessdata" directory.
Failed loading language 'eng'
Tesseract couldn't load any languages!

我不明白为什么会这样,因为我已经正确设置了TESSDATA_PREFIX这个环境变量,指向了我tesseract安装的正确路径(路径后面有斜杠)。

当我直接在powershell中运行Tesseract时(顺便说一下,我用的是Windows 7),我这样做:

 tesseract.exe .\data\test.tif -psm 7 out

它运行得非常顺利!

而且当我在我的Python脚本中用Popen调用Tesseract时,它也能正常工作,但我不喜欢这样,因为我无法直接从标准输出中获取OCR识别的文本。实际上,似乎没有其他选择,只能给Tesseract提供一个输出文件名,然后再打开这个文件读取内容。我觉得为了获取OCR的输出而处理临时文本文件会非常麻烦……

谁能帮帮我?

2 个回答

0

在编程中,有时候我们需要处理一些数据,比如从一个地方获取数据,然后在程序中使用这些数据。这个过程就像是从冰箱里拿食材,然后用这些食材做饭一样。

有些时候,数据的获取可能会比较慢,就像你在超市排队结账一样。这时候,我们可以使用一些技巧来让程序在等待数据的同时,去做其他的事情,这样就不会浪费时间。

这就涉及到“异步编程”的概念。简单来说,异步编程就是让程序在处理某些事情时,不用一直等待,而是可以去做其他的事情,等到需要的结果出来时再回来处理。

比如说,你在等朋友来接你,而你可以在等的同时看手机、听音乐或者做其他事情。当朋友到了,你再去开门,这样就不会觉得无聊。

在代码中,我们可以使用一些特定的语法和方法来实现这种异步的效果。这样,程序就能更高效地运行,用户体验也会更好。

get location of ur tessdata folder by typing in command prompt: 
$ brew list tesseract
in may case:
/usr/local/Cellar/tesseract/3.05.01/bin/tesseract
/usr/local/Cellar/tesseract/3.05.01/include/tesseract/ (27 files)
/usr/local/Cellar/tesseract/3.05.01/lib/libtesseract.3.dylib
/usr/local/Cellar/tesseract/3.05.01/lib/pkgconfig/tesseract.pc
/usr/local/Cellar/tesseract/3.05.01/lib/ (2 other files)
/usr/local/Cellar/tesseract/3.05.01/share/man/ (11 files)
/usr/local/Cellar/tesseract/3.05.01/share/tessdata/ (28 files)

now
tessdata_dir_config = r'--tessdata-dir "/usr/local/Cellar/tesseract/3.05.01/share/tessdata"'

txt= image_to_string(img,lang='eng',config=tessdata_dir_config)
5

调用 api.Init 的第一个参数应该是 TESSDATA_PREFIX。

撰写回答