Vous êtes sur la page 1sur 43

Multimdia & Interaction Homme-Machine

OpenCV & FFmpeg

Alexandre Topol
Spcialit Informatique Conservatoire National des Arts & Mtiers 2009-2010

Quest-ce que la vision ?


Le monde a une structure 3D et est compos dobjets. Ltre humain sait parfaitement dcrire et interprter ce monde. Pourtant, linformation disponible sur la rtine nest quun ensemble de points.

Quest-ce que la vision ?


Chaque pixel contient des informations sur la lumire (quantit et contenu spectral/couleur) reue en ce point de la rtine. Les objets (tlphone, voiture) nexistent pas sur la rtine, et pourtant on les voit : leur interprtation est le rsultat du processus visuel.

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.

Que faire de la vision par ordinateur ?

Que faire de la vision par ordinateur ?

Que faire de la vision par ordinateur ?

Les algorithmes de vision


Extraction de primitives partir des images. Reprsentation des connaissances. (modle) Mise en correspondance image/connaissances : reconnaissance.

Les algorithmes de vision


Mthodes didentifications 2D
Prtraitement, segmentation (contour, rgions) Extraction dattributs colorimtriques, de textures et de forme Classification et reconnaissance

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

Les algorithmes de vision


OpenCV intervient dans les premiers niveaux du processus de reconnaissance
Prtraitement des images Segmentation (contours, rgions) Segmentation (dtection des points dintrts) Appariement des points dintrts Calibration de la camra

Le prtraitement des images


Filtrage
Dbruitage, rehaussement de contraste
Convolution (filtrage linaire et non linaire) Fourier, Gabor, ondelettes

Correction des couleurs ou de la luminosit


Espace couleur, histogrammes Transforme de Fourier

Suppression des dfauts (distorsion)

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

CV, CVAUX Image processing and vision algorithms

HighGUI GUI, Image and Video I/O

CXCORE basic structures and algoritms, XML support, drawing functions

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

Dtection et reconnaissance de formes


Dtection de visages et autres formes particulires

Prsentation OPENCV
CXCORE & HIGHGUI
Structures lmentaires
matrices, tableaux, listes, files, graphes, arbres oprateurs standards sur ces structures,

Dessin de primitives gomtriques


lignes, rectangles, ellipses, polygones et texte.

Manipulation des images et des squences


lecture, criture

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);}

Compilation sous VISUAL C++ 6


Dans les proprits du projet, rubrique C++ Ajouter les liens suivants dans "Additional include directories": C:\Program Files\OpenCV\cv\include, C:\Program Files\OpenCV\cvaux\include, C:\Program Files\OpenCV\cxcore\include, C:\Program Files\OpenCV\otherlibs\highgui Dans les proprits du projet, rubrique linker Ajouter les librairies suivantes dans "Additional dependencies": cv.lib cvaux.lib cxcore.lib highgui.lib Ajouter le chemin suivant dans "Additional library path": C:\Program Files\OpenCV\lib

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>

Exemple : Lecture/affichage dune image et application dun filtre de convolution.

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

130 100 110 110 90 105 110

115 110 100 120 90 110 110 95

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

130 110 110

120 125 100 110 105 110 125 105 125 110 90 100 90 90 125

Gradient

110 130 100 110

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 );

Programmation videoavec FFmpeg


Ensemble doutils :
ffmpeg est un outil en ligne de commande pour convertir un fichier vido. Il peut galement rcuprer et encoder les flux temps-rels. ffserver est un serveur de streaming multimdia HTTP et RTSP pour la diffusion en live. Il peut aussi dcaler les diffusions (time shifting). ffplay est un simple video player qui sappuie sur la librairie SDL et sur la libraries FFmpeg bien sr

Programmation videoavec FFMPEG


Ensemble de librairies en C :
libavcodec contient tous les codecs audio/video. La plupart ont t dvelopps entirement pour garantir les meilleures performances possibles et haute r-usabilit . libavformat contient les muxers et demuxers des flus audios et videos libavutil contient des routines qui peuvent aider dans diffrentes parties prises en charge par FFmpeg (le cryptage, la redondance cyclique, ) libpostproc contient des routines pour la postprocessing libswscale contient des fonctions pour le redimentionnement libavfilter permet dexaminer ou de modifier la video entre le decodeur et lencodeur (pour le watermarking par exemple)

Programmation videoavec FFMPEG


Routines qui renseignent des structures de donnes Exemple
if(av_open_input_file(&pFormatCtx, argv[1], NULL, 0, NULL)!=0) return -1; // Couldn't open file

if(av_find_stream_info(pFormatCtx)<0) return -1; // Couldn't find stream information

// 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; }

Programmation videoavec FFMPEG


// Find the decoder for the video stream pCodec=avcodec_find_decoder(pCodecCtx->codec_id); if(pCodec==NULL) { fprintf(stderr, "Unsupported codec!\n"); return -1; // Codec not found }

// Open codec if(avcodec_open(pCodecCtx, pCodec)<0) return -1; // Could not open codec

// Allocate video frame pFrame=avcodec_alloc_frame();

Etc voir le tutoriel FFmpeg & SDL (attention pas jour !)


http://dranger.com/ffmpeg/