Je me suis demandé si je pouvais facilement créer une application OCR qui démarre sur le bureau, alors je l'ai créée.
・ MacOS Catalina 10.15.4 ・ Code Visual Studio ・ Python3.8.1
pip install pysimplegui
2. Tesseract OCR(OCR)
brew install tesseract
sudo pip3 install pyocr
sudo pip3 install pillow
● Quelles sont ces bibliothèques? Y compris cela, j'ai beaucoup fait référence aux sites suivants pour l'OCR (merci). Essayez l'OCR simple avec Tesseract + PyOCR
● Cela peut être plus facile à comprendre pour les utilisateurs Windows. [Python] Comment transcrire une image et la convertir en texte (tesseract-OCR, pyocr)
Voyons maintenant comment écrire le code pour lire les caractères de l'image (l'importation de la bibliothèque est incluse dans le code source final, donc je l'omettrai ici).
def scan_file_to_str(file_path, langage):
"""read_file_to_str
Générer une chaîne à partir d'un fichier image
Args:
file_path(str):Chemin du fichier à lire
langage(str): 'jpn'Ou'eng'
Returns:
Lire la chaîne de caractères
"""
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(
#Ouvrez le fichier envoyé en argument
Image.open(file_path),
#Spécifiez la langue envoyée comme argument('jpn'Ou'eng')
lang=langage,
builder=pyocr.builders.TextBuilder(tesseract_layout=6)
)
#Renvoie enfin la chaîne de caractères lue depuis l'image
return text
Il est vraiment surprenant que vous puissiez lire une chaîne de caractères à partir d'une image en seulement 15 lignes. Je ai été impressionné.
Ensuite, je mettrai ceci sur l'interface graphique. Je pense que tkinter est célèbre en ce qui concerne l'interface graphique Python. J'écrivais du code en utilisant tkinter au début, mais lorsque je faisais la recherche, je suis tombé sur l'article suivant.
[Si vous utilisez Tkinter, essayez d'utiliser PySimpleGUI](https://qiita.com/dario_okazaki/items/656de21cab5c81cabe59#exe%E5%8C%96%E3%81%AB%E3%81%A4 % E3% 81% 84% E3% 81% A6)
J'ai également été impressionné par le fait que l'interface graphique pouvait être implémentée avec un code simple, j'ai donc décidé de l'utiliser.
Voici le code de la partie GUI.
#Définir le thème(Il existe de nombreux thèmes)
sg.theme('Light Grey1')
#Où et quoi placer(Je pense que ce sera plus facile à assembler si vous savez qu'il est organisé en unités de lignes.)
layout = [
#La première ligne(Text:Mettez le texte)
[sg.Text('Fichier à lire(Plusieurs sélections possibles)', font=('IPA gothique', 16))],
#2e ligne(InputText:Zone de texte, FilesBrowse:Boîte de dialogue de fichier)
[sg.InputText(font=('IPA gothique', 14), size=(70, 10),), sg.FilesBrowse('Sélectionnez les fichiers', key='-FILES-'),],
#3e ligne(Text:texte, Radio:Bouton radio x 2)
[sg.Text('Langue à lire', font=('IPA gothique', 16)),
sg.Radio('Japonais', 1, key='-jpn-', font=('IPA gothique', 10)),
sg.Radio('Anglais', 1, key='-eng-', font=('IPA gothique', 10))],
#4ème ligne(Button:bouton)
[sg.Button('Lire l'exécution'),],
#5ème ligne(MLine:100 colonnes x 30 lignes textarea)
[sg.MLine(font=('IPA gothique', 14), size=(100,30), key='-OUTPUT-'),]
]
#Obtenir la fenêtre(L'argument de Window est "Title, Layout")
window = sg.Window('OCR facile', layout)
#Liste pour mettre le fichier lu
files = []
#Maintenant, tournez la boucle infinie et attendez les événements tels que les clics de bouton.
while True:
event, values = window.read()
#Aucun est le bouton "✕" dans la fenêtre. Lorsque vous appuyez sur ce bouton, il sort de la boucle et ferme la fenêtre.
if event == None:
break
# 'Lire l'exécution'Lorsque le bouton est enfoncé
if event == 'Lire l'exécution':
# key='-FILES-'La valeur de InputText spécifiée dans';'Obtenez une liste de noms de fichiers séparés par
files.extend(values['-FILES-'].split(';'))
#Valeurs des boutons radio['-jpn-']Alors la langue est'jpn',Autrement'eng'
language = 'jpn' if values['-jpn-'] else 'eng'
text = ''
#Boucle par le nombre de fichiers
for i in range(len(files)):
if not i == 0:
#Il y a un délimiteur pour chaque fichier
text += '================================================================================================\n'
#Le scan défini précédemment ici_file_to_Recevoir la chaîne de lecture avec la méthode str
text += scan_file_to_str(files[i], language)
if language == 'jpn':
#Dans le cas des chaînes de caractères japonais, il y avait beaucoup d'espace supplémentaire, donc je l'ai supprimé.
text = text.replace(' ', '')
#Laissez deux lignes à part la chaîne dans le fichier suivant
text += '\n\n'
#Lire les données(=text)Clé='-OUTPUT-'Affichage sur la MLine spécifiée dans
window.FindElement('-OUTPUT-').Update(text)
#Une fenêtre pop-up vous informera de la fin
sg.Popup('A completé')
window.close()
En ce qui concerne l'interface graphique, il y a d'autres choses auxquelles j'ai beaucoup fait référence, donc je les posterai.
・ Notes d'apprentissage pour le séminaire K-TechLabo → Le texte PDF est très simple à comprendre.
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
Générer une chaîne à partir d'un fichier image
Args:
file_path(str):Chemin du fichier à lire
langage(str): 'jpn'Ou'eng'
Returns:
Lire la chaîne de caractères
"""
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
#Définir le thème
sg.theme('Light Grey1')
layout = [
#La première ligne
[sg.Text('Fichier à lire(Plusieurs sélections possibles)', font=('IPA gothique', 16))],
#2e ligne
[sg.InputText(font=('IPA gothique', 14), size=(70, 10),), sg.FilesBrowse('Sélectionnez les fichiers', key='-FILES-'),],
#3e ligne
[sg.Text('Langue à lire', font=('IPA gothique', 16)),
sg.Radio('Japonais', 1, key='-jpn-', font=('IPA gothique', 10)),
sg.Radio('Anglais', 1, key='-eng-', font=('IPA gothique', 10))],
#4ème ligne
[sg.Button('Lire l'exécution'),],
#5ème ligne
[sg.MLine(font=('IPA gothique', 14), size=(100,30), key='-OUTPUT-'),]
]
#Obtenir la fenêtre
window = sg.Window('OCR facile', layout)
files = []
a = 0
while True:
event, values = window.read()
if event == None:
break
if event == 'Lire l'exécution':
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('A completé')
window.close()
Laisse-moi lire deux images
[Anglais 1er (tiré du Bâtiment de la Maison Blanche)]
[2e anglais] ☟
【résultat】
Je pense que l'anglais est rapide à lire et assez précis.
[Japonais (d'Aozora Bunko)]
☟
【résultat】
Le japonais prend du temps. Pourtant, la précision est à un niveau qui semble utilisable.
En fait, je voulais faire de cette application un fichier exécutable qui fonctionne sur le bureau de Mac ou Windows, mais ni pyinstaller ni py2app ne fonctionnaient bien, j'ai donc décidé d'écrire un article dans cet état. Si je peux le faire à l'avenir, je le mettrai à jour.
Aussi, si vous avez des suggestions, des opinions ou des suggestions telles que "N'est-ce pas différent ici?" Ou "Il existe un tel moyen ici", n'hésitez pas à écrire dans la section des commentaires.
Recommended Posts