• Aucun résultat trouvé

B. Reconnaissance du contour

B.1 Acquisition des images et stockage provisoire

La première étape va être de mettre en mémoire un buffermcontenant toutes les informations de l’image arrivée sur la carte d’acquisition.

B.1.1 Le principe

La carte d’acquisition reçoit en permanence des images depuis la caméra à une fréquence de 25 images par seconde (caméra analogique) ou 30 images par seconde (caméra digitale) ; on va envoyer des instructions à la carte de sorte que la prochaine image reçue soit mise dans la mémoire de l’ordinateur sous forme de «buffer». B.1.2 Implémentation et optimisation

Nous allons voir ici le fonctionnement global du programme de reconnaissance de contours représenté sur la fig. II.23. Le détail de l’algorithme de reconnaissance de contour sera donné plus loin au § B.2.2 p. 99. Nous emploierons le terme de processus pour désigner les morceaux de programme exécutés de manière simultanée (cela correspond à la dénomination anglaise thread). Afin de permettre autant que possible une acquisition en temps réel, nous donnons à ces processus un niveau de priorité élevé, par rapport à l’ensemble des processus en cours d’exécution sur l’ordinateur. Nous parlerons d’image et de contour, mais cela correspond à chaque fois à des types

m. On prendra ici la terminologie anglosaxone. Il s’agit d’une succession de cases mémoire conti-guës contenant chacune le niveau de gris d’un pixel. Ainsi tous les pixel d’une ligne se trouvent rangés dans l’ordre, et les lignes se suivent dans l’ordre de leur numérotation.

Processus d’analyse de contour

Processus d’acquisition d’image

Acquisition d’une image en mémoire Initialisation de la série Terminaison Envoi de l'image en mémoire Acquisition de l'image terminée ? Non Oui Procesus Principal Lecture des paramètres pour la série d’images Initialisation

Initialisation 1 image dans la pile

Oui Non Récupérer une

image acquise

Mettre l’image sur la pile Nombre d’images à traiter atteint ? Terminaison Oui Non Image n Image n-1 Image n-2 Image n-3 Image n-4 Image n-5 Image n-6 Analyse du contour Sauvegarde du contour Envoi du contour pour affichage Terminaison 1 contour dans la pile Contour n-7 Contour n-8 Contour n-9 Contour n-10 Contour n-11 Contour n-12 Contour n-13 Affichage du contour Oui Non Acquisition d’une image en mémoire

Fig. II.23 – Schéma de l’implémentation de l’algorithme de reconnaissance de contour. Chaque colonne représente un processus (thread) tandis que les cadres grisés représentent les trois processus (process qui comportent chacun plusieurs threads). L’explication de l’algorithme à partir du schéma est l’objet du § B.1.2.

B. Reconnaissance du contour

de donnée spécifiques contenant non seulement l’image ou le contour, mais aussi les paramètres de taille, divers paramètres techniques et l’instant de l’acquisition. Le processus principal Lorsque l’utilisateur débute la reconnaissance de contour, il doit spécifier un certain nombre de paramètres : la région de reconnaissance, un point proche du centre de la vésicule, le nombre d’images à traiter, les paramètres de l’algorithme (voir § B.2.2 p. 99), le nom du fichier de sauvegarde. Une étape d’ini-tialisation est faite et est provoquée dans chacun des deux autres processus. Ensuite une boucle va répéter le nombre de fois prescrit, une requête d’image faite au pro-cessus d’acquisition d’image. Lorsque ce propro-cessus a acquis une image, il la transmet au processus principal qui attend cette image. Ce dernier met l’image sur une pile et refait une requête d’image (si le nombre d’images à traiter n’est pas atteint). Dans le cas où le nombre d’images à traiter est atteint, les instructions pour terminer la série sont exécutées, et provoquées dans chacun des deux autres processus.

Nous avons utilisé une spécificité de Windows afin de créer une pile d’images à traiter. En effet, chaque processus a une file d’attente de messages (entrée au cla-vier, mouvement de souris, activation de fenêtre, etc. . . ) à traiter. Le programme définit la procédure à exécuter en fonction du message. Nous avons défini un mes-sage spécifique «image», et nous envoyons ainsi les images au processus d’analyse de contour. Celui-ci constitue une pile d’images à traiter dont la taille (128 Mo pris dans la mémoire vive) peut absorber un léger retard de l’analyse à un moment donné (par exemple sur un contour en particulier, plus difficile à reconnaître) ; retard qui est rattrapé par la suite sur des contours plus faciles à traiter.

Par ailleurs, le processus d’analyse de contour envoie un message «contour» pé-riodiquement (au choix de l’utilisateur pour chaque image analysée ou toutes les n images) dans la file des messages. Ainsi en parallèle de l’acquisition, ce processus, lorsqu’un message «contour» est reçu, affiche le contour calculé sur l’image acquise afin de permettre la vérification de la qualité de la reconnaissance.

Le processus d’acquisition d’image Ce processus, une fois initialisé, va acquérir les images en devançant la requête du processus principal. Ainsi lorsqu’il reçoit une requête, il vérifie qu’il a fini d’acquérir l’image qu’il était en train d’acquérir, sinon il attend d’avoir fini, puis envoie cette image et recommence l’acquisition d’une image en prévision d’une nouvelle requête.

Le processus d’analyse de contours Ce processus doit d’abord être initia-lisé lors de l’initialisation générale, afin de recevoir les différents paramètres (voir § B.2.2 p. 99). Ensuite dès qu’une image se trouve dans la pile (donc dès que le processus reçoit un message «image»), il entame l’analyse du contour de la manière indiquée dans le § B.2.2 p. 99. Le contour est ensuite sauvegardé (on a, en fait, la possibilité de sauvegarder un contour tous les n contours), et ensuite un message «contour» est envoyé au processus principal, et se rajoute donc sur la pile. Une procédure de fin est exécutée après la série de contours sur requête du processus principal.

Synchronisation des processus Le point important à noter est la construction de ce programme en trois processus, ce qui permet de tirer pleinement partie des deux processeurs de l’ordinateurs (ainsi que de la capacité multitâche des proces-seursn). En effet, le traitement en temps réel nécessite que l’acquisition se fasse en permanence (puisqu’il n’y a pas de pause entre les images), et par ailleurs, il est nécessaire de trouver le contour au fur et à mesure de l’acquisition des images pour limiter le nombre d’images stockées dans la pile.

L’utilisation des piles -en fait la file d’attente des messages du processus- permet de donner un maximum de souplesse et d’indépendance à ces processus. Ainsi nous pouvons laisser fonctionner de manière autonome les processus ; c’est la solution que nous avons adoptée préférentiellement. On peut aussi décider de resynchroniser le processus principal et celui d’analyse (en vidant la pile des images) périodique-ment ; ceci évite en effet de saturer la pile et de provoquer une erreur et donc une interruption de l’acquisition. Enfin il est possible de synchroniser complètement les deux processus (pas d’envoi d’une image à analyser tant qu’il en reste une en cours d’analyse) ; cependant une telle synchronisation a peu d’intérêt car elle ne permet plus l’acquisition en temps réel.