<< Calcul des distances généralisées | Liste des exercices | Envoi de messages par TUIO >>

2. Étiquetage des blobs

Dans cette partie, il s'agit de repérer:

  • les blobs de l'image précédente qui ne correspondent à aucun blob dans l'image courante. Ces derniers devront être retirés de la liste;
  • les blobs de l'image courante qui correspondent à un blob de l'image précédente. Dans ce cas, le nouveau blob héritera de l'étiquette de l'ancien;
  • les blobs de l'image courante qui ne correspondent à aucun blob de l'image précédente. A ces blobs, il faudra associer une nouvelle étiquette.

Blobs non associés

Pour repérer les blobs de l'image précédente qui ne sont plus associés, on balaye le tableau des distances ligne par ligne. Quand une ligne ne contient que des valeurs -1.0, c'est que l'objet correspondant à ce blob n'est plus associé.

  1. Compléter le code suivant pour réaliser ce premier traitement. Pour l'instant, afficher simplement les étiquettes des blobs avec un appel à la fonction printf
/* ------------------------------------------------------
Enlever les anciens blobs non associes de la liste TUIO
------------------------------------------------------ */
for (i = 0; i < iOldBlobs; i++) {
    // A completer !!!
}

Blobs de la nouvelle image

Dans cette partie, on va balayer le tableau des distances colonne par colonne afin de déterminer si le nouveau blob est associé ou non à un ancien blob. Si une colonne ne contient que des valeurs -1.0, c'est que le nouveau blob n'a pas de correspondant dans l'image précédente. Sinon, la valeur différente de -1.0 indique l'association. Dans le premier cas, il faut attribuer une nouvelle étiquette au blob. Dans le deuxième cas, il faut attribuer au nouveau blob l'étiquette de l'ancien.

  1. Il faut ajouter le code correspondant à ces traitements dans le bloc suivant:
/* ------------------------------------------------------
Balayer la liste des nouveaux blobs
------------------------------------------------------ */
for (j = 0; j < iNewBlobs; j++) {
    double dMaxColonne = -1.0;
    int iPosMaxColonne = -1;
    // Calculer s'il existe une distance valide dans la
    // colonne d'indice j
    // A completer !!!

    // S'il existe une distance mini dans la colonne
    if (dMaxColonne > -1.0) {
        // Copier l'etiquette de l'ancien blob
        // A completer !!!
    }
    // Sinon...
    else {
        // Definir une nouvelle etiquette pour le blob
        // A completer !!!
    }
}