Projets:Read For Me/OCRScan
Cette page présente les développement réalisé sur le projet OCRScan lors du Fabrikarium 2020 pour le Projet Read For Me.
Les versions suivantes étant basées sur PiTextReader, cette documentation est laissée ici pour achive mais est obsolète par rapport au projet Read For Me.
Développements logiciels à partir de la machine à lire AccessDVLinux
Les sources logicielles sont disponibles sur un dépot git hébergé sur le compte github de MHK : ReadForMe
Principe de fonctionnement
Le script principal est le script python Main.py qui permet de faire l'interface entre les commandes connectées au raspberry pi, le script d'aquisition OCRSCan et le lecteur d'écran Orca.
Schéma: Schéma de principe du dispositif
Main.py
Main.py fait appel à plusieurs modules python dont les fonctionnalités sont :
- constantes.py : définition des ports GPIO utilisés pour les boutons et les encodeurs
- buttons.py : définition des actions des boutons poussoirs
- encoder.py : définition de l'objet RotatyEncoder permettant de lire les encodeurs et définition des actions des encodeurs rotatifs
- send_shortcuts.py : émulation des raccourcis clavier (avec xdotool) permettant de contrôler orca
Gestion de l'alimentation
Testé et fonctionnel
Les Raspberry Pi n'ont pas de bouton pour les allumer et les éteindre. Il faut donc le définir nous même à partir des GPIO. La broche GPIO 3 permet de démarrer le raspberry pi quand elle est reliée à la masse.
Le bouton poussoir relié à cette broche a donc deux effets :
- démarrer le raspberry pi lorsqu'il est éteint en utilisant le fait que cette broche est déjà programmé pour réaliser cette action
- éteindre le raspberry pi (c'est à dire arréter proprement le système d'exploitation raspbian) à l'aide d'une action définie en python et exécutée à l'aide du module subprocess
Gestion des boutons
Testé et fonctionnel
La lecture de l'état des boutons et l'exécution des actions qui leur sont liées sont gérées avec la bibliothèque gpiozero. Celle-ci permet en particulier de gérer le processus à l'aide d'événements non bloquants, dont la programmation est détaillée ci-après en prenant l'exemple du bouton d'alimentation.
from gpiozero import Button from subprocess import run # définition des actions à effectuer (= événement, dans buttons.py) def alim_event(): print("alim button pressed") run(['sudo','shutdown','now']) # définition des broches utilisées (dans constantes.py) GPIO_ALIM = 3 # liaison entre le bouton et l'action (dans Main.py) button_alim = Button(GPIO_ALIM) button_alim.when_pressed = alim_event
Gestion des encodeurs rotatifs
Testé et fonctionnel
L'objet RotatyEncoder, définit dans encoder.py, permet de la même manière de relier les encodeurs à un événement, qui est également défini sous forme de fonction qui prend cette fois-ci un argument qui permet de savoir si l'encodeur est tourné dans un sens ou dans l'autre.
from encoder import RotaryEncoder from send_shortcuts import send_shortcut # événement attaché à l'encodeur (dans encoder.py) switch_debit = False def debit_event(val): global switch_debit switch_debit = not switch_debit if switch_debit: if val<0: # encodeur dans le sens inverse des aiguilles d'une montre print("débit down") send_shortcut('KP_Insert+Shift_L+KP_Page_Down') else: # encodeur dans le sens des aiguilles d'une montre print("débit up") send_shortcut('KP_Insert+Shift_L+KP_Page_Up') # définition des broches utilisées (dans constantes.py) CLK_DEBIT = 24 #for debit encoder DT_DEBIT = 25 #for volume encoder # liaison entre l'encodeur et l'action (dans Main.py) debit_encoder = RotaryEncoder(DT_DEBIT, CLK_DEBIT, True) debit_encoder.when_rotated = debit_event
Photo: Prototypage du câblage des boutons sur breadboard
Action des raccourcis clavier sur orca
Non testé
Le seul moyen de contrôler le lecteur orca en direct est l'utilisation de raccourci clavier. Ceux-ci sont émulés à l'aide de l'utilitaire xdotool. C'est la méthode utilisée pour la version scanner d'OCRSCan.
Si le déclenchement d'action du clavier à partir de python par l'intermédiaire d' xdotool semble fonctionnel, nous n'avons pas pu tester son intégration avec orca lors de la lecture du document.
Execution d'OCRSCan
partiellement fonctionnel
Le bouton capture lance l'exécution lOCRSCan. Il s'agit d'un script bash qui va exécuter successivement les tâches suivantes (détaillee dans les parties suivantes):
- arrêt de orca
- prise de vue et traitement de l'image
- "ocrisation"
- lancement de orca
- ouverture du fichier texte avec mousepad
Prise de vue avec autofocus
Testé et fonctionnel
Avec l'objectif de pouvoir réaliser une version portable, l'utilisation d'une picamera avec un autofocus a été testé. Le script utilisé est issue de la documentation d'Arducam : Motorized_Focus_Camera. Il nécessite d'activer la communication i2c à l'aide du script fourni enable_i2c_vc.sh.
Le script Aquisition_scan.py est un copier/coller du script Autofocus.py de l'exemple cité plus haut ou seul la destination de l'image obtenue est changée.
Détection de la feuille et redressement de l'image
partiellement fonctionnel
Le script scan_main.py sert à détecter une page dans la photo prise à l'étape précedante, puis à corriger la perpective pour remettre la page à plat. En effet, le logiciel d'OCR tesseract admet de léger défauts de perspective mais la tolérance peut être bien plus grande si l'on est capable de redresser la page avec d'autres outils en amont.
Le script utilise du code issue du blog pyimagesearch
Malheureusement, il semble fonctionner dans des conditions assez précises qui ne permettent pas son utilisation "à mains levées" par une personne mal voyante. Il faut par exemple que les 4 coins de la pages soient bien cadrées, et il est relativement sensible à l'éclairage.
OCRisation avec tesseract
Testé et fonctionnel