Eine Aufzeichnung des Kampfes, um herauszufinden, was mit Python und OCR getan werden kann (Tesseract-OCR wird für OCR verwendet)
Lesen wir zunächst ein ganzes Blatt des zu lesenden Objekts Da ich mich sehr bemühe, Dinge wie Briefmarken und Fotos zu lesen, verstehe ich die Bedeutung nicht Selbst wenn ich es lesen kann, kenne ich die Unterbrechung zwischen Daten nicht Aus diesem Grund ist es nutzlos. Deshalb habe ich beschlossen, nur die notwendigen Teile auszuschneiden und zu lesen.
Wenn Sie den folgenden Code schreiben, können Sie ihn an einer beliebigen Stelle in der Bilddatei platzieren Sie können das ausgeschnittene Bild unter einem anderen Namen ausschneiden und speichern.
from PIL import Image
img_trim = Image.open ('Name der Originalbilddatei') #Schneiden Sie die angegebenen Koordinaten aus img_trim.crop ((x1, y1, x2, y2)). save ('Name des zugeschnittenen Bildes speichern')
Bei dieser Geschwindigkeit müssen die Koordinaten viele Male angepasst werden, um das gewünschte Teil auszuschneiden. Erstellen wir eine Anwendung, die Koordinaten durch Betätigen der Maus erfasst, um die Arbeit beim Schleichen von Koordinaten zu optimieren. Es gibt verschiedene Möglichkeiten, eine GUI wie C # und VB zu erstellen, aber dieses Mal werde ich einen Mechanismus zum Erstellen einer Python-GUI namens Kivy ausprobieren. Die Installationsarbeiten sollten durch Installation von Kivy mit Pip durchgeführt worden sein. .. .. (Details weggelassen)
UI-Teiledefinition (main.kv):
#:import hex_color kivy.utils.get_color_from_hex
<ImageWidget>:
canvas.before:
Color:
rgb: 1,1,1
Rectangle:
pos: self.pos
size: self.size
BoxLayout:
orientation: 'horizontal'
height: root.height
width: root.width
Image:
id: img
allow_stretch: True
source: root.image_src
BoxLayout:
size: root.size
orientation: 'vertical'
width: 200
Label:
id: lbl_file_name
color: 0, 0, 0, 1
font_size: 20
background_color: hex_color('#000000')
Label:
id: lbl_result
color: 0, 0, 0, 1
font_size: 20
Es ist wie eine vereinfachte Version von HTML geschrieben Dann die Quelle des Hauptkörpers (main.py):
from kivy.app import App
aus kivy.core.text importieren LabelBase, DEFAULT_FONT #Addition from kivy.config import Config aus kivy.resources importiere resource_add_path #addition from kivy.properties import StringProperty from kivy.uix.widget import Widget from kivy.graphics import Line from kivy.graphics import Color from kivy.utils import get_color_from_hex from PIL import Image import math import os import pyocr import pyocr.builders
resource_add_path ('c: / Windows / Fonts') #Addition LabelBase.register (DEFAULT_FONT, 'msgothic.ttc') #Addition
Config.set('graphics', 'width', '1224')
Config.set('graphics', 'height', '768') # 16:9
class ImageWidget(Widget):
image_src = StringProperty('')
def __init__(self, **kwargs):
super().__init__(**kwargs)
self.image_src = 'read_img/0112-3.png'
self.ids.lbl_file_name.text = "Dateiname: \ n {}" .format (self.image_src) self.lines = []
def on_touch_down(self, touch):
self.x1 = touch.x
self.y1 = touch.y
self.x2 = None
self.y2 = None
def on_touch_move(self, touch):
img = self.ids.img
if touch.x > img.width:
self.x2 = img.width
else:
self.x2 = touch.x
if touch.y > img.height:
self.y2 = 0
else:
self.y2 = touch.y
for line in self.lines:
self.canvas.remove(line)
self.lines = []
with self.canvas:
#Einstellungen für rote Linie Color(100, 0, 0) touch.ud['line'] = Line(points=[self.x1, self.y1, self.x2, self.y1, self.x2, self.y2, self.x1, self.y2], close='True') self.lines.append(touch.ud['line'])
Color(1, 1, 1)
touch.ud['line'] = Line(points=[self.x1, self.y1, self.x2, self.y1,
self.x2, self.y2, self.x1, self.y2],
dash_offset=5, dash_length=3,
close='True')
self.lines.append(touch.ud['line'])
def on_touch_up(self, touch):
Beenden, wenn das Ereignis # touch_move nicht aufgetreten ist if self.x2 is None: return
img = self.ids.img
vs = img.norm_image_size
img_trim = Image.open(self.image_src)
rs = img_trim.size
ratio = rs[0] / vs[0]
px = 0
py = 0
if img.width > vs[0]:
px = (img.width - vs[0]) / 2
if img.height > vs[1]:
py = (img.height - vs[1]) / 2
x1 = (self.x1 - px) * ratio
x2 = (self.x2 - px) * ratio
y1 = (img.height - self.y1 - py) * ratio
y2 = (img.height - self.y2 - py) * ratio
if x1 < x2:
real_x1 = math.floor(x1)
real_x2 = math.ceil(x2)
else:
real_x1 = math.floor(x2)
real_x2 = math.ceil(x1)
if y1 < y2:
real_y1 = math.floor(y1)
real_y2 = math.ceil(y2)
else:
real_y1 = math.floor(y2)
real_y2 = math.ceil(y1)
#Schneiden Sie die angegebenen Koordinaten aus img_trim.crop((real_x1, real_y1, real_x2, real_y2)).save('write_img/test.png')
#Lesen Sie den Text aus dem Bild self.read_image_to_string()
def read_image_to_string(self):
try:
path_tesseract = r"C:\Program Files\Tesseract-OCR"
if path_tesseract not in os.environ["PATH"].split(os.pathsep):
os.environ["PATH"] += os.pathsep + path_tesseract
tools = pyocr.get_available_tools()
tool = tools[0]
img = Image.open("write_img/test.png ")
builder = pyocr.builders.TextBuilder(tesseract_layout=6)
result = tool.image_to_string(img, lang="jpn", builder=builder)
self.ids.lbl_result.text = f "Leseergebnis: \ n {Ergebnis}" print(result) except Exception as ex: print(ex) self.ids.lbl_result.text = f "Leseergebnis: \ nFehler"
class MainApp(App):
def __init__(self, **kwargs):
super(MainApp, self).__init__(**kwargs)
self.title = 'test'
def build(self):
return ImageWidget()
if __name__ == '__main__':
app = MainApp()
app.run()
Programmablauf: Holen Sie sich den Punkt, auf den Sie geklickt haben, als Sie geklickt haben Zeichnen Sie den quadratischen Rahmen beim Ziehen weiter Holen Sie sich die Endkoordinaten, wenn Sie nicht geklickt haben Das Ausschneiden des Bildes und das Lesen des Bildes durch OCR wird ausgeführt.
Punkt: Angeklickte Koordinaten auf dem Bildschirm können nicht verwendet werden, selbst wenn sie auf das Originalbild angewendet werden Es ist notwendig, die tatsächlichen Koordinaten unter Berücksichtigung des Kontrasts zu berechnen Es ist zu berücksichtigen, dass das Bildobjekt auf der GUI Auffüllungen enthält. Es ist auch zu beachten, dass die Ziehrichtung der Maus oben links umgeben ist
Als Ergebnis des Lesens von OCR, ... Nicht sehr genau, wenn es ohne Anpassung ausgeführt wird Es scheint, dass wir die Parameter anpassen und verschiedene Dinge tun können. Erstens kann es ein Problem mit der Leistung von OCR geben. In Zukunft möchte ich eine OCR-Engine usw. auswählen.
Recommended Posts