TRAITEMENT D'IMAGES avec OPENCV

TRAITEMENT D'IMAGES avec OPENCV

PROJET SOURCE ( à extraire ) :

workspace_tsi_opencv3.zip

On utilise ici la version C++ de la bibliothèque opencv. La compilation et le debug se font avec eclipse. Pour lancer eclipse, dans un terminal :

$ eclipse_elec

puis sélectionner comme workspace workspace_tsi_opencv3.


Programme de Base : L’Objet Mat

Avec la bibliothèque opencv, une image est représentée par l’objet Mat, contenant entre autres la dimension de l’image, le nombre de composantes par pixel ( image noir et blanc ou couleur ), et bien sûr les pixels définissant l’image.

Après compilation du programme ( make dans un terminal ou CTRL+B sous eclipse ), l’exécutable tsi est créé.

Lors du lancement du programme, la fonction main() ( main.cpp ) détermine arpès analyse des arguments de la fonction, ce que l’on souhaite faire :

  • B : Programme de Base
  • I : Traitement d’une Image
  • V : Traitement Vidéo ( webcam )

Sous Eclipse : Ajouter Argument pour le debug :

Run –> Debug Configuration

Onglet Arguments :

debug_B.png

Placer un point d’arrêt après la création de l’objet Mat ( Fichier base.cpp , après la ligne : “Mat M(200,100, CV_8UC3, Scalar(0,0,255));” Noter alors les paramètres suivants ( fenêtre ‘Variables’ ou ‘Evaluate Expression’ ) :

  • rows
  • cols
  • step

A quelles adresse mémoire sont définis les pixels ?

Il alors possible de les observer dans la fenêtre Memory Browser ( window –> Show View –> Mémory Browser )

Pour une image en couleur, chaque pixel a 3 composantes ( BGR ), ici au format uint8_t . Pour une image en niveaux de gris, chaque pixel a une composante.

REMARQUE :

Pour lancer le programme dans un terminal pour le programme de Base ( se placer dans le répertoire workspace_tsi_opencv3/tsi/Debug ) :

$ ./tsi B

Parcourir les pixels d’une image

Afin de comprendre les différentes méthodes permettant de parcourir l’ensemble des pixels d’une image afin d’effectuer un traitement, nous considérons l’algorithme suivant : pour chaque pixel RVB ( Rouge Vert Bleu ), chaque composante comprise entre 0 et 255 : R <- 255-R V <- 255-V B <- 255-B

Sous Eclipse : Ajouter Arguments pour le debug :

Run –> Debug Configuration

Onglet Arguments :

debug_I.png

Pour un traitement en noir et blanc, ajouter l’argument G à la suite.

Méthode ‘at’ :

Cette méthode est plutôt envisageable pour modifier quelques points d’une image

Pour une image en noir et blanc, chaque pixel de l’objet Mat image est désigné ainsi :

  • image.at(i,j) // i : ligne, j : colonne

Pour une image couleur ( 3 composantes ) :

  • image.at(i,j)[0] // composante B
  • image.at(i,j)[1] // composante G
  • image.at(i,j)[2] // composante R

Pour le test, dans image.cpp : #define ALGO AT_METHODE

Méthode ‘Mat Iterator’

Cette méthode est préférable à la précédente lorsqu’il faut modifier un grand nombre de points d’une image.

L’objet MatIterator permet de faire évoluer un pointeur entre les adresses de début et de fin de l’image.

Pour le test, dans image.cpp : #define ALGO MAT_ITERATOR

Méthode ‘C pointer’

Cette 3ème méthode peut être un peu plus rapide que la précédente, avec davantage de risques liés à la manipulation directe d’un pointeur.

Pour le test, dans image.cpp : #define ALGO C_POINTER


Traitements Vidéo

Détection du Barycentre d’une Couleur

Objectif : Détecter une couleur sur une image et placer un point sur le barycentre de cette couleur.

L’acquisition d’une couleur se fait initialement au format BGR ( Blue Green Red ).
Il est néanmoins plus facile de détecter une couleur avec le format HSV :

  • Hue : Teinte
  • Saturation : Saturation ( intensité )
  • Value : Valeur ( brillance ) 0=noir

HSV_color_solid_cylinder.png

Sous Eclipse : Ajouter Arguments pour le debug :

debug_V.png

Compléter la fonction RedDetect dans le fichier video.cpp afin de placer un point sur le barycentre de la couleur rouge sur les images acquises par la webcam.

Les étapes du traitement sont les suivantes :

  • Conversion BGR –> HSV ( fonction cvtColor )
  • Détection de la couleur rouge avec la fonction inRange appliquée à l’image HSV. Le résultat de cette détection est une image Noir et Blanc, les points Blancs ( valeur 255 ) correspondent à la couleur détectée.
  • Parcours de l’image en Noir et Blanc avec l’une des méthodes évoquées précédemment ( at method, matiterator, c-pointer ) afin de retourner le barycentre de la couleur détectée.
  • ajout d’un point ( ellipse ) sur l’image initiale, dont les coodonnées correspondent au barycentre.

algo.svg

Détection du Barycentre

barycentre.svg

Coordonnée en X : [(2+3+4)+(2+3+4)+(2+3+4)]/9 = 3
Coordonnée en Y : [(3+4+5)+(3+4+5)+(3+4+5)]/9 = 4

Amélioration du Contraste

La fonction Sharpen() permet d’améliorer le contraste d’une image en accentuant chaque composante de chaque pixel par rapport à ses 4 pixels adjacents

sharpen.svg

B = 5.B - B_up - B_down - B_left - B_right
G = 5.G - G_up - G_down - G_left - G_right
R = 5.R - R_up - R_down - R_left - R_right

Le template saturate_cast permet de limiter la valeur calculée.