Préambule et Objectifs
L’algo de vision est codé en C, il est utilisé directement dans le robot et ne possède aucune interface graphique.
Son fonctionnement est le suivant :
– récupérer une image depuis la caméra
– la traiter (analyse des objets, détection en fonction des couleurs recherchées)
– renvoyer une liste de tous les objets trouvés avec leurs caractéristiques : couleur, type d’objet détecté
Les objets détectés peuvent être :
– une quille debout (verte ou rouge)
– une quille couchée (verte ou rouge)
– une pile de quille (verte ou rouge)
– un objet vert ou rouge mais qui n’est rien de connu
– la position du pont (1,2,3,4)
– un objet vert ou rouge mais qui déborde de l’image (haut, bas, gauche, droite)
Plus de détails ici : La vision dans ses grandes lignes (2005)
Le but de ce projet est de créer une couche graphique permettant de visualiser les résultats de l’algo de vision.
Ainsi, le programme de détection est presque inchangé (on lui donne juste des variables qu’il remplit avec les données qu’on veut afficher : les images capturées et analysées et la liste des objets trouvés), mais une surcouche est branchée dessus pour fournir une interface visuelle.
Cette surcouche est codée en C, avec une librairie graphique (SDL, utilisant le principe du framebuffer).
L’interface utilisateur de la démo
En fait, la démo est assez simple, elle se lance par appel à un script "./launch.sh", depuis le dossier contenant le programme.
Ce script charge les modules nécéssaires à la vision (pwc et pwcx) puis lance l’analyseur, qui lance lui-même le visualisateur.
L’interface apparait alors !
En haut à gauche, l’image telle qu’elle arrive de la webcam.
En bas à gauche, l’image traitée par l’algo de vision : filtres d’amélioration du contraste, etc ... et surtout, contour des formes détectées. Les couleurs recherchées sont : vert, rouge, bleu. On peut donc avoir un contour autour de ces couleurs exclusivement.
En haut à droite : la zone de "MATCH". Affiche du code Apple II lorsqu’on n’a rien détecté (pour faire style !), et affiche un gros "MATCH" lorsqu’on a trouvé au moins une quille ou une pile.
En bas à droite : un tableau à 16 cases contenant tout ce que le programme peut trouver dans une image, dans l’ordre :
quille verte : debout, couchée
pile de quilles vertes
objet vert n’étant pas une quille
quille rouge : debout, couchée
pile de quilles rouges
objet rouge n’étant pas une quille
Les ponts : position 1 à 4
Les objets trouvés (peu importe la couleur : vert ou rouge ou bleu) mais qui débordent de l’image : haut, bas, gauche, droite.
Important
Si plusieurs objets identiques sont trouvés, un seul s’affiche. Exemple : si on a 3 quilles vertes debout, seule l’image de la quille verte debout va s’allumer, et rien d’autre.
les commandes
En raison de la conception du programme, il faut parfois appuyer assez "longuement" sur les touches pour activer la commande souhaitée.
A tout moment on peut appuyer sur "p" (pause) : cela fige TOUT l’écran pendant 10 secondes (y compris les images capturées). Après ce délai, tout reprend son cours comme avant, c’est à dire que si on était dans une phase de "MATCH", il continue à clignoter normalement.
ATTENTION : pendant cette phase, il est impossible de quitter le programme.
A tout moment on peut appuyer sur "q" (quitter) : cela quitte immédiatement le programme (sauf si on est en pause).
Lors d’une phase de "MATCH", si pour une raison quelconque (par exemple en manipulant les quilles devant la caméra), ce qui a été détecté n’est pas bon, on peut interrompre cette phase en appuyant sur la barre espace. Cela permet d’éviter d’attendre la fin de la séquence (environ 6 secondes). Une nouvelle analyse a alors lieu. Si celle-ci est aussi mauvaise, on peut appuyer à nouveau sur espace, et ainsi de suite !
Principe général de fonctionnement
Le code utilise les threads (multi-processing).
Ainsi, l’algo de vision est un processus qui fournit :
– l’image capturée
– l’image traitée (contours détectés affichés)
– la liste des objets détectés et leur nombre.
Le processus de visualisation :
– affiche l’interface graphique
– est en attente d’événements (clavier, souris) pour quitter ou stopper temporairement l’affichage
– est en attente de réception de données de la part de l’algo de vision
Dès qu’il reçoit des images, il les affiche à l’écran.
Dès qu’il reçoit une liste d’objets, il allume toutes les vignettes associées aux objets détectés et crée un nouveau processus qui fait clignoter un "MATCH" sur l’écran s’il détermine si quelque chose d’intéressant a été détecté (quille ou pile).
Tant que ce dernier processus n’est pas terminé (affichage clignotant du match pendant un temps donné) plus aucune image traitée n’est affichée et le processus d’affichage se contente d’afficher ce qui est reçu depuis la caméra (image brute).
Cela permet de bien voir ce qui a été détecté sur l’image analysée (qui reste figée) grace aux images miniatures qui montrent le résultat de l’analyse.
Lorsque l’affichage du "MATCH" se termine, le programme reprend son cours normal : affichage des images capturées et de l’image traitée, jusqu’à avoir détecté un nouvel objet détecté, et donc une nouvelle séquence de "MATCH".
Tant qu’on n’est pas dans une séquence de "MATCH", un autre thread tourne en boucle et fait défiler du code Apple II dans la zone de match. Ce thread est arrêté dès qu’un "MATCH" démarre, et se relance dès que la séquence se termine. "Ca ne sert à rien mais ca fait plus zoli" ( (c) Thierry, et merci pour le code Apple II !)
Le programme affiche jusqu’à 3 images capturées/analysées par seconde sur un P3 650Mhz.
Pour fonctionner, ce programme nécessite un support des modules "pwc" et "pwcx" pour la gestion de la webcam.
Quelques explications le fonctionnement interne
Au démarrage, l’analyseur se lance en premier et crée un thread, celui de la vision (affichage de l’écran).
Le thread de vision (le "visualisateur") crée immédiatement un troisième thread : celui qui fait défiler du code dans la fenêtre de match. Ainsi le visualisateur partage l’écran avec le "scrolleur".
Les 3 programmes tournent en parallèle mais l’analyseur et le visualisateur partagent une zone mémoire contenant les images (capturée et analysée) et le résultat de freeman (liste des objets trouvés, leurs caractéristiques et leur discrimination : quille, pile ...).
Le visualisateur attend que l’analyseur lui dise qu’il a une image qui est analysée et peut être affichée.
Donc, lorsque l’analyseur a fini de capturer et d’analyser une image, il lance un signal au visualisateur. Ce dernier affiche les 2 images à l’écran, et teste si une quille ou une pile a été détectée.
Si non, il se remet à attendre le signal de la part de l’analyseur, pour tester et afficher la prochaine image.
Si oui, il "tue" le thread "scrolleur" et crée un thread pour faire clignoter le "MATCH".
Pendant tout le temps où ce thread vit, le visualisateur se contente de récupérer les images webcam (uniquement) de l’analyseur et les afficher.
Dès que le thread "MATCH" se termine, le visualisateur lance un nouveau scrolleur et se remet à attendre le signal de l’analyseur.
Et ainsi de suite !
Remarque : pour gérer l’interface utilisateur (notamment pour quitter le programme), le visualisateur doit en fait tester si un événement (clic, appui sur une touche) est intervenu. Il n’attend donc pas indéfiniment que l’analyseur lui donne une image, mais s’interrompt au bout d’un certain temps pour tester les événements utilisateur, les prendre en compte le cas échéant, et se remettre en attente du signal de l’analyseur.
Vos commentaires
# Le 8 mars 2008 à 21:02, par sylv En réponse à : Interface de démo Vision
Bonjour !
bravo pour le projet !
Je suis très intéréssé par votre projet et j’ai lu les pages qui concernent les programmes de vision. Malheureusement, je n’ai pas trouvé les sources du programme que vous présentés dans cet article.
Pourriez-vous m’ en indiquer le chemin ?
# Le 11 mars 2008 à 20:57, par Thomas C. En réponse à : Interface de démo Vision
Bonjour et merci pour ces commentaires élogieux !
En ce qui concerne le programme de vision, il a été développé en 2005 (déjà !) et sous une distribution Linux qui était déjà obsolète à l’époque (Redhat 7.3). J’ajoute qu’il a fallu lui adjoindre un module pour la webcam (pwc), lequel n’est plus maintenu ni disponible depuis bien longtemps.
Tout cela pour dire que les sources sont actuellement inutilisables car impossible à compiler...
J’ai toujours en projet (et à la demande de nombreuses personnes, ne serait-ce que pour des vocations pédagogiques pour le club) d’en faire un portage Windows, ou, (plus simple ?), une adaptation sur un linux récent.
Quoi qu’il en soit, et si ca peut aider et au risque de me répéter par rapport aux articles, le code en lui même se compose de :
* un module d’affichage démo, réalisé en C++ et en utilisant la lib SDL (très simple, j’ai appris à m’en servir sur ce projet)
* un module de détection de forme qui est tout simplement l’implémentation de l’algorithme publique de freeman (lien dispo sur le site)
* tout un tas de filtres pour convertir du RVB vers HSV et autres releveurs de contraste, simple dans l’absolu et publiques également
* enfin, tout un système assez compliqué de critères de sélection autour des résultats fournis par freeman, qui ne sont complexes que par les valeurs à donner à chaque seuil, lesquelles sont complètement dépendantes de la position de la caméra sur le robot (cf "la vision dans ses grandes lignes").
Voilà, j’espère avoir répondu au mieux, et dans l’attente de sources complètes, propres, documentées et opérationnelles, bon courage !
# Le 9 août 2009 à 10:46, par ? En réponse à : Interface de démo Vision
Bonjour,
Il semble que vous n’ayez toujours pas eu le temps de "nettoyer" les sources
Ne serait-il pas possible de voir l’ancienne version, même si elles ne compilent plus, peut-être que d’autres personnes auront le temps ? Ou peut-être que certaines parties peuvent quand même servir.
Effectivement les explications des articles permettent d’envisager de tout refaire à partir de 0, mais c’est parfois pas mal de voir un code existant !
Merci d’avance
Répondre à ce message