<< | Liste des exercices | >>

3. Étiquetage des blobs

Dans ce dernier exercice, nous allons mettre en évidence, sur l'image acquise, les blobs représentant les empreintes des doigts.

Remplissage des blobs

On souhaite d'abord identifier chaque blob au moyen d'une couleur propre. Sous OpenCV, une couleur est représentée par le type CvScalar, même si seulement 3 composantes entières seront ici utilisées.

  1. Former une image couleur à partir de l'image binaire, grâce à la fonction cvMerge. À partir de maintenant, c'est sur cette image qu'il faudra travailler et qui sera affichée.
  2. Remplir par une couleur propre chaque blob de doigt trouvé dans l'exercice précédent. On utilisera pour cela la méthode CBlob::FillBlob, la couleur de remplissage étant choisie dans une « palette » au moyen de l'identifiant du blob.
La portion de code suivante (à copier en début de programme) permet de créer une « palette » de 100 couleurs aléatoires différentes, grâce à la macro CV_RGB et la fonction standard rand (nécessitant la bibliothèque time) :
// Création d'une "palette" de couleurs aléatoires différentes
// pour l'étiquetage couleur des blobs
CvScalar colors[100];
srand ( time (NULL) );
for (int i = 0; i<100; i++)
{
    CvScalar newColor;
    bool reallyNew;
    do {
        newColor = CV_RGB( rand()&255, rand()&255, rand()&255 );
        int j = -1; reallyNew = true;
        do {
            j++;
        } while ( (colors[j].val[0] != newColor.val[0] || colors[j].val[1] != newColor.val[1]
                || colors[j].val[2] != newColor.val[2]) && j < i);
        if ( (colors[j].val[0] == newColor.val[0] && colors[j].val[1] == newColor.val[1]
                && colors[j].val[2] == newColor.val[2]) )
        reallyNew = false;
    } while (!reallyNew);
    colors[i] = newColor;
}

Vers le suivi des blobs

La nécessité d'implanter un algorithme de suivi des blobs, ce qui sera réalisé à la prochaine séance, se comprend facilement. Une petite expérience va vous en convaincre.

  1. Poser deux doigts sur le plexiglas et imprimer un mouvement de rotation axiale à votre main, jusqu'à effectuer au moins un demi-tour. Que se passe-t-il et comment l'expliquer ? Pouvez-vous proposer une solution simple pour résoudre ce problème ?

Étiquetage des blobs (facultatif)

On souhaite enfin marquer mieux chaque blob, à la fois par des repères graphiques supplémentaires et par l'étiquette textuelle de son identifiant.

  1. Accentuer le marquage graphique de chaque blob en utilisant :
    1. la fonction cvEllipse pour tracer son ellipse de contour (dans une couleur réservée) ;
    2. la fonction cvLine pour tracer un point au centre du blob (ligne de longueur nulle, mais épaisse).
  2. Afficher, à proximité du centre de chaque blob de doigt détecté, une étiquette textuelle indiquant son identifiant. Pour cela, il faut initialiser une fonte (utilisant la police de votre choix) grâce à la fonction cvInitFont, par exemple :
CvFont font;
cvInitFont( &font, CV_FONT_HERSHEY_SIMPLEX, 0.5, 0.5 );
puis utiliser cette fonte en paramètre de la fonction cvPutText.