<< | Liste des exercices | Blobs issus de la détection des doigts >>

1. Blobs d'une image de synthèse

Ces exercices ont pour but de se familiariser avec les fonctionnalités offertes par la bibliothèque cvBlobsLib pour l'extraction des blobs. Nous allons donc, dans un premier temps, travailler avec une image créée de toutes pièces.

Tous ces exercices peuvent donner lieu à l'écriture d'une fonction void tester_CBlobResult(void).

Extraction des blobs

L'image binaire de synthèse 400x300 ci-dessous comporte :

  • un rectangle de coins opposés (100, 100) et (200, 150)
  • un disque de centre (200, 200) et de rayon 30
  • un segment d'extrémités (300, 200) et (300, 250)

Voici le code permettant de la créer :

imBlobs = cvCreateImage( cvSize( 400, 300 ), IPL_DEPTH_8U, 1 );
cvZero( imBlobs );
cvRectangle( imBlobs, cvPoint( 100, 100 ), cvPoint( 200, 150 ), cvScalarAll(255), CV_FILLED );
// épaisseur -1 : forme pleine
cvCircle( imBlobs, cvPoint( 200, 200 ), 30, cvScalarAll(255), CV_FILLED );
cvLine( imBlobs, cvPoint( 300, 200 ), cvPoint( 300, 250 ), cvScalarAll(255) );
  1. Charger cette image, puis en extraire les blobs dans un objet CBlobResult blobs grâce au constructeur CBlobResult

Caractéristiques des blobs

Ces blobs sont alors au nombre de blobs.GetNumBlobs(), et chacun d'entre eux est accessible par la méthode CBlobResult::GetBlob.

  1. Afficher sur la console les caractéristiques principales de chacun de ces blobs, à savoir :
  2. Qu'en déduisez-vous quant à ces diverses informations, notamment :
    • dans quel ordre sont numérotés les blobs ?
    • dans quelle unité sont exprimés le périmètre et la surface ?
    • pourquoi les valeurs obtenues pour les propriétés du disque ne correspondent-elles pas exactement aux valeurs théoriques ?

Filtrage des blobs

  1. Utiliser la méthode CBlobResult::Filter pour éliminer de la liste des blobs ceux ayant une surface inférieure à 1000 pixels. Pour cela, le troisième paramètre de cette méthode doit être l'« opérateur » CBlobGetArea().
Quelles informations sont maintenant affichées sur la console pour l'image de synthèse précédente ?
  1. Afficher sur la console les caractéristiques de l'ellipse englobante de chaque blob, donnée par la méthode CBlob::GetEllipse. Cette méthode retourne un objet ellipse de type CvBox2D.
Remarque : l'ellipse englobante n'est pas définie pour un segment, mais il est possible de trouver les coordonnées du centre de ce blob en en appelant la méthode CBlobResult::GetNumber avec comme paramètres le numéro du blob et l'un des « opérateurs » CBlobGetXCenter() ou CBlobGetYCenter().
  1. Utiliser maintenant la méthode CBlobResult::Filter avec l'« opérateur » CBlobGetAxisRatio(), qui retourne la longueur du petit axe de l'ellipse divisée par celle du grand axe. Éliminer ainsi les blobs trop « allongés », en fixant à 0.6 le ratio minimal des dimensions des axes de l'ellipse englobante de chaque blob.
Quel(s) blob(s) demeure(nt) après ce filtrage ?

Affichage de l'ellipse englobante des blobs

  1. Afficher graphiquement l'ellipse englobante de chaque blob directement sur l'image grâce à la fonction cvEllipse, dont les paramètres sont ici :
imBlobs,
cvPointFrom32f(ellipse.center),
cvSize( (int)ellipse.size.width, (int)ellipse.size.height ),
ellipse.angle,
0, 360,
CV_RGB( 127, 127, 127 )