Différences entre versions de « Projets:Read For Me/OCRScan »

De wikilab
(Created page with "===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...")
 
 
Ligne 1 : Ligne 1 :
 +
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===
 
===Développements logiciels à partir de la machine à lire AccessDVLinux===
  

Version actuelle datée du 20 octobre 2021 à 15:11

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 Schéma: Schéma de principe du dispositif

File:RFM_principe_export.svg


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


Prototypage du câblage des boutons sur breadboard 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