Ich habe mich gefragt, ob ich einfach eine OCR-App erstellen kann, die auf dem Desktop startet, also habe ich sie erstellt.
・ MacOS Catalina 10.15.4 ・ Visual Studio-Code ・ Python3.8.1
pip install pysimplegui
2. Tesseract OCR(OCR)
brew install tesseract
sudo pip3 install pyocr
sudo pip3 install pillow
● Was sind diese Bibliotheken? Einschließlich dessen habe ich auf die folgenden Websites für OCR stark verwiesen (danke). Probieren Sie eine einfache OCR mit Tesseract + PyOCR aus
● Dies ist für Windows-Benutzer möglicherweise leichter zu verstehen. [Python] So transkribieren Sie ein Bild und konvertieren es in Text (tesseract-OCR, pyocr)
Nun wollen wir sehen, wie man den Code schreibt, um die Zeichen aus dem Bild zu lesen (der Import der Bibliothek ist im endgültigen gesamten Quellcode enthalten, daher werde ich ihn hier weglassen).
def scan_file_to_str(file_path, langage):
"""read_file_to_str
Generieren Sie eine Zeichenfolge aus einer Bilddatei
Args:
file_path(str):Pfad der zu lesenden Datei
langage(str): 'jpn'Oder'eng'
Returns:
Zeichenkette lesen
"""
tools = pyocr.get_available_tools()
if len(tools) == 0:
print("No OCR tool found")
sys.exit(1)
tool = tools[0]
text = tool.image_to_string(
#Öffnen Sie die als Argument gesendete Datei
Image.open(file_path),
#Geben Sie die als Argument gesendete Sprache an('jpn'Oder'eng')
lang=langage,
builder=pyocr.builders.TextBuilder(tesseract_layout=6)
)
#Gibt schließlich die aus dem Bild gelesene Zeichenfolge zurück
return text
Es ist wirklich überraschend, dass Sie eine Zeichenfolge aus einem Bild in nur 15 Zeilen lesen können. Ich war beeindruckt.
Als nächstes werde ich dies auf die GUI setzen. Ich denke, tkinter ist berühmt, wenn es um Python-GUI geht. Früher habe ich Code mit tkinter geschrieben, aber als ich die Recherche durchführte, stieß ich auf den folgenden Artikel.
[Wenn Sie Tkinter verwenden, versuchen Sie es mit PySimpleGUI](https://qiita.com/dario_okazaki/items/656de21cab5c81cabe59#exe%E5%8C%96%E3%81%AB%E3%81%A4 % E3% 81% 84% E3% 81% A6)
Ich war auch beeindruckt von der Tatsache, dass die GUI mit einfachem Code implementiert werden konnte, und entschied mich, sie zu verwenden.
Hier ist der Code für den GUI-Teil.
#Thema festlegen(Es gibt viele Themen)
sg.theme('Light Grey1')
#Wo und was zu platzieren(Ich denke, es wird einfacher zu montieren sein, wenn Sie wissen, dass es in Linieneinheiten angeordnet ist.)
layout = [
#Die erste Zeile(Text:Setzen Sie den Text)
[sg.Text('Datei zum Lesen(Mehrfachauswahl möglich)', font=('IPA Gothic', 16))],
#2. Zeile(InputText:Textfeld, FilesBrowse:Dateidialog)
[sg.InputText(font=('IPA Gothic', 14), size=(70, 10),), sg.FilesBrowse('Dateien auswählen', key='-FILES-'),],
#3. Zeile(Text:Text, Radio:Optionsfeld x 2)
[sg.Text('Sprache zum Lesen', font=('IPA Gothic', 16)),
sg.Radio('japanisch', 1, key='-jpn-', font=('IPA Gothic', 10)),
sg.Radio('Englisch', 1, key='-eng-', font=('IPA Gothic', 10))],
#4. Zeile(Button:Taste)
[sg.Button('Ausführung lesen'),],
#5. Zeile(MLine:100 Spalten x 30 Zeilen Textbereich)
[sg.MLine(font=('IPA Gothic', 14), size=(100,30), key='-OUTPUT-'),]
]
#Fenster bekommen(Das Argument von Window ist "Titel, Layout")
window = sg.Window('Einfache OCR', layout)
#Liste zum Ablegen der gelesenen Datei
files = []
#Drehen Sie nun die Endlosschleife und warten Sie auf Ereignisse wie Tastenklicks.
while True:
event, values = window.read()
#Keine ist die Schaltfläche "✕" im Fenster. Wenn dies gedrückt wird, bricht es aus der Schleife aus und schließt das Fenster.
if event == None:
break
# 'Ausführung lesen'Wenn die Taste gedrückt wird
if event == 'Ausführung lesen':
# key='-FILES-'Der in eingegebene Wert von InputText';'Holen Sie sich eine Liste der Dateinamen getrennt durch
files.extend(values['-FILES-'].split(';'))
#Optionsfeldwerte['-jpn-']Dann ist Sprache'jpn',Andernfalls'eng'
language = 'jpn' if values['-jpn-'] else 'eng'
text = ''
#Schleife nach Anzahl der Dateien
for i in range(len(files)):
if not i == 0:
#Für jede Datei gibt es ein Trennzeichen
text += '================================================================================================\n'
#Der zuvor hier definierte Scan_file_to_Empfangen Sie die gelesene Zeichenfolge mit der str-Methode
text += scan_file_to_str(files[i], language)
if language == 'jpn':
#Bei japanischen Zeichenketten gab es viel zusätzlichen Platz, deshalb habe ich ihn gelöscht.
text = text.replace(' ', '')
#Lassen Sie in der nächsten Datei zwei Zeilen von der Zeichenfolge entfernt
text += '\n\n'
#Daten lesen(=text)Schlüssel='-OUTPUT-'Anzeige auf der in angegebenen MLine
window.FindElement('-OUTPUT-').Update(text)
#Ein Popup-Fenster benachrichtigt Sie über das Ende
sg.Popup('Hat vervollständigt')
window.close()
In Bezug auf die GUI gibt es einige andere Dinge, auf die ich viel hingewiesen habe, deshalb werde ich sie veröffentlichen.
・ Lernnotizen für das K-TechLabo-Seminar → Der PDF-Text ist sehr leicht zu verstehen.
import os
import sys
from PIL import Image
import PySimpleGUI as sg
import pyocr
import pyocr.builders
def scan_file_to_str(file_path, langage):
"""read_file_to_str
Generieren Sie eine Zeichenfolge aus einer Bilddatei
Args:
file_path(str):Pfad der zu lesenden Datei
langage(str): 'jpn'Oder'eng'
Returns:
Zeichenkette lesen
"""
tools = pyocr.get_available_tools()
if len(tools) == 0:
print("No OCR tool found")
sys.exit(1)
tool = tools[0]
text = tool.image_to_string(
Image.open(file_path),
lang=langage,
builder=pyocr.builders.TextBuilder(tesseract_layout=6)
)
return text
#Thema festlegen
sg.theme('Light Grey1')
layout = [
#Die erste Zeile
[sg.Text('Datei zum Lesen(Mehrfachauswahl möglich)', font=('IPA Gothic', 16))],
#2. Zeile
[sg.InputText(font=('IPA Gothic', 14), size=(70, 10),), sg.FilesBrowse('Dateien auswählen', key='-FILES-'),],
#3. Zeile
[sg.Text('Sprache zum Lesen', font=('IPA Gothic', 16)),
sg.Radio('japanisch', 1, key='-jpn-', font=('IPA Gothic', 10)),
sg.Radio('Englisch', 1, key='-eng-', font=('IPA Gothic', 10))],
#4. Zeile
[sg.Button('Ausführung lesen'),],
#5. Zeile
[sg.MLine(font=('IPA Gothic', 14), size=(100,30), key='-OUTPUT-'),]
]
#Fenster bekommen
window = sg.Window('Einfache OCR', layout)
files = []
a = 0
while True:
event, values = window.read()
if event == None:
break
if event == 'Ausführung lesen':
files.extend(values['-FILES-'].split(';'))
language = 'jpn' if values['-jpn-'] else 'eng'
text = ''
for i in range(len(files)):
if not i == 0:
text += '================================================================================================\n'
text += scan_file_to_str(files[i], language)
if language == 'jpn':
text = text.replace(' ', '')
text += '\n\n'
window.FindElement('-OUTPUT-').Update(text)
sg.Popup('Hat vervollständigt')
window.close()
Lassen Sie mich zwei Bilder lesen
[Englisch 1. (aus The White House Building)]
[2. Englisch] ☟
【Ergebnis】
Ich denke, Englisch ist schnell zu lesen und ziemlich genau.
[Japanisch (von Aozora Bunko)]
☟
【Ergebnis】
Japanisch braucht Zeit. Trotzdem liegt die Genauigkeit auf einem Niveau, das brauchbar zu sein scheint.
Eigentlich wollte ich diese App zu einer ausführbaren Datei machen, die auf dem Desktop von Mac oder Windows funktioniert, aber weder pyinstaller noch py2app haben gut funktioniert, deshalb habe ich beschlossen, einen Artikel in diesem Zustand zu schreiben. Wenn ich das in Zukunft tun kann, werde ich es aktualisieren.
Wenn Sie Vorschläge, Meinungen oder Vorschläge wie "Ist das hier nicht anders?" Oder "Hier gibt es so etwas" haben, können Sie dies gerne im Kommentarbereich schreiben.
Recommended Posts