Top Banner
Multimédia & Interaction Homme-Machine Alexandre Topol Spécialité Informatique Conservatoire National des Arts & Métiers 2009-2010 OpenCV & FFmpeg
43

Multimédia & Interaction Homme-Machine

Jan 21, 2023

Download

Documents

djomai rania
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: Multimédia & Interaction Homme-Machine

Multimédia & Interaction Homme-Machine

Alexandre Topol

Spécialité InformatiqueConservatoire National des Arts & Métiers

2009-2010

OpenCV & FFmpeg

Page 2: Multimédia & Interaction Homme-Machine

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.

Page 3: Multimédia & Interaction Homme-Machine

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.

Page 4: Multimédia & Interaction Homme-Machine

Le système de vision

Page 5: Multimédia & Interaction Homme-Machine

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.

Page 6: Multimédia & Interaction Homme-Machine

Que faire de la vision par ordinateur ?

Page 7: Multimédia & Interaction Homme-Machine

Que faire de la vision par ordinateur ?

Page 8: Multimédia & Interaction Homme-Machine

Que faire de la vision par ordinateur ?

Page 9: Multimédia & Interaction Homme-Machine

Les algorithmes de vision

Extraction de primitives à partir des images.

Représentation des connaissances. (modèle)

Mise en correspondance image/connaissances : reconnaissance.

Page 10: Multimédia & Interaction Homme-Machine

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

Page 11: Multimédia & Interaction Homme-Machine

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

Page 12: Multimédia & Interaction Homme-Machine

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

Page 13: Multimédia & Interaction Homme-Machine

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

Page 14: Multimédia & Interaction Homme-Machine

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…

Page 15: Multimédia & Interaction Homme-Machine

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

Page 16: Multimédia & Interaction Homme-Machine

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”.

Page 17: Multimédia & Interaction Homme-Machine

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

Page 18: Multimédia & Interaction Homme-Machine

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

Page 19: Multimédia & Interaction Homme-Machine

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…

Page 20: Multimédia & Interaction Homme-Machine

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…

Page 21: Multimédia & Interaction Homme-Machine

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

Page 22: Multimédia & Interaction Homme-Machine

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.

Page 23: Multimédia & Interaction Homme-Machine

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

Page 24: Multimédia & Interaction Homme-Machine

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;

}

Page 25: Multimédia & Interaction Homme-Machine

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

}

Page 26: Multimédia & Interaction Homme-Machine

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

}

Page 27: Multimédia & Interaction Homme-Machine

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

Page 28: Multimédia & Interaction Homme-Machine

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

Page 29: Multimédia & Interaction Homme-Machine

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

Page 30: Multimédia & Interaction Homme-Machine

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.

Page 31: Multimédia & Interaction Homme-Machine

Premier programme

Rappel convolution

≠ calcul matriciel !

Utilisation d’un masque noyau

La convolution est une opération linéaire

Page 32: Multimédia & Interaction Homme-Machine

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

Page 33: Multimédia & Interaction Homme-Machine

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

Page 34: Multimédia & Interaction Homme-Machine

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;

}

Page 35: Multimédia & Interaction Homme-Machine

Premier programme

Libérations

cvReleaseCapture(&cam);

cvReleaseImage(&capture); cvDestroyWindow("1 - Capture");

cvReleaseImage(&gray); cvDestroyWindow("2 - Gray");

cvReleaseImage(&smooth); cvDestroyWindow("3 - Smooth");

return 0;

}

Page 36: Multimédia & Interaction Homme-Machine

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

}

Page 37: Multimédia & Interaction Homme-Machine

Premier programme

Page 38: Multimédia & Interaction Homme-Machine

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

Page 39: Multimédia & Interaction Homme-Machine

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

Page 40: Multimédia & Interaction Homme-Machine

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

Page 41: Multimédia & Interaction Homme-Machine

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)

Page 42: Multimédia & Interaction Homme-Machine

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;

}

Page 43: Multimédia & Interaction Homme-Machine

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/