Club robotique de Sophia-Antipolis

Accueil > Projets, études > Etudes techniques > Vision > Image et vision par la pratique > Reconnaissance d’image avec une CMUcam 3 (2011)

Reconnaissance d’image avec une CMUcam 3 (2011)

Repérer 3 couleurs, gagner en fiabilité et mieux utiliser la mémoire.

samedi 27 août 2011, par Keuronde

En 2011, la Coupe de France de Robotique proposait un règlement où il fallait déposer des pions jaunes sur des cases bleues ou rouges, suivant la couleur de la case de départ du robot. Un terrain de jeu intéressant pour une CMUcam. C’est le choix de Keuronde, de l’équipe Poivron, qui présente sa mise en oeuvre.

Pour éviter les problèmes d’éclairage, une LED blanche 3W éclaire le terrain devant la caméra.

Montée sur le robot, la CMUCam 3 avait pour rôle de repérer des pions jaunes de 20 cm de diamètre. Ces pions étaient les seuls éléments jaunes sur la table. La CMUCam servait aussi à repérer des cases carrées bleues ou rouges de 35 cm de côté.

La CMUCam était fixée sous le support de balise et orientée vers la table pour disposer d’un champ de vision satisfaisant, allant de l’avant du robot jusqu’à un mètre devant le robot.

CMUCam sous le support balise

Reconnaissance des couleurs

L’image est récupérée ligne par ligne. Pour chaque pixel, les trois composantes (rouge, vert et bleu) sont reçues, avec pour chacune d’entre elle des valeurs comprises entre 0 et 255. Pour reconnaître du rouge, cette décomposition en couleurs est efficace ; elle l’est moins pour les autres. Le rouge vu par la CMUcam est très prononcé. Pour cette couleur, les rapports des composantes rouge/vert et rouge/bleu sont très élevés. La caméra perçoit moins facilement le bleu et le vert, faisant apparaître ces couleurs plus sombres et moins saturées.

Un espace de couleurs (ou espace colorimétrique) est un moyen d’associer des coordonnées à une couleur. Une même couleur aura des coordonnées différentes en fonction de l’espace de couleur utilisé. Pour l’affichage sur écran, on se sert généralement d’un système à trois composantes : rouge, vert, bleu (une surface blanche éclairée par ces trois couleurs apparaîtra blanche à un œil humain). Dérivée de la peinture, l’utilisation de trois couleur primaire : jaune, magenta, cyan est répandu dans l’impression (le système est parfois complété par du noir).

L’utilisation d’un espace de couleurs de type Teinte – Saturation – Valeur permet d’utiliser des critères simples pour différentier une couleur d’une autre.

Dans ce modèle, la teinte nous donne la couleur sur le cercle rouge – jaune – vert – bleu – violet. La valeur donne une idée de la luminosité de la couleur tandis que la saturation indique où se trouve la couleur entre le gris et la couleur vive pondéré par sa luminosité.

Si la valeur est à 0 (minimum), la couleur sera noire, quelque soit sa saturation. Si la valeur est au maximum, la saturation fera varier la couleur du blanc à la couleur vive.

Axe de la saturation
Axe de la saturation dans le modèle Teinte - Saturation - Valeur
Axe de la valeur
Axe de la valeur dans le modèle Teinte - Saturation - Valeur

On trouve assez facilement n’importe quelle couleur (rouge, jaune, vert, bleu, violet...) en vérifiant que la teinte se situe dans un intervalle donné. Il faut aussi fixer des seuils minimaux pour la saturation et la valeur afin d’éliminer le gris, le blanc ou le noir.

Seuil sur valeur
Imposer une valeur minimale permet de s’assurer que la couleur repérée n’est pas du noir.
Seuil sur saturation
Imposer une saturation minimale permet de s’assurer que la couleur repérée n’est ni du gris, ni du blanc.
Seuil sur la saturation et sur la valeur
On obtient ainsi les couleurs qui nous intéressent.

Reconnaissance des zones

L’image est parcourue ligne par ligne. Sur chaque ligne, les pixels consécutifs de même couleur sont regroupés sous forme de segments. Chaque segment contient la position du pixel de gauche et du pixel de droite. Chaque segment contient aussi un lien vers la figure à laquelle il appartient. Lorsqu’un segment est créé, il n’appartient à aucune figure.

Reconnaissance d’un segment
Identification d’un segment lors de l’analyse d’une ligne de l’image

Lorsque l’analyse d’une ligne est terminée, les segments sont reliés aux figures. Pour cela, chaque segment est comparé aux segments de la ligne du dessus. Si deux segments sont en contact, celui de la ligne actuelle est rattaché à la figure à laquelle appartient celui de la ligne du dessus. Les dimensions de la figure sont actualisées (figure 1). Si le segment de la ligne actuelle n’est en contact avec aucun segment de la ligne précédente, une nouvelle figure est créée (figure 2). Il est alors liée à celle-ci.

