Multimédia & Interaction Homme-Machine Alexandre Topol Spécialité Informatique Conservatoire National des Arts & Métiers 2009-2010 OpenCV & FFmpeg
Multimédia & Interaction Homme-Machine
Alexandre Topol
Spécialité InformatiqueConservatoire National des Arts & Métiers
2009-2010
OpenCV & FFmpeg
Qu’est-ce que la vision ?
« Le monde » a une structure 3D et est composé d’objets.
L’être humain sait parfaitement décrire et interpréter ce monde.
Pourtant, l’information disponible sur la rétine n’est qu’un ensemble de points.
Qu’est-ce que la vision ?
Chaque pixel contient des informations sur la lumière (quantité et contenu spectral/couleur) reçue en ce point de la rétine.
Les objets (téléphone, voiture…) n’existent pas sur la rétine, et pourtant on les voit : leur interprétation est le résultat du processus visuel.
Le problème de la vision
La vision humaine est extrêmement complexe.
La vision par ordinateur ne cherche pas à comprendre ou à reproduire la vision humaine, mais à construire un modèle algorithmique qui, vu de l’extérieur, possède des propriétés semblables.
Les algorithmes de vision
Extraction de primitives à partir des images.
Représentation des connaissances. (modèle)
Mise en correspondance image/connaissances : reconnaissance.
Les algorithmes de vision
Méthodes d’identifications « 2D »Prétraitement, segmentation (contour, régions)
Extraction d’attributs colorimétriques, de textures et de forme
Classification et reconnaissance
Méthodes d’identifications « 3D »Segmentation (détection des points d’intérêts)
Appariement des points d’intérêts,
Calibration de la caméra,
Extraction d’attributs géométriques
Reconnaissance
Intérêt d’OpenCV
Utiliser la vision en contexte robotique pour des applications simples
Utiliser les traitements sans forcement connaître les algorithmes
Bibliothèque optimisée, traitement temps réel
Les algorithmes de vision
OpenCV intervient dans les premiers niveaux du processus de reconnaissance
Prétraitement des images
Segmentation (contours, régions)
Segmentation (détection des points d’intérêts)
Appariement des points d’intérêts
Calibration de la caméra
Le prétraitement des images
FiltrageDébruitage, rehaussement de contraste
Convolution (filtrage linéaire et non linéaire)
Fourier, Gabor, ondelettes…
Correction des couleurs ou de la luminositéEspace couleur, histogrammes
Transformée de Fourier
Suppression des défauts (distorsion…)
La segmentation et calibration
Segmentation (extraction d’attributs)Détection de contour ou de forme
Extraction de régions
Recherche de points intérêts
CalibrationMise en correspondance de points
Calcul de pose et estimation de paramètres…
Présentation OPENCV
• Généralités sur OPENCV
• Compiler sous Visual C++
• Un premier programme
• Traitement des images et des séquences
• Et sous processing
Présentation OPENCV
Bibliothèque de traitement d’images et de vision par ordinateur en langage C/C++, optimisée, proposée par Intel pour Windows et Linux.
Elle est « Open Source »
Elle comprend un très grand nombre d’opérateurs “classiques”.
Présentation OPENCV
CXCORE
basic structures and algoritms,
XML support, drawing functions
CV, CVAUX
Image processing
and vision algorithmsHighGUI
GUI, Image and Video I/O
Présentation OPENCV
CV & CVAUX : traitement d’imagesGradient, contours, coins et contours actifs,
Morphomath (érosion, dilatation, fermeture…)
Filtrages divers (lissage, rehaussement de contraste, suppression de fond…)
Conversion d’espace couleur (RGB, HSV, YCbCr…)
Étiquetage, manipulation de contours,
Transformations diverses (Fourier, Hough…)
Histogrammes
Présentation OPENCV
CV & CVAUX : traitement d’imagesAnalyse de mouvement et suivi
Suivi d’objets, flot optique…
ReconstructionCalibration, mise en correspondance…
Détection et reconnaissance de formesDétection de visages et autres formes particulières…
Présentation OPENCV
CXCORE & HIGHGUIStructures élémentaires
matrices, tableaux, listes, files, graphes, arbres…
opérateurs standards sur ces structures,
Dessin de primitives géométriqueslignes, rectangles, ellipses, polygones… et texte.
Manipulation des images et des séquenceslecture, écriture…
Interface utilisateurfenêtre, entrées/sorties utilisateur…
Présentation OPENCV
CXCORE fournit de nombreuses fonctions de dessin:
lignes, cercles, ellipses, arcs, …
Polygone plein ou contours
Textes (avec différentes fonts)
Trousse à outils pour gérerles couleurs, les tailles,l’antialiasing
Présentation OPENCV
HIGHGUI – FenêtrescvNamedWindow(window_name, fixed_size_flag);
création d’une fenêtre. Autres fonctions de manipulation :cvNamedWindow(“ViewA”,1);
cvMoveWindow(“ViewA”,300,100);
cvDestroyWindow(“ViewA”);
…
cvShowImage(window_name, image);
copie d’une image dans le buffer fenêtre et repaint si nécessaire.
seulement l’intégralité du contenu de la fenêtre peut être modifié.
La mise à jour de régions de la fenêtre doit être faite par traitements sur l’image.
On Windows native Win32 UI API is used
Linux – GTK+ 2
MacOSX – X11 & GTK+ 2; Native Aqua support is planned.
Présentation OPENCV
HIGHGUI – Images I/O
IplImage* cvLoadImage(image_path, colorness_flag);
charge et une image depuis un fichier, la convertit si nécessaire en couleurs ouen niveaux de gris et la renvoie
le format d’image est déterminé par son contenu.
cvSaveImage(image_path, image);
sauvegarde l’image dans un fichier, le format est déterminé par l’extension.
BMP, JPEG (via libjpeg), PNG (via libpng), TIFF (via libtiff), PPM/PGM sontsupportés.
IplImage* img = cvLoadImage(“picture.jpeg”,-1);
if( img ) cvSaveImage( “picture.png”, img );
Présentation OPENCV
HIGHGUI – Interactions clavier
cvWaitKey(delay=0);
attend un événement key pressed pendant delay ms ou indifiniment si delay=0
à appeler périodiquement pour vider le buffer clavier
cette fonction permet de voir clairement l’aspect séquentiel d’un programme
for(…) {
…
int c = cvWaitKey(100);
if( c >= 0 )
// key_pressed
break;
}
Présentation OPENCV
HIGHGUI – Trackbars
cvCreateTrackbar(trackbar_name,window_name, position_ptr,max_value,callback=0);
Création d’une trackbar et attachement à une fenêtre.
Valeur numérique associée entre 0 et max_value. Quand la position est modifiée, la
valeur de la variable associée est automatiquement modifiée et la callback exécutée is
called, if specified.int dilate_pos=0; // initial position value
void Dilate(int pos) {
… cvShowImage( “E&D”, erode_result );
}
int main(…){
…
cvCreateTrackbar(“Dilate”,”E&D”,
&dilate_pos,10,Dilate);
…
}
Présentation OPENCV
HIGHGUI – événements souris
cvSetMouseCallback(window_name, callback, userdata=0);
pour indiquer la callback de gestion de tous les événements souris pour unefenêtre donnée
// 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
…
}
Présentation OPENCV
HIGHGUI – Vidéo I/OCvCapture* cvCaptureFromCAM(camera_id=0);initialisation de la capture depuis la caméra spécifiéeCvCapture* cvCaptureFromFile(videofile_path);initialisation de la capture depuis un fichier vidéoIplImage* cvQueryFrame(capture);récupération de la trame suivante ou NULL si pas de trame disponible ouerreur.cvGetCaptureProperty(capture, property_id);cvSetCaptureProperty(capture, property_id, value);récupération/attribution des propriétés de capture (résolution, position dans la vidéo, etc)cvReleaseCapture(&capture);libération de la ressource
Présentation OPENCV
HIGHGUI – Vidéo I/OCvCapture* 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 propriétés 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 propriétés du projet, rubrique linkerAjouter 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
Créer un projet Win32ConsoleApplication
Ajouter les liens précédents.
Ajouter dans le fichier main.cpp#include <cv.h>
#include <cvaux.h>
#include <highgui.h>
Exemple : Lecture/affichage d’une image et application d’un filtre de convolution.
Premier programme
Rappel convolution
≠ calcul matriciel !
Utilisation d’un masque noyau
La convolution est une opération linéaire
Premier programme
Exemple de filtre : Le filtre de moyennageChaque pixel de l'image résultat prend comme valeur la
somme pondérée des pixels voisins.
110
100
120 95 130
90
100 110
105110
125
115
120
90 110
125120 90110
130 100 110
125 90110 100
110
90
110
90 100110
105
110
100
110
125
110
130
125
110
100 120
95 130
90
100 110 105
Résultat = 107
Gaussien 1/16 2/16 1/16
2/16 4/16 2/16
1/16 2/16 1/16
Laplacien0 -1 0 -1 -1 -1
-1 4 -1 -1 8 -1
0 -1 0 -1 -1 –1
Gradient-1 0 1 1 2 1
-2 0 2 0 0 0
-1 0 1 -1 -2 -1
Premier programme
Déclarations et InitialisationsIplImage *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 résultats
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); cvMoveWindow("1 - Capture", 0,
0);
cvNamedWindow("2 - Gray", 1); cvMoveWindow("2 -
Gray", 350, 0);
Premier programme
Boucle de rendufor(;;)
{
// Recup image webcam
capture = cvQueryFrame(cam);
if (!capture )
break;
// Conversion niveau de gris
cvCvtColor(capture, gray, CV_RGB2GRAY);
GaussianBlur(gray, smooth); // Gaussian Blur
// Affichage
cvShowImage("1 - Capture", capture);
cvShowImage("2 - Gray", gray);
cvShowImage("3 - Smooth", smooth);
if( cvWaitKey(1) >= 0 )
break;
}
Premier programme
Libérations
cvReleaseCapture(&cam);
cvReleaseImage(&capture); cvDestroyWindow("1 - Capture");
cvReleaseImage(&gray); cvDestroyWindow("2 - Gray");
cvReleaseImage(&smooth); cvDestroyWindow("3 - Smooth");
return 0;
}
Premier programme
Le flou gaussienint gaussianMask[5][5] = { { 2, 4, 5, 4, 2 },
{ 4, 9,12, 9, 4 },
{ 5,12,15,12, 2 },
{ 4, 9,12, 9, 4 },
{ 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);
}
En processing
Installation d’OpenCV sous processing
(c’est dans l’aide de processing dans la rubrique reference->librairies->openCV
Installer OpenCV version 1.0 (pas la 1.1 ni la 2.0 !)
Récupérer le binding OpenCV – java et le déposer dans le répertoire librairies de processing
Sous windows, ajouter le chemin C:\ProgramFiles\OpenCV\bin dans le PATH
En processing
UtilisationDéclaration du contexte OpenCV : OpenCV opencv;
Dans setup :Initialisation OpenCV : opencv = new OpenCV(this);
Démarrer la capture :opencv.capture(IMG_WIDTH, IMG_HEIGHT);
– Dans draw :• Récupération de la trame suivante : opencv.read();
• Traitements : opencv.blur( OpenCV.BLUR, value );
• Affichage : image( opencv.image(), IMG_WIDTH, 0 );
Programmation videoavec FFmpeg
Ensemble d’outils :ffmpeg est un outil en ligne de commande pour convertir un fichier vidéo. Il peut également récupérer et encoder les flux temps-réels.
ffserver est un serveur de streaming multimédia HTTP et RTSP pour la diffusion en live. Il peut aussi décaler les diffusions (time shifting).
ffplay est un simple video player qui s’appuie sur la librairie SDL et sur la libraries FFmpeg bien sûr
Programmation videoavec FFMPEG
Ensemble de librairies en C :libavcodec contient tous les codecs audio/video. La plupart ont été développés entièrement 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 différentes 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 d’examiner ou de modifier la video entre le decodeur et l’encodeur (pour le watermarking par exemple)
Programmation videoavec FFMPEG
Routines qui renseignent des structures de données
Exempleif(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/