GEL – 21405 Design III
Introduction à OpenCV
Charles du Tremblay
A 2006
Plan
Pourquoi OpenCV?
Qu’est-ce qu’OpenCV?
Structure de l’image IPL
Fonctionnalités offertes
Exemples d’utilisation
Pourquoi OpenCV?
1.
Une grande part de vos résultats dépendent de la vision.
2.
Fournit un lien entre la caméra et votre application (IA).
3.
Offre des outils pour traiter vos images
et faciliter la reconnaissance du terrain.
Qu’est-ce qu’OpenCV?
OpenCV: Open Source Computer Vision Library
OpenCV vise:
La vision numérique en temps réel
La segmentation, reconnaissance et identification d’objets
OpenCV offre:
Une collection d’algorithmes
Des exemples de codes
Qu’est-ce qu’OpenCV
OpenCV est bâtit sur IPL (Intel Image Processing Library):
Même format d’image (IPL image)
La plupart des fonctions sont compatibles
Différences:
Fonctions exclusives
Quelques fonctions incompatibles
OpenCV: utilisation partielle du format IPL
image
Structure de l’image IPL
IplImage :
nSize sizeof(IplImage) (int)
nChannels Nb. de canaux (1-4 en OpenCV) (int)
depth Bits par pixels (int)
width Largeur de l’image en pixels (int)
height Hauteur de l’image en pixels (int)
roi Region Of Interest (_IplROI*)
maskROI1 Masque (_IplImage*)
alphaChannel2 Canal alpha (int)
colorModel2 Espace couleur utilisé (char[4])
BorderMode2 Mode de détection de contour (int[4])
[…]
1 Doit être NULL pour les fonctions OpenCV
2 Non supporté ou ignoré par OpenCV. Utile pour IPL.
Fonctionnalités offertes
Création, allocation & destruction d’images
Détection de contours
Conversion d’espace couleur
Analyse de contour
Soustraction d’arrière-plan
Détection de régions
Pyramides d’images
Opération morphologiques (érosion, dilatation, etc.)
Seuillage
[…]
Création, allocation &
destruction d’images
Lier une caméra
Fonction: cvCaptureFromCAM(int index)
Retourne un objet CvCapture* qui définit votre caméra
L’index importe peu pour une seule caméra
Prendre une image
Fonction: cvGrabFrame(CvCapture* camera)
Demande à la caméra de capturer une image
Fonction: cvRetrieveFrame(CvCapture* camera)
Retourne une image IPL (IplImage*)
Le format par défaut est BRG 8-bits
Création, allocation &
destruction d’images
Créer une image vide
Fonction: cvCreateImage(CvSize size, int depth, int channels)
Retourne une image IPL (IplImage*) remplie de 0.
Libérer la mémoire
Fonction: cvReleaseImage(&IplImage img)
Pour libérer l’espace mémoire prise par une image.
Fonction: cvReleaseCapture(&CvCapture camera)
Pour libérer la caméra.
Conversion d’espace couleur
Pour OpenCV:
Espaces couleurs:
RGB (BRG, RBG, etc.)
HSV
YC
RC
B
CIE XYZ
Fonction: cvCvtColor(&imgSrc, &imgDest, code)
CIE Lab
Bayer
Greyscale
Attention à l’ordre des composantes RGB dans les images que vous traitez!
Par défaut, vos images sont capturées en BRG et non en RGB.
Seuillage
Seuil sur RGB : blanc Seuil sur HSV : rouge Image originale
Permet une première identification des points d’intérêts.
Garde les pixels de la couleur de l’objet
recherché
Exemple d’application
Trouver un objet rouge dans une image:
1.
Initialiser la caméra et les images.
2.
Convertir l’espace couleur.
3.
Parcourir l’image HSV et vérifier les pixels par rapport aux seuils fixés.
4.
Détruire l’image et libérer la mémoire.
Exemple d’application
1.
Initialiser la caméra et les images
//Définir une caméra
CvCapture* camera = cvCaptureFromCAM( -1 );
//Capturer une image cvGrabFrame( camera );
//Aller chercher l’image sous format IplImage
IplImage* brgFrame = cvRetrieveFrame( camera );
//Copies de l’image pour les transformations…
IplImage* seuilFrame = cvCreateImage( cvGetSize(brgFrame), IPL_DEPTH_8U, 1 );
IplImage* hsvFrame = cvCreateImage( cvGetSize(brgFrame), IPL_DEPTH_8U, 3 );
Exemple d’application
2.
Convertir l’espace couleur
//Conversion BGR -> HSV
cvCvtColor( brgFrame, hsvFrame, CV_BGR2HSV );
//Retourne l’image par rapport à X si nécessaire cvFlip( hsvFrame, NULL, 0); //0 = axe X
Exemple d’application
3.
Parcourir l’image HSV et vérifier les seuils
//Pour chaque pixel…
for(int y = 0; y < (cvGetSize(hsvFrame).height); y++) {
for(int x = 0; x < (cvGetSize(hsvFrame).width); x++) {//…si HSV entre les seuils max et min…
if(
//test minH (=0)
((hsvFrame->imageData + hsvFrame->widthStep*y))[x*3] > 0
&&
//test maxH (=50)
((hsvFrame->imageData + hsvFrame->widthStep*y))[x*3] < 50
&&
Pourquoi « [x*3+k]…
Donc…
k=0 pour H k=1 pour S k=2 pour V
Exemple d’application
3.
Parcourir l’image HSV et vérifier les seuils (suite)
//test minS (=100)
(hsvFrame->imageData + hsvFrame->widthStep*y)[(x*3)+1]
>100 )
//…placer un point blanc dans l’image « seuils ».
( seuilFrame->imageData + seuilFrame->widthStep*y)[x] = 255;
//Sinon, placer un point noir.
else
( seuilFrame->imageData + seuilFrame->widthStep*y)[x] = 0;
}
} //fin des boucles
Exemple d’application
4.
Détruire l’image et libérer la mémoire
[…suite des opérations sur l’image…]
//Libérer l’espace des images cvReleaseImage( &brgFrame );
cvReleaseImage( &hsvFrame );
cvReleaseImage( &seuilFrame );
//Libérer la caméra
cvReleaseCapture( &camera );
Références:
1. Intel Image Processing Library Reference Manual 2. OpenCV Reference Manual
3. http://wcours.gel.ulaval.ca/2006/a/21405/default/7references/index.chtml
4. http://www.site.uottawa.ca/~laganier/tutorial/opencv+directshow
5. http://www710.univ-lyon1.fr/~bouakaz/OpenCV-0.9.5/docs/
Références:
1. Intel Image Processing Library Reference Manual 2. OpenCV Reference Manual
3. http://wcours.gel.ulaval.ca/2006/a/21405/default/7references/index.chtml
4. http://www.site.uottawa.ca/~laganier/tutorial/opencv+directshow
5. http://www710.univ-lyon1.fr/~bouakaz/OpenCV-0.9.5/docs/