Introduction à OpenCV GEL – 21405 Design III Charles du Tremblay
Plan Pourquoi OpenCV? Qu’est-ce qu’OpenCV? Structure de l’image IPL Fonctionnalités offertes Exemples d’utilisation
Pourquoi OpenCV? Une grande part de vos résultats dépendent de la vision. Fournit un lien entre la caméra et votre application (IA). 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 YCRCB 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 Permet une première identification des points d’intérêts. Garde les pixels de la couleur de l’objet recherché Image originale Seuil sur RGB : blanc Seuil sur HSV : rouge
Exemple d’application Trouver un objet rouge dans une image: Initialiser la caméra et les images. Convertir l’espace couleur. Parcourir l’image HSV et vérifier les pixels par rapport aux seuils fixés. Détruire l’image et libérer la mémoire.
Exemple d’application 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 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 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 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 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 );
Bon Travail! Références: Intel Image Processing Library Reference Manual OpenCV Reference Manual http://wcours.gel.ulaval.ca/2006/a/21405/default/7references/index.chtml http://www.site.uottawa.ca/~laganier/tutorial/opencv+directshow http://www710.univ-lyon1.fr/~bouakaz/OpenCV-0.9.5/docs/