13 septembre 2012
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.
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 oeil humain). Dérivée de la peinture, l’utilisation de trois couleurs primaires (jaune, magenta, cyan) est répandue 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érencier 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.
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.
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 un seuil minimum pour la saturation et la valeur afin de s’assurer que ce n’est ni du gris, du blanc ou du noir.
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.
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.
Lors d’une démonstration, le robot a eu un comportement étrange lorsqu’il jouait côté bleu. Ce comportement était dû à 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
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 microcontrôleur toutes les figures qu’elle voyait, mais seulement celles dont le microcontrôleur avait besoin. Lorsque le microcontrô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 microcontrôleur avait choisi sa cible, il n’avait plus besoin que de la figure cible.
La caméra avait donc trois modes :
L’analyse de l’image complète en haute résolution mettait 0,8 seconde. C’est acceptable dans le mode choix de la figure, mais trop lent dans le mode suivi de la figure. Il est possible d’améliorer grandement ce temps de deux manières :
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 figure. Ce bout de code n’a pas été vraiment testé, ni utilisé.