Académique Documents
Professionnel Documents
Culture Documents
12 OpenCV
12 OpenCV
Alexandre Topol
Spcialit Informatique Conservatoire National des Arts & Mtiers 2009-2010
Le systme de vision
Le problme de la vision
La vision humaine est extrmement complexe. La vision par ordinateur ne cherche pas comprendre ou reproduire la vision humaine, mais construire un modle algorithmique qui, vu de lextrieur, possde des proprits semblables.
Mthodes didentifications 3D
Segmentation (dtection des points dintrts) Appariement des points dintrts, Calibration de la camra, Extraction dattributs gomtriques Reconnaissance
Intrt dOpenCV
Utiliser la vision en contexte robotique pour des applications simples Utiliser les traitements sans forcement connatre les algorithmes Bibliothque optimise, traitement temps rel
La segmentation et calibration
Segmentation (extraction dattributs)
Dtection de contour ou de forme Extraction de rgions Recherche de points intrts
Calibration
Mise en correspondance de points Calcul de pose et estimation de paramtres
Prsentation OPENCV
Gnralits sur OPENCV Compiler sous Visual C++ Un premier programme Traitement des images et des squences Et sous processing
Prsentation OPENCV
Bibliothque de traitement dimages et de vision par ordinateur en langage C/C++, optimise, propose par Intel pour Windows et Linux. Elle est Open Source Elle comprend un trs grand nombre doprateurs classiques.
Prsentation OPENCV
Prsentation OPENCV
CV & CVAUX : traitement dimages
Gradient, contours, coins et contours actifs, Morphomath (rosion, dilatation, fermeture) Filtrages divers (lissage, rehaussement de contraste, suppression de fond) Conversion despace couleur (RGB, HSV, YCbCr) tiquetage, manipulation de contours, Transformations diverses (Fourier, Hough) Histogrammes
Prsentation OPENCV
CV & CVAUX : traitement dimages
Analyse de mouvement et suivi
Suivi dobjets, flot optique
Reconstruction
Calibration, mise en correspondance
Prsentation OPENCV
CXCORE & HIGHGUI
Structures lmentaires
matrices, tableaux, listes, files, graphes, arbres oprateurs standards sur ces structures,
Interface utilisateur
fentre, entres/sorties utilisateur
Prsentation OPENCV
CXCORE fournit de nombreuses fonctions de dessin:
lignes, cercles, ellipses, arcs, Polygone plein ou contours Textes (avec diffrentes fonts) Trousse outils pour grer les couleurs, les tailles, lantialiasing
Prsentation OPENCV
HIGHGUI Fentres
cvNamedWindow(window_name, fixed_size_flag);
cration dune fentre. Autres fonctions de manipulation :
cvNamedWindow(ViewA,1); cvMoveWindow(ViewA,300,100); cvDestroyWindow(ViewA);
cvShowImage(window_name, image);
copie dune image dans le buffer fentre et repaint si ncessaire. seulement lintgralit du contenu de la fentre peut tre modifi. La mise jour de rgions de la fentre doit tre faite par traitements sur limage.
On Windows native Win32 UI API is used Linux GTK+ 2 MacOSX X11 & GTK+ 2; Native Aqua support is planned.
Prsentation OPENCV
HIGHGUI Images I/O
IplImage* cvLoadImage(image_path, colorness_flag); charge et une image depuis un fichier, la convertit si ncessaire en couleurs ou en niveaux de gris et la renvoie le format dimage est dtermin par son contenu. cvSaveImage(image_path, image); sauvegarde limage dans un fichier, le format est dtermin par lextension. BMP, JPEG (via libjpeg), PNG (via libpng), TIFF (via libtiff), PPM/PGM sont supports. IplImage* img = cvLoadImage(picture.jpeg,-1); if( img ) cvSaveImage( picture.png, img );
Prsentation OPENCV
HIGHGUI Interactions clavier
cvWaitKey(delay=0); attend un vnement key pressed pendant delay ms ou indifiniment si delay=0 appeler priodiquement pour vider le buffer clavier cette fonction permet de voir clairement laspect squentiel dun programme for() { int c = cvWaitKey(100); if( c >= 0 ) // key_pressed break; }
Prsentation OPENCV
HIGHGUI Trackbars
cvCreateTrackbar(trackbar_name,window_name, position_ptr,max_value,callback=0); Cration dune trackbar et attachement une fentre. Valeur numrique associe entre 0 et max_value. Quand la position est modifie, la valeur de la variable associe est automatiquement modifie et la callback excute is
dilate_pos=0; // initial position value called,int if specified. void Dilate(int pos) { cvShowImage( E&D, erode_result ); } int main(){ cvCreateTrackbar(Dilate,E&D, &dilate_pos,10,Dilate); }
Prsentation OPENCV
HIGHGUI vnements souris
cvSetMouseCallback(window_name, callback, userdata=0); pour indiquer la callback de gestion de tous les vnements souris pour une fentre donne // opencv/samples/c/lkdemo.c void on_mouse(int event,int x,int y,int flags, void* param) { } int main(){ cvSetMouseCallback(LkDemo,on_mouse,0); cvWaitKey(0); // check for events & process them }
Prsentation OPENCV
HIGHGUI Vido I/O
CvCapture* cvCaptureFromCAM(camera_id=0); initialisation de la capture depuis la camra spcifie CvCapture* cvCaptureFromFile(videofile_path); initialisation de la capture depuis un fichier vido IplImage* cvQueryFrame(capture); rcupration de la trame suivante ou NULL si pas de trame disponible ou erreur. cvGetCaptureProperty(capture, property_id); cvSetCaptureProperty(capture, property_id, value); rcupration/attribution des proprits de capture (rsolution, position dans la vido, etc) cvReleaseCapture(&capture); libration de la ressource
Prsentation OPENCV
HIGHGUI Vido I/O
CvCapture* capture = <> ? cvCaptureFromCAM(camera_id) : cvCaptureFromFile(path); if( !capture ) return -1; for(;;) { IplImage* frame=cvQueryFrame(capture); if(!frame) break; // copy and process image cvShowImage( LkDemo, result ); c=cvWaitKey(30); // run at ~20-30fps speed if(c >= 0) { // process key } cvReleaseCapture(&capture);}
Premier programme
Crer un projet Win32ConsoleApplication Ajouter les liens prcdents. Ajouter dans le fichier main.cpp
#include <cv.h> #include <cvaux.h> #include <highgui.h>
Premier programme
Rappel convolution
calcul matriciel ! Utilisation dun masque noyau La convolution est une opration linaire
Premier programme
Exemple de filtre : Le filtre de moyennage
Chaque pixel de l'image rsultat prend comme valeur la somme pondre des pixels voisins.
90 100 120 125 110 95 90 100
Gaussien
1/16 2/16 1/16 2/16 4/16 2/16 1/16 2/16 1/16
120 110
Laplacien
0 -1 0 -1 4 -1 0 -1 0 -1 -1 -1 -1 8 -1 -1 -1 1 1 2 1 0 0 0 -1 -2 -1
120 125 100 110 105 110 125 105 125 110 90 100 90 90 125
Gradient
100 130
Rsultat = 107
-1 0 1 -2 0 2 -1 0 1
Premier programme
Dclarations et Initialisations
IplImage *capture = 0, *gray = 0, *smooth = 0; int main( int argc, char** argv ) { CvCapture* cam = cvCaptureFromCAM(0); if( !cam ) { fprintf(stderr,"Could not initialize capturing...\n"); return -1; } // les images rsultats gray = cvCreateImage(cvSize(capture->width,capture->height), IPL_DEPTH_8U, 1); smooth = cvCreateImage(cvSize(capture->width,capture->height), IPL_DEPTH_8U, 1); // Create windows cvNamedWindow("1 - Capture", 1); 0); cvNamedWindow("2 - Gray", 1); Gray", 350, 0); cvMoveWindow("2 -
cvMoveWindow("1 - Capture", 0,
Premier programme
Boucle de rendu
for(;;) { // Recup image webcam capture = cvQueryFrame(cam); if (!capture ) break; // Conversion niveau de gris cvCvtColor(capture, gray, CV_RGB2GRAY); GaussianBlur(gray, smooth); // Affichage cvShowImage("1 - Capture", capture); cvShowImage("2 - Gray", gray); cvShowImage("3 - Smooth", smooth); if( cvWaitKey(1) >= 0 ) break; } // Gaussian Blur
Premier programme
Librations
cvReleaseCapture(&cam); cvReleaseImage(&capture); cvReleaseImage(&gray); cvReleaseImage(&smooth); return 0; } cvDestroyWindow("1 - Capture"); cvDestroyWindow("2 - Gray"); cvDestroyWindow("3 - Smooth");
Premier programme
Le flou gaussien
int gaussianMask[5][5] = { { 2, 4, 5, 4, 2 }, { { { { int gauss, div; for (row = 0; row < H; row++) for (col = 0; col < W; col++) { div = 0; newPixel = 0; for (rowOffset=-2; rowOffset<=2; rowOffset++) for (colOffset=-2; colOffset<=2; colOffset++) { rowTotal = row + rowOffset; colTotal = col + colOffset; if (rowTotal >= 0 && rowTotal < H && colTotal >= 0 && colTotal < W) { gauss = gaussianMask[2 + rowOffset][2 + colOffset]; div += gauss; newPixel += (unsigned char)src->imageData[rowTotal*W + colTotal] * gaussianMask[2 + rowOffset][2 + colOffset]; } } dst->imageData[row*W + col] = (unsigned char)(newPixel / div); } 4, 9,12, 9, 5,12,15,12, 4, 9,12, 9, 2, 4, 5, 4, 4 2 4 2 }, }, }, } };
Premier programme
En processing
Installation dOpenCV sous processing (cest dans laide de processing dans la rubrique reference->librairies->openCV
Installer OpenCV version 1.0 (pas la 1.1 ni la 2.0 !) Rcuprer le binding OpenCV java et le dposer dans le rpertoire librairies de processing Sous windows, ajouter le chemin C:\Program Files\OpenCV\bin dans le PATH
En processing
Utilisation
Dclaration du contexte OpenCV : OpenCV Dans setup :
Initialisation OpenCV : opencv Dmarrer la capture :
opencv;
= new OpenCV(this);
opencv.capture(IMG_WIDTH, IMG_HEIGHT);
Dans draw :
Rcupration de la trame suivante : opencv.read(); Traitements : opencv.blur( OpenCV.BLUR, value Affichage : image( opencv.image(), IMG_WIDTH,
); 0 );
// Find the first video stream videoStream=-1; for(i=0; i<(int)pFormatCtx->nb_streams; i++) if(pFormatCtx->streams[i]->codec->codec_type==CODEC_TYPE_VIDEO) { videoStream=i; break; }
// Open codec if(avcodec_open(pCodecCtx, pCodec)<0) return -1; // Could not open codec