Banniere
Bonjour visiteur!
Rechercher

Les dernières News
Derniers articles
Liens intéressants
Publicité
Article de la catégorie informatique

Mindstorm: Reconnaissance des couleurs

Introduction


Notre projet d'Intelligence Artificielle est la création de robots joueurs de foot autonome. On utilise des webcam connectées à un ordinateur ainsi qu'une connexion bluetooth pour l'échange des données entre le robot et le PC( le PC étant la machine sur lequel est exécuté le programme). La webcam est l'oeil du joueur de foot. Grâce à un découpage en plusieurs zones ( qu'on appellera région) de l'image capturée par la webcam, on peut savoir où se situe la balle.

Problème rencontré


On dispose de fonctions pour connaître les quantités de couleurs Rouge, Verte et Bleue. Cependant, il est difficile d'en obtenir quoi que ce soit tel quel car la fonction colorDetected ne fonctionne que si la couleur précisément demandée est détectée ( la couleur demandée est en hexadécimale sous la forme RRGGBB).

Solution



Détection plus fine des couleurs grâce à une conversion en TSV


La conversion en TSV(Teinte Saturation Valeur) permet de séparer la teinte, la luminosité, ainsi que son intensité.
Algorithme:




Utilisation d'un intervalle de couleurs


Plutôt que d'utiliser une valeur fixe de couleur pour la détection d'un objet, on va utiliser un intervalle de couleurs dans lequel doit se trouver l'objet(La couleur de l'objet dépendant de la luminosité), donc une fonction de tolérance.

Algorithme:

fonction intervalleCouleur(entier: region, couleurDetectee, couleurMin, couleurMax)

Si couleurMin<couleurMax Alors
retourner (couleurMin <=couleurDetectee ET couleurMax>=couleurDetectee ET confiance>=0.20 ET confiance<=0.60)
Sinon
retourner (couleurMin>=couleur ET couleurMax<=couleur ET confiance>=0.20 ET confiance <=0.60)
FinSi
Fin intervalleCouleur


Implémentation en Java



Langage java
 
double getAvgH(int region)
{
/*La confiance correspond a la saturation et doit
être déclarée dans les variables de la classe à laquelle
appartiennent les méthodes
*/

 
double max, min, r, g ,b, h,l;
 
r=(double)Vision.getAvgRed(region);
g=(double)Vision.getAvgGreen(region);
b=(double)Vision.getAvgBlue(region);
max=Math.max(r,Math.max(g,b));
min=Math.min(r,Math.min(g,b));
l=0.5*(max+min);
 
if(max==min)
{
h=0.0;
}
else if(max==r)
{
h=Math.IEEEremainder(60.0*((g-b)/(max-min)),360.0);
}
else if(max==g)
{
h=60.0*((b-r)/(max-min))+120.0;
}
else
{
h=60.0*((r-g)/(max-min))+240.0;
}
 
if(max==min)
{
confiance=0.0;
}
else if(l<=0.5)
{
confiance=(max-min)/(2.0*l);
}
else if(l>0.5)
{
confiance=(max-min)/(2.0-2.0*l);
}
 
if(confiance<0)
{
confiance = -confiance;
}
return Math.abs(h);
}
 
boolean intervalleCouleur(int region, int colorMin, int colorMax)
{
int couleur = (int)(getAvgH(region))%360;
if(colorMin<colorMax)
{
return (colorMin <=couleur && colorMax>=couleur && confiance>=0.20 && confiance<=0.60);
}
else
{
return (colorMin>=couleur && colorMax<=couleur && confiance>=0.20 && confiance <=0.60);
}
}
 
Remonter
©Wikiupvd 2007-2009

Valid XHTML 1.0 Strict

Sitemap-Accueil-Inscription
Il y a actuellement 5 internautes connectés.
Page générée en 0.14080 secondes
Tous les articles du site sont disponibles sous les termes de la licence de documentation libre GNU
WikiUPVD n'est pas un site officiel de l'Université de Perpignan Via Domitia.