2016-06-25 14 views
2

Ich versuche, OCR auf eine Bilddatei in Python mit Teseract-OCR zu tun. Meine Umgebung ist Python 3.5 Anaconda auf Windows-Maschine. HierUnicodeDecodeError 'Charmap' Codec mit Tesseract OCR in Python

ist der Code:

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

Der Fehler Ich erhalte ist:

File "Anaconda3\lib\sitepackages\pytesseract\pytesseract.py", line 167, in image_to_string 
return f.read().strip() 
File "Anaconda3\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 0x81 in position 1583: character maps to <undefined> 

ich versucht habe, die Lösung here erwähnt Der Hack funktioniert nicht

ich versucht habe, Mein Code auf Mac OS funktioniert.

Ich habe in die pytesseract Probleme sah: Hier ist dies ein open issue

Dank

Antwort

1

sehr seltsam Hmm..something dort passiert - Das Zeichen „\ x81“ ist nicht druckbar, wenn wir darüber reden, die Textcodierung "latin1". Bei der Codierung "cp1252", die die Bibliothek verwendet, wird sie jedoch auf ein "undefiniertes Zeichen" abgebildet - dies ist explizit.

Was passiert ist, dass "latin1" ist ein "no-op" Codec, manchmal in Python verwendet, um einfach eine Byte-Sequenz in eine Unicode-Zeichenfolge (die Standardzeichenfolge in Python 3.x) zu übersetzen. Der Codec "cp1252" ist fast das gleiche, und in einigen Kontexten wird es mit latin1 austauschbar verwendet - aber dieser "\ x81" -Code ist ein Unterschied zwischen den beiden. In Ihrem Fall ein entscheidender.

Die richtige Sache zu tun ist zu versuchen, die image_to_string Funktion mit den optionalen lang Parametern zu liefern - so, dass es den richtigen Codec verwenden können Sie Ihren Text zu entschlüsseln - wenn es besser erkennt, was der Charakter ist es als „0x81 aussetzt ". Dies könnte jedoch nicht funktionieren - da es sich einfach um einen OCR-Fehler bei einem sehr seltsamen Zeichen handelt, das überhaupt nicht mit der Sprache verwandt ist.

Also, für Sie die Problemumgehung ist die „cp1252“ Codec monkeypatch so dass anstelle eines Fehlers, füllt sie in ein Unicode „unerkannt“ Charakter - ein Weg, dies zu tun ist, diese Zeilen vor dem Aufruf von Tesseract isnert:

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

Aber bitte, wenn Sie können, öffnen Sie einen Fehlerbericht gegen das Projekt pyterseract. Meine Vermutung ist, dass sie an dieser Stelle "latin1" und nicht "cp1252" kodieren sollten.