Rattachement des segments aux figures
Une fois les segments repérés, ils sont rapprochés aux segments de la ligne précédente et rattachés à la même figure que ceux-ci

Limites de l’algorithme

Lors d’une démonstration, le robot a eu un comportement étrange lorsqu’il jouait coté bleu. Ce comportement était du à l’algorithme de la CMUcam, le robot fusionnait toutes les cases bleues pour n’en voir qu’une seule grande case occupant tout l’écran.
Ceci peut s’expliquer si le pixel qui est à l’intersection des cases de l’échiquier est vu comme étant de la couleur recherchée. Il n’y a, alors, plus qu’une seule zone de couleur. Pour éviter ce genre de désagrément, il est certainement préférable de travailler avec un autre algorithme lors de la détection de cases sur un échiquier (ou tout cas similaire).
Bien qu’il soit gourmand en mémoire, l’algorithme décrit dans cet article devrait faire l’affaire Reconnaissance d’image avec une CMUcam 3 (2010)

Interface

Cette année, on voulait une caméra plus efficace, plus docile, voyant loin et traitant les images rapidement.

La caméra ne devait pas renvoyer systématiquement vers le micro-contrôleur toutes les figures qu’elle voyait, mais seulement celles dont le micro-contrôleur avait besoin. Lorsque le micro-contrôleur cherchait sa cible, il fallait qu’il puisse indiquer la couleur recherchée puis choisir une figure parmi toutes les figures que la caméra voyait. Une fois que le micro-contrôleur avait choisi sa cible, il n’avait plus besoin que de la figure cible.

La caméra avait donc trois modes :
 Attente de la couleur : la caméra ne fait rien à part attendre la couleur recherchée. Dans notre cas, ’B’ pour bleu, ’R’ pour rouge et ’P’ pour pion (jaune). Dès réception de la couleur, la caméra analyse une image et envoie la première figure au micro-contrôleur.
 Choix de la figure : la caméra a envoyé une première figure sous la forme suivante : g x0 y0 x1 y1 id. ’g’ signifie que la recherche s’est effectuée sur toute l’image et que la caméra n’est pas en train de cibler une figure particulière. ’id’ est le nombre à renvoyer à la caméra pour lui demander de suivre cette figure. Le micro-contrôleur peut envoyer le caractère espace pour obtenir la figure suivante qui sera envoyée sous la même forme. Lorsque la caméra n’a plus de figures à envoyer, elle envoie une figure dont les champs x0, y0, x1, y1 et id sont à 0. À tout moment, le micro-contrôleur peut envoyer l’identifiant de la figure qu’il souhaite suivre ou le caractère ’/’ pour demander à la caméra d’effectuer une nouvelle recherche
 Suivi de la figure : lorsque la caméra reçoit un identifiant de figure, elle calcule les coordonnées du centre de la figure. Elle analyse ensuite toutes les images en renvoyant au micro-contrôleur la plus grosse figure contenant le point milieu de la figure précédemment envoyée.

Suivi de la forme grâce à son point central
une fois une forme choisie, toutes les autre formes qui ne contiennent pas ce point central sont ignorées.

Les améliorations attendues

L’analyse de l’image complète en haute résolution mettait 0,8 seconde. C’est acceptable dans le mode choix de la forme, mais trop lent dans le mode suivi de la forme.

Il est possible d’améliorer grandement ce temps de deux manières :
 En baissant la résolution, un moyen très efficace lorsque l’objet se trouve près de la caméra.
 En n’analysant qu’une partie de l’image autour de la position de l’ancienne forme.

Pour ces améliorations, la CMUcam propose des fonctions adaptées. Faute de temps, nous n’avons pas pu les utiliser. Ayant renoncé à voir des objets lointains, la caméra était utilisée en basse résolution, en ne traitant qu’un pixel sur 2. De cette manière, nous avons obtenu une image toutes les 80 millisecondes.

Le code proposait aussi de détecter la couleur autour de la forme. Ce bout de code n’a pas été vraiment testé, ni utilisé.

Un message, un commentaire ?

modération a priori

Attention, votre message n’apparaîtra qu’après avoir été relu et approuvé.

Qui êtes-vous ?

Pour afficher votre trombine avec votre message, enregistrez-la d’abord sur gravatar.com (gratuit et indolore) et n’oubliez pas d’indiquer votre adresse e-mail ici.

Ajoutez votre commentaire ici

Ce champ accepte les raccourcis SPIP {{gras}} {italique} -*liste [texte->url] <quote> <code> et le code HTML <q> <del> <ins>. Pour créer des paragraphes, laissez simplement des lignes vides.