UnicodeDecodeError' charmap' Python中使用Tesseract OCR的编解码器

时间:2016-06-25 00:52:39

标签: python character-encoding tesseract python-tesseract

我正在尝试使用teseract-OCR在python中对图像文件进行OCR。 我的环境是 - Windows机器上的Python 3.5 Anaconda。

以下是代码:

dt2[dt1, .(sum = sum(Value)), on=.(ID, Date3>=Date1, Date3<=Date2), by=.EACHI]
#    ID      Date3      Date3 sum
# 1:  1 2016-03-01 2016-04-01   5
# 2:  1 2016-04-01 2016-05-01  14
# 3:  2 2016-03-14 2016-04-15  17
# 4:  2 2016-04-15 2016-05-17   2
# 5:  3 2016-05-01 2016-06-10  14
# 6:  3 2016-06-10 2016-07-15   3

我得到的错误是:

from PIL import Image
from pytesseract import image_to_string
out = image_to_string(Image.open('sample.png'))

我尝试了提到的解决方案current development version 黑客行不通

我在Mac OS上尝试了我的代码它正在运行。

我研究了pytesseract问题: 这是here

由于

1 个答案:

答案 0 :(得分:2)

嗯......那里有一些非常奇怪的东西 - 当我们谈论“latin1”文本编码时,字符“\ x81”是不可打印的。但是,在库正在使用的“cp1252”编码中,它被映射为“未定义的字符” - 这是显式的。

“latin1”有点像“无操作”编解码器,有时在Python中用于简单地将字节序列转换为unicode字符串(Python 3.x中的默认字符串)。编解码器“cp1252”几乎相同,在某些情况下它可以与latin1互换使用 - 但这个“\ x81”代码是两者之间的一个区别。在你的情况下,一个关键的。

正确的做法是尝试为image_to_string函数提供可选的lang参数 - 以便它可以使用正确的编解码器来解码您的文本 - 如果它能更好地识别出什么是它暴露的字符为“0x81”。但是,这可能不起作用 - 因为它可能仅仅是一个与语言无关的非常奇怪的角色的OCR错误。

所以,你的解决方法是monkeypatch“cp1252”编解码器,这样它就会填充一个Unicode“无法识别的”字符而不是错误 - 一种方法是在调用tesseract之前使这些行符合:

from encodings import cp1252
original_decode  = cp1252.Codec.decode
cp1252.Codec.decode =  lambda self, input, errors="replace": original_decode(self, input, errors)

但是,如果可以的话,请打开针对pytesseract项目的错误报告。我的猜测是他们应该使用“latin1”而不是“cp1252”编码。