2015-12-15 20 views
5

Iam sta tentando di estrarre il testo da un file immagine usando Tesseract OCR in Python ma sto affrontando un errore che posso capire come gestirlo. tutto il mio ambiente è buono come ho provato alcune immagini di esempio con l'ocr in python!UnicodeDecodeError con Tesseract OCR in Python

Ecco il codice

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

print (strs) 

follow è l'errore che ricevo da console 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> 

Iam utilizzando python 3.5 x64 su Windows 10

+0

Questo mi ricorda qualcosa che ho incontrato in passato; Non so se è esattamente lo stesso problema però. Il fatto che tu sia su Windows mi ha spiazzato - Python in CMD su Windows sembra avere una strana pagina di codice predefinita. Hai provato a hackerare in ['sys.setdefaultencoding'] (http://stackoverflow.com/questions/2276200/changing-default-encoding-of-python) per vedere se questo ti aiuta a diagnosticare il problema? (Probabilmente eviterei di tenere quell'interruzione nel codice di produzione se puoi aiutarlo comunque.) –

risposta

6

Il problema è quel pitone sta cercando di usare la codifica della console (CP1252) invece di quello che è destinato a usare (UTF-8). PyTesseract ha trovato un carattere unicode e sta ora tentando di tradurlo in CP1252, cosa che non può fare. Su un'altra piattaforma non si verificherà questo errore perché utilizzerà UTF-8.

È possibile provare a utilizzare una funzione diversa (possibilmente quella che restituisce bytes anziché str in modo da non doversi preoccupare della codifica). È possibile modificare la codifica predefinita di python come menzionato in uno dei commenti, sebbene ciò possa causare problemi quando si tenta di stampare la stringa sulla console di Windows. Oppure, e questa è la mia soluzione consigliata, è possibile scaricare Cygwin ed eseguire python su questo per ottenere un output UTF-8 pulito.

Se si desidera una soluzione rapida e sporca che non rompere nulla (ancora), ecco un modo che si potrebbe prendere in considerazione:

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')) 
+0

Sembra che ci siano alcune buone informazioni potenzialmente correlate a questa risposta [qui] (http://stackoverflow.com/questions/18729148/unicode -Personaggi-non-rendering-con-pil-imagefont). – MPlanchard

+0

Sì, sembra il problema che ho incontrato prima. Questa risposta sarebbe meglio se fornissi del codice che spiega come configurare PyTesseract per aprire quel file con una codifica UTF8, se possibile –

+0

@BenjaminHodgson PyTesseract non ha un modo per specificare la codifica, ma possiamo inserire il nostro 'open' alternativa ... – randomusername

Problemi correlati