Page Personnelle de Vincent Kerhoas
Vincent Kerhoas
Enseignant du Supérieur
Professeur Agrégé
Page Personnelle de Vincent Kerhoas

TRAITEMENT D’IMAGES avec OPENCV

PROJET SOURCE ( à extraire ) :


workspace_tsi_opencv3


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 :

Sous Eclipse : Ajouter Argument pour le debug :

Run –> Debug Configuration

Onglet Arguments :

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’ ) :

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 :

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 :

Pour une image couleur ( 3 composantes ) :

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 :

Sous Eclipse : Ajouter Arguments pour le debug :

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 :

Détection du Barycentre

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

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.