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);
}
}