Python中使用Tesseract OCR的UnicodeDecodeError

Nwa*_*ume 6 python tesseract python-tesseract

我试图使用Python中的Tesseract OCR从图像文件中提取文本,但我面临一个错误,我可以弄清楚如何处理它.所有我的环境都很好,因为我在python中使用ocr测试了一些示例图像!

这是代码

from PIL import Image
import pytesseract
strs = pytesseract.image_to_string(Image.open('binarized_image.png'))

print (strs)
Run Code Online (Sandbox Code Playgroud)

以下是我从eclipse控制台获得的错误

strs = pytesseract.image_to_string(Image.open('binarized_body.png'))
  File "C:\Python35x64\lib\site-packages\pytesseract\pytesseract.py", line 167, in image_to_string
    return f.read().strip()
  File "C:\Python35x64\lib\encodings\cp1252.py", line 23, in decode
    return codecs.charmap_decode(input,self.errors,decoding_table)[0]
UnicodeDecodeError: 'charmap' codec can't decode byte 0x9d in position 20: character maps to <undefined>
Run Code Online (Sandbox Code Playgroud)

我在Windows10上 使用python 3.5 x64

ran*_*ame 8

问题是python试图使用控制台的编码(CP1252)而不是它的意思(UTF-8).PyTesseract找到了一个unicode字符,现在正在尝试将其转换为CP1252,这是它无法做到的.在另一个平台上,您不会遇到此错误,因为它将使用UTF-8.

您可以尝试使用不同的函数(可能是一个返回bytes而不是str因此您不必担心编码).你可以改变蟒蛇的默认编码作为一个评论提到,尽管当你去尝试,并打印在Windows控制台上的字符串会引起问题.或者,这是我推荐的解决方案,您可以下载Cygwin并在其上运行python以获得干净的UTF-8输出.

如果你想要一个不会破坏任何东西的快速而肮脏的解决方案,这里有一种你可以考虑的方法:

import builtins

original_open = open
def bin_open(filename, mode='rb'):       # note, the default mode now opens in binary
    return original_open(filename, mode)

from PIL import Image
import pytesseract

img = Image.open('binarized_image.png')

try:
    builtins.open = bin_open
    bts = pytesseract.image_to_string(img)
finally:
    builtins.open = original_open

print(str(bts, 'cp1252', 'ignore'))
Run Code Online (Sandbox Code Playgroud)