Una Introduzione a OpenCV -...

53
Introduzione Le Strutture Dati Una Introduzione a OpenCV Prof. Michele Scarpiniti Dipartimento di Ingegneria dell’Informazione, Elettronica e Telecomunicazioni “Sapienza” Universit` a di Roma http://ispac.diet.uniroma1.it/scarpiniti/index.htm [email protected] M. Scarpiniti Una Introduzione a OpenCV 1 / 53

Transcript of Una Introduzione a OpenCV -...

Page 1: Una Introduzione a OpenCV - ispac.diet.uniroma1.itispac.diet.uniroma1.it/scarpiniti/files/LabEMM/Less10.pdf · Introduzione Le Strutture Dati Una Introduzione a OpenCV Prof. Michele

IntroduzioneLe Strutture Dati

Una Introduzione aOpenCV

Prof. Michele Scarpiniti

Dipartimento di Ingegneria dell’Informazione, Elettronica e Telecomunicazioni“Sapienza” Universita di Roma

http://ispac.diet.uniroma1.it/scarpiniti/index.htm

[email protected]

M. Scarpiniti Una Introduzione a OpenCV 1 / 53

Page 2: Una Introduzione a OpenCV - ispac.diet.uniroma1.itispac.diet.uniroma1.it/scarpiniti/files/LabEMM/Less10.pdf · Introduzione Le Strutture Dati Una Introduzione a OpenCV Prof. Michele

IntroduzioneLe Strutture Dati

1 IntroduzioneIntroduzioneI primi passi

2 Le Strutture DatiGestione delle matriciL’Istogramma

M. Scarpiniti Una Introduzione a OpenCV 2 / 53

Page 3: Una Introduzione a OpenCV - ispac.diet.uniroma1.itispac.diet.uniroma1.it/scarpiniti/files/LabEMM/Less10.pdf · Introduzione Le Strutture Dati Una Introduzione a OpenCV Prof. Michele

IntroduzioneLe Strutture Dati

IntroduzioneI primi passi

Introduzione

Introduzione

M. Scarpiniti Una Introduzione a OpenCV 3 / 53

Page 4: Una Introduzione a OpenCV - ispac.diet.uniroma1.itispac.diet.uniroma1.it/scarpiniti/files/LabEMM/Less10.pdf · Introduzione Le Strutture Dati Una Introduzione a OpenCV Prof. Michele

IntroduzioneLe Strutture Dati

IntroduzioneI primi passi

Introduzione

L’obiettivo di queste slides e di introdurre ed illustrare il funzionamento diun utile e potente framework per la gestione dei dispositivi video, noto comeOpenCV.OpenCV e una libreria open-source, scritta in C, per lo streaming videoreal-time ovvero la computer vision e gira sotto Windows, Linux e MacOS X.Maggiori informazioni possono essere reperite al link http://opencv.willowgarage.com/wiki/ da cui e anche possibile scaricare l’intero codice in C++.

M. Scarpiniti Una Introduzione a OpenCV 4 / 53

Page 5: Una Introduzione a OpenCV - ispac.diet.uniroma1.itispac.diet.uniroma1.it/scarpiniti/files/LabEMM/Less10.pdf · Introduzione Le Strutture Dati Una Introduzione a OpenCV Prof. Michele

IntroduzioneLe Strutture Dati

IntroduzioneI primi passi

Introduzione: la computer vision

La computer vision e una trasformazione dei dati provenienti da una fotoca-mera o videocamera verso una decisione o una loro nuova rappresentazio-ne. Una tale trasformazione puo essere effettuata per uno scopo qualsiasi. E’anche possibile inserire nei dati, alcune informazioni riguardanti il contestoin cui si opera.

M. Scarpiniti Una Introduzione a OpenCV 5 / 53

Page 6: Una Introduzione a OpenCV - ispac.diet.uniroma1.itispac.diet.uniroma1.it/scarpiniti/files/LabEMM/Less10.pdf · Introduzione Le Strutture Dati Una Introduzione a OpenCV Prof. Michele

IntroduzioneLe Strutture Dati

IntroduzioneI primi passi

Introduzione: storia di OpenCV

Il framework OpenCV nasce da una iniziativa dell’Intel, mentre lavoravasu miglioramenti delle loro CPU per applicazioni intensive, ad esempio ray-tracing in tempo reale e proiezione 3D. Uno degli addetti della Intel, avevanotato che in motle Universita, tra cui il MIT Media Lab, avevano messo suun’infrastruttura per la computer vision, il cui codice era passato da studentea studente. A tal proposito si decise di iniziare a progettare, a partire daquesto codice, un framework per la computer vision per i processori Intel.Il primo avvio di tale progetto, con la collaborazione di un team Intel russo,fu nel 1999. La prima release ufficiale di OpenCV risale, invece, al 2006.Nel 2011 e stata rilasciata la versione 2.2.0, che supporta anche Android.Ora e disponibile la release 3.0.

M. Scarpiniti Una Introduzione a OpenCV 6 / 53

Page 7: Una Introduzione a OpenCV - ispac.diet.uniroma1.itispac.diet.uniroma1.it/scarpiniti/files/LabEMM/Less10.pdf · Introduzione Le Strutture Dati Una Introduzione a OpenCV Prof. Michele

IntroduzioneLe Strutture Dati

IntroduzioneI primi passi

OpenCV e le IPP

Per velocizzare OpenCV e possibile utilizzare la libreria IPP (Intel Perfor-mance Primitives). Infatti OpenCV e basato, internamente, su tali libreriein quanto molti programmatori Intel ne fanno un forte uso. Le IPP sonodelle librerie altamente ottimizzate, che agiscono direttamente a livello dellemicro-istruzioni del processore, evitando qualsiasi perdita di tempo.Se le IPP sono installate, OpenCV le rilevera in automatico e le includeraal momento della compilazione, per ottimizzare al massimo il codice. Cosıse, ad esempio e richiesto il calcolo di una FFT, verra utilizzata la funzionedefinita nelle IPP anziche quella nativa di OpenCV.Per verificare se le IPP sono installate e determinare la release di OpenCVin uso, si puo utilizzare il seguente codice

char* libraries;

char* modules;

cvGetModuleInfo (0, &libraries , &modules);

printf("Libraries: %s/nModules: %s/n", libraries , modules);

M. Scarpiniti Una Introduzione a OpenCV 7 / 53

Page 8: Una Introduzione a OpenCV - ispac.diet.uniroma1.itispac.diet.uniroma1.it/scarpiniti/files/LabEMM/Less10.pdf · Introduzione Le Strutture Dati Una Introduzione a OpenCV Prof. Michele

IntroduzioneLe Strutture Dati

IntroduzioneI primi passi

Installare OpenCV

Dopo aver scaricato e configurato (ad esempio attraverso l’utilizzo del soft-ware CMake (http://www.cmake.org/)) OpenCV e possibile aprire conMicrosoft Visual C++ il relativo file di soluzione e compilare il tutto. Il ri-sultato della compilazione e una serie di librerie, che dovranno essere inclusenel codice che verra scritto. Le relative librerie dinamiche *.dll, andrannodistribuite insieme al programma compilato.Nella cartella bin verranno compilati, inoltre, i numerosi esempi inclusinel framework, attraverso i quali e possibile scrivere facilmente un elevatonumero di applicazioni.Nella cartella docs e invece possibile consultare un’abbondante documenta-zione in formato html oppure in formato pdf. E’ anche reperibile una do-cumentazione Wiki, all’indirizzo http://opencvlibrary.SourceForge.

net.

M. Scarpiniti Una Introduzione a OpenCV 8 / 53

Page 9: Una Introduzione a OpenCV - ispac.diet.uniroma1.itispac.diet.uniroma1.it/scarpiniti/files/LabEMM/Less10.pdf · Introduzione Le Strutture Dati Una Introduzione a OpenCV Prof. Michele

IntroduzioneLe Strutture Dati

IntroduzioneI primi passi

Struttura di OpenCV

La struttura di OpenCV consta delle seguenti 6 parti:

1 CXCORE: contiene la definizione di tutte le strutture dati e lefunzioni per gestire immagini e video.

2 CV: contiene tutte le funzioni per l’elaborazione e l’analisi delleimmagini, la calibrazione e il tracking.

3 ML (Machine Learning): contiene molte funzioni sul MachineLearning e il pattern recognition, quali il clustering e la classificazione.

4 HighGUI: contiene le definizioni delle interfacce utenti (GUI).

5 CVCAM: contiene le interfacce per le webcam.

6 CVAUX: contiene algoritmi sperimentali per scopi diversi, ad esempio:segmentazione, sottrazione del background, modelli HMM, ecc.

M. Scarpiniti Una Introduzione a OpenCV 9 / 53

Page 10: Una Introduzione a OpenCV - ispac.diet.uniroma1.itispac.diet.uniroma1.it/scarpiniti/files/LabEMM/Less10.pdf · Introduzione Le Strutture Dati Una Introduzione a OpenCV Prof. Michele

IntroduzioneLe Strutture Dati

IntroduzioneI primi passi

Struttura di OpenCV

La struttura di OpenCV precedente puo essere riassunta nella schematiz-zazione seguente.

CXCORE

CV MLL HighGUI

CVAUX

CVCAM

M. Scarpiniti Una Introduzione a OpenCV 10 / 53

Page 11: Una Introduzione a OpenCV - ispac.diet.uniroma1.itispac.diet.uniroma1.it/scarpiniti/files/LabEMM/Less10.pdf · Introduzione Le Strutture Dati Una Introduzione a OpenCV Prof. Michele

IntroduzioneLe Strutture Dati

IntroduzioneI primi passi

Aprire una foto con OpenCV

Per aprire una foto, e possibile utilizzare il seguente codice:

#include "highgui.h"

int main(int argc , char** argv)

{

IplImage* img = cvLoadImage(argv [1]);

cvNamedWindow("Esempio1", CV_WINDOW_AUTOSIZE);

cvShowImage("Esempio1", img);

cvWaitKey (0);

cvReleaseImage (&img);

cvDestroyWindow("Esempio1");

}

Tutte le funzioni utilizzate in questo script, sono definite nel file di headerhighgui.h.

M. Scarpiniti Una Introduzione a OpenCV 11 / 53

Page 12: Una Introduzione a OpenCV - ispac.diet.uniroma1.itispac.diet.uniroma1.it/scarpiniti/files/LabEMM/Less10.pdf · Introduzione Le Strutture Dati Una Introduzione a OpenCV Prof. Michele

IntroduzioneLe Strutture Dati

IntroduzioneI primi passi

Aprire una foto con OpenCV

La funzione chiave del precedente script e

IplImage* img = cvLoadImage("nome");

che legge una stringa e carica in una matrice img, di tipo IplImage, tutti ipixel dell’immagine. Tale funzione determina in automatico il tipo di file ealloca la memoria necessaria per contenere l’immagine (numero di righe, dicolonne e di colori). I formati supportati sono: BMP, DIB, JPEG, JPE,PNG, PBM, PGM, PPM, SR, RAS e TIFF.Tale funzione restituisce il puntatore alla struttura allocata, che contiene,oltre ai dati, anche le informazioni relative dell’immagine.

M. Scarpiniti Una Introduzione a OpenCV 12 / 53

Page 13: Una Introduzione a OpenCV - ispac.diet.uniroma1.itispac.diet.uniroma1.it/scarpiniti/files/LabEMM/Less10.pdf · Introduzione Le Strutture Dati Una Introduzione a OpenCV Prof. Michele

IntroduzioneLe Strutture Dati

IntroduzioneI primi passi

Aprire una foto con OpenCV

Per visualizzare la foto e necessario creare una finestra in cui collocarla. Atal proposito, si utilizza la funzione

cvNamedWindow("Esempio1", CV_WINDOW_AUTOSIZE);

che crea la finestra e la nomina come ‘‘Esempio1’’. Il secondo argomen-to (CV WINDOW AUTOSIZE) determina le dimensioni della figura. In questocaso, la finestra sara adattata alle dimensioni dell’immagini. Al contrario epossibile inserire il valore 0: in questo caso la finestra ha una dimensionestandard e l’immagine sara scalata alle dimensioni della finestra.Per visualizzara l’immagine img nella finestra ‘‘Esempio1’’, si utilizzaquindi, la funzione

cvShowImage("Esempio1", img);

Ovviamente la finestra ‘‘Esempio1’’ deve essere create precedentementela chiamata di cvShowImage().

M. Scarpiniti Una Introduzione a OpenCV 13 / 53

Page 14: Una Introduzione a OpenCV - ispac.diet.uniroma1.itispac.diet.uniroma1.it/scarpiniti/files/LabEMM/Less10.pdf · Introduzione Le Strutture Dati Una Introduzione a OpenCV Prof. Michele

IntroduzioneLe Strutture Dati

IntroduzioneI primi passi

Aprire una foto con OpenCV

Per mettere in attesa il programma fino a che non si prema un tasto, siutilizza il comando

cvWaitKey (0);

L’argomento 0 (o un numero negativo) significa che si aspetta la pressionedi un tasto. Al contrario, se si inserisce un numero positivo, il programmaaspetta, in millisecondi, il tempo indicato.Quando viene premuto il tasto, bisogna rilasciare la memoria occupata eporre il puntatore all’immagine img a NULL. Queste operazioni sono eseguitedal comando

cvReleaseImage (&img);

Infine bisogna distruggere la finestra creata, e deallocare la memoria even-tualmente occupata, utilizzando

cvDestroyWindow("Esempio1");

M. Scarpiniti Una Introduzione a OpenCV 14 / 53

Page 15: Una Introduzione a OpenCV - ispac.diet.uniroma1.itispac.diet.uniroma1.it/scarpiniti/files/LabEMM/Less10.pdf · Introduzione Le Strutture Dati Una Introduzione a OpenCV Prof. Michele

IntroduzioneLe Strutture Dati

IntroduzioneI primi passi

Creare e salvare una foto con OpenCV

Per creare uno spazio di memoria che contenga un’immagine, e possibileutilizzare il comando seguente:

IplImage* image = cvCreateImage(CvSize size , int depth ,

int channels );

Viene restituito un puntatore ad una strutture di tipo IplImage. Vienerichiesto, al contrario, la dimensione dell’immagine in size (come larghezza- altezza), in numero di bit (in depth) e il numero di canali per pixel inchannels (1, 2, 3, o 4).Per salvare un’immagine, si utilizza invece

int cvSaveImage(char* filename , CvArr* image);

che prende in ingresso il nome del file e il puntatore all’immagine dasalvare. Restituisce 1 se il salvataggio e andato a buon fine, 0 altrimenti.

M. Scarpiniti Una Introduzione a OpenCV 15 / 53

Page 16: Una Introduzione a OpenCV - ispac.diet.uniroma1.itispac.diet.uniroma1.it/scarpiniti/files/LabEMM/Less10.pdf · Introduzione Le Strutture Dati Una Introduzione a OpenCV Prof. Michele

IntroduzioneLe Strutture Dati

IntroduzioneI primi passi

Aprire un video con OpenCV

Per aprire un video, e possibile utilizzare il seguente codice:

#include "highgui.h"

int main(int argc , char** argv)

{

cvNamedWindow("Esempio2", CV_WINDOW_AUTOSIZE);

CvCapture* capture = cvCreateFileCapture(argv [1]);

IplImage* frame;

while (1)

{

frame = cvQueryFrame(capture);

if (!frame) break;

cvShowImage("Esempio2", frame);

char c = cvWaitKey (33);

if (c == 27) break;

}

cvReleaseCapture (& capture);

cvDestroyWindow("Esempio2");

}

M. Scarpiniti Una Introduzione a OpenCV 16 / 53

Page 17: Una Introduzione a OpenCV - ispac.diet.uniroma1.itispac.diet.uniroma1.it/scarpiniti/files/LabEMM/Less10.pdf · Introduzione Le Strutture Dati Una Introduzione a OpenCV Prof. Michele

IntroduzioneLe Strutture Dati

IntroduzioneI primi passi

Aprire un video con OpenCV

Anche qui si crea un finestra attraverso la funzione cvNamedWindow(). Lafunzione principale, quella che carica il file video, e la seguente

CvCapture* capture = cvCreateFileCapture("nome_video");

Tale funzione carica un file video di tipo AVI e restituisce un puntatorecapture a idonea struttura CvCapture. Tale puntatore e quindi passatoalla funzione

frame = cvQueryFrame(capture);

che restituisce il frame corrente del video in un’immagine, descritta dalpuntatore frame alla struttura IplImage. Tale frame e quindi visualizzatocome immagine

cvShowImage("Esempio2", frame);

M. Scarpiniti Una Introduzione a OpenCV 17 / 53

Page 18: Una Introduzione a OpenCV - ispac.diet.uniroma1.itispac.diet.uniroma1.it/scarpiniti/files/LabEMM/Less10.pdf · Introduzione Le Strutture Dati Una Introduzione a OpenCV Prof. Michele

IntroduzioneLe Strutture Dati

IntroduzioneI primi passi

Aprire un video con OpenCV

Ogni 33 ms (cvWaitKey(33)) viene letto un nuovo frame e visualizzato,ripetendo all’infinito il ciclo while(1)

char c = cvWait (33);

Si esce dal ciclo quando viene letto il carattere con codice ASCII pari a 27,ovvero il tasto Esc.Viene quindi rilasciata la memoria attraverso il comando

cvReleaseCapture (& capture);

e infine distrutta la finestra con

cvDestroyWindow("Esempio2");

M. Scarpiniti Una Introduzione a OpenCV 18 / 53

Page 19: Una Introduzione a OpenCV - ispac.diet.uniroma1.itispac.diet.uniroma1.it/scarpiniti/files/LabEMM/Less10.pdf · Introduzione Le Strutture Dati Una Introduzione a OpenCV Prof. Michele

IntroduzioneLe Strutture Dati

IntroduzioneI primi passi

Leggere da WebCam con OpenCV

Vediamo il codice per ottenere le immagini da una webcam.

#include "cv.h"

#include "highgui.h"

int main( int argc , char** argv ) {

cvNamedWindow( "Esempio3", CV_WINDOW_AUTOSIZE );

CvCapture* capture;

if (argc ==1) {

capture = cvCreateCameraCapture( 0 );

} else {

capture = cvCreateFileCapture( argv [1] );

}

assert( capture != NULL );

IplImage* frame;

M. Scarpiniti Una Introduzione a OpenCV 19 / 53

Page 20: Una Introduzione a OpenCV - ispac.diet.uniroma1.itispac.diet.uniroma1.it/scarpiniti/files/LabEMM/Less10.pdf · Introduzione Le Strutture Dati Una Introduzione a OpenCV Prof. Michele

IntroduzioneLe Strutture Dati

IntroduzioneI primi passi

Leggere da WebCam con OpenCV

while (1) {

frame = cvQueryFrame(capture);

if( !frame ) break;

cvShowImage("Esempio3", frame);

char c = cvWaitKey (10);

if( c == 27 ) break;

}

cvReleaseCapture (& capture);

cvDestroyWindow("Esempio3");

}

Dopo aver al solito creato una finestra con cvNamedWindow(), si crea unpuntatore capture alla struttura dati CvCapture. Il video da webcam vienecreato attraverso la funzione

capture = cvCreateCameraCapture( 0 );

M. Scarpiniti Una Introduzione a OpenCV 20 / 53

Page 21: Una Introduzione a OpenCV - ispac.diet.uniroma1.itispac.diet.uniroma1.it/scarpiniti/files/LabEMM/Less10.pdf · Introduzione Le Strutture Dati Una Introduzione a OpenCV Prof. Michele

IntroduzioneLe Strutture Dati

IntroduzioneI primi passi

Leggere da WebCam con OpenCV

Se, al contrario, al programma precedente passo il nome di un file, vieneletto il video con quel nome.Il resto del programma e identico al caso del filmato.Ogni 10 ms (cvWaitKey(10)) viene letto un frame dal puntatore capture,con

frame = cvQueryFrame(capture);

e quindi mostrato nella finestra

cvShowImage( "Esempio3", frame );

Infine, quando viene premuto il tasto Esc (codice ASCII 27), vienerilasciata la memoria (cvReleaseCapture(&capture)) e distrutta lafinestra (cvDestroyWindow(‘‘Esempio3’’)).

M. Scarpiniti Una Introduzione a OpenCV 21 / 53

Page 22: Una Introduzione a OpenCV - ispac.diet.uniroma1.itispac.diet.uniroma1.it/scarpiniti/files/LabEMM/Less10.pdf · Introduzione Le Strutture Dati Una Introduzione a OpenCV Prof. Michele

IntroduzioneLe Strutture Dati

IntroduzioneI primi passi

Scrivere un file video con OpenCV

Nella presente slide, si cerchera di descrivere un codice per la scrittura su file AVI.

#include "cv.h"

#include "highgui.h"

#include <stdio.h>

int main( int argc , char* argv[] )

{

cvNamedWindow("Esempio4", CV_WINDOW_AUTOSIZE);

cvNamedWindow("Log_Polar", CV_WINDOW_AUTOSIZE);

CvCapture* capture = cvCreateFileCapture( argv [1] );

if (! capture){

return -1;

}

IplImage* bgr_frame = cvQueryFrame(capture);

double fps = cvGetCaptureProperty(capture ,CV_CAP_PROP_FPS);

CvSize size = cvSize(

(int)cvGetCaptureProperty( capture ,

CV_CAP_PROP_FRAME_WIDTH),

(int)cvGetCaptureProperty( capture ,

CV_CAP_PROP_FRAME_HEIGHT) );

M. Scarpiniti Una Introduzione a OpenCV 22 / 53

Page 23: Una Introduzione a OpenCV - ispac.diet.uniroma1.itispac.diet.uniroma1.it/scarpiniti/files/LabEMM/Less10.pdf · Introduzione Le Strutture Dati Una Introduzione a OpenCV Prof. Michele

IntroduzioneLe Strutture Dati

IntroduzioneI primi passi

Scrivere un file video con OpenCV

CvVideoWriter* writer = cvCreateVideoWriter(

argv[2],

CV_FOURCC(’D’,’X’,’V’,’0’),

fps ,

size );

IplImage* logpolar_frame = cvCreateImage(

size ,

IPL_DEPTH_8U ,

3 );

while( (bgr_frame = cvQueryFrame(capture)) != NULL )

{

cvShowImage("Esempio4", bgr_frame );

cvLogPolar( bgr_frame , logpolar_frame ,

cvPoint2D32f(bgr_frame ->width/2,

bgr_frame ->height /2),

40,

CV_INTER_LINEAR+CV_WARP_FILL_OUTLIERS );

cvShowImage("Log_Polar", logpolar_frame );

M. Scarpiniti Una Introduzione a OpenCV 23 / 53

Page 24: Una Introduzione a OpenCV - ispac.diet.uniroma1.itispac.diet.uniroma1.it/scarpiniti/files/LabEMM/Less10.pdf · Introduzione Le Strutture Dati Una Introduzione a OpenCV Prof. Michele

IntroduzioneLe Strutture Dati

IntroduzioneI primi passi

Scrivere un file video con OpenCV

cvWriteToAVI( writer , logpolar_frame );

char c = cvWaitKey (10);

if( c == 27 ) break;

}

cvReleaseVideoWriter( &writer );

cvReleaseImage( &bgr_frame );

cvReleaseImage( &logpolar_frame );

cvReleaseCapture( &capture );

cvDestroyWindow("Esempio4");

cvDestroyWindow("Log_Polar");

Il codice precedente carica e visualizza (nella finestra ‘‘Esempio4’’) un video

letto da file AVI. Contemporaneamente questo video verra convertito in un

formato logaritmico-polare, visualizzato nella finestra ‘‘Log Polar’’ e scritto

su file, sempre di tipo AVI.

M. Scarpiniti Una Introduzione a OpenCV 24 / 53

Page 25: Una Introduzione a OpenCV - ispac.diet.uniroma1.itispac.diet.uniroma1.it/scarpiniti/files/LabEMM/Less10.pdf · Introduzione Le Strutture Dati Una Introduzione a OpenCV Prof. Michele

IntroduzioneLe Strutture Dati

IntroduzioneI primi passi

Scrivere un file video con OpenCV

La funzione chiave del programma precedente e la seguente

CvVideoWriter* writer = cvCreateVideoWriter(

argv[2],

CV_FOURCC(’D’,’X’,’V’,’0’),

fps ,

size );

che restituisce un puntatore writer alla struttura CvVideoWriter. Talefunzione accetta 4 parametri in ingresso:

1 il nome del file da scrivere (letto da linea di comando) argv[2];

2 il codec video con cui sara compresso lo stream CV FOURCC();

3 il numero di frames per secondo fps;

4 la dimensionalita delle immagini (3 = a colori) size.

M. Scarpiniti Una Introduzione a OpenCV 25 / 53

Page 26: Una Introduzione a OpenCV - ispac.diet.uniroma1.itispac.diet.uniroma1.it/scarpiniti/files/LabEMM/Less10.pdf · Introduzione Le Strutture Dati Una Introduzione a OpenCV Prof. Michele

IntroduzioneLe Strutture Dati

IntroduzioneI primi passi

Scrivere un file video con OpenCV: i codec

OpenCV supporta i seguenti tipi di codec video:Codici Descrizione

CV FOURCC(’P’,’I’,’M’,’1’) MPEG-1 codecCV FOURCC(’M’,’J’,’P’,’G’) motion-jpeg codecCV FOURCC(’M’, ’P’, ’4’, ’2’) MPEG-4.2 codecCV FOURCC(’D’, ’I’, ’V’, ’3’) MPEG-4.3 codecCV FOURCC(’D’, ’I’, ’V’, ’X’) MPEG-4 codec (Dvix)CV FOURCC(’D’, ’X’, ’V’, ’0’) DVix vers 5 codecCV FOURCC(’X’, ’V’, ’I’, ’D’) Xvid codecCV FOURCC(’U’, ’2’, ’6’, ’3’) H263 codecCV FOURCC(’I’, ’2’, ’6’, ’3’) H263I codecCV FOURCC(’H’, ’2’, ’6’, ’4’) H264 codecCV FOURCC(’F’, ’L’, ’V’, ’1’) FLV1 codec

M. Scarpiniti Una Introduzione a OpenCV 26 / 53

Page 27: Una Introduzione a OpenCV - ispac.diet.uniroma1.itispac.diet.uniroma1.it/scarpiniti/files/LabEMM/Less10.pdf · Introduzione Le Strutture Dati Una Introduzione a OpenCV Prof. Michele

IntroduzioneLe Strutture Dati

IntroduzioneI primi passi

Scrivere un file video con OpenCV

La trasformazione logaritmico-polare dell’immagine avviene attraverso il coman-do:

cvLogPolar( bgr_frame ,

logpolar_frame ,

cvPoint2D32f(bgr_frame ->width/2, bgr_frame ->height

/2),

40,

CV_INTER_LINEAR+CV_WARP_FILL_OUTLIERS );

I primi due argomenti (bgr frame e logpolar frame) sono le immagini di origi-ne e destinazione della trasformazione logaritmico-polare, descritta dalle seguentitrasformazioni:

(x , y)→ (log r , θ),

in cui r =√

(x − xc)2 + (y − yc)2 e θ = arctan y−ycx−xc

e (xc , yc) e il punto centrale

dell’immagine di partenza. Le coordinate di tale punto vengono passate alla

precedente funzione come terzo parametro. Il quarto parametro e un fattore di

scala che seleziona la regione di interesse nella visualizzazione del nuovo dominio.

Infine il quinto parametro seleziona il metodi di interpolazione utilizzato.

M. Scarpiniti Una Introduzione a OpenCV 27 / 53

Page 28: Una Introduzione a OpenCV - ispac.diet.uniroma1.itispac.diet.uniroma1.it/scarpiniti/files/LabEMM/Less10.pdf · Introduzione Le Strutture Dati Una Introduzione a OpenCV Prof. Michele

IntroduzioneLe Strutture Dati

IntroduzioneI primi passi

Scrivere un file video con OpenCV

A questo punto il frame appena trasformato viene salvato nella strutturapuntata da writer, attraverso

cvWriteToAVI( writer , logpolar_frame );

Dopo la scrittura di tutti i frame, viene distrutto il puntatore alla strutturavideo, tramite

cvReleaseVideoWriter (& writer);

Infine viene rilasciata la memoria e distrutte le finestre:

cvReleaseImage( &bgr_frame );

cvReleaseImage( &logpolar_frame );

cvReleaseCapture( &capture );

cvDestroyWindow("Esempio4");

cvDestroyWindow("Log_Polar");

M. Scarpiniti Una Introduzione a OpenCV 28 / 53

Page 29: Una Introduzione a OpenCV - ispac.diet.uniroma1.itispac.diet.uniroma1.it/scarpiniti/files/LabEMM/Less10.pdf · Introduzione Le Strutture Dati Una Introduzione a OpenCV Prof. Michele

IntroduzioneLe Strutture Dati

Gestione delle matriciL’Istogramma

Le Strutture Dati

Le Strutture Dati

M. Scarpiniti Una Introduzione a OpenCV 29 / 53

Page 30: Una Introduzione a OpenCV - ispac.diet.uniroma1.itispac.diet.uniroma1.it/scarpiniti/files/LabEMM/Less10.pdf · Introduzione Le Strutture Dati Una Introduzione a OpenCV Prof. Michele

IntroduzioneLe Strutture Dati

Gestione delle matriciL’Istogramma

I tipi elementari

OpenCV utilizza le matrici per memorizzare immagini e frame. All’interno di talistrutture troviamo i tipi elementari di punto, dimensione, rettangolo, che vengonodefiniti come descritto nella seguente tabella.

Struttura Contenuto Descrizione

CvPoint int x, y Punto in un’immagineCvPoint2D32f float x, y Punto in R2

CvPoint3D32f flaot x, y, z Punto in R3

CvSize int width, height Dimensioni di un’immagineCvRect int x, y, width, height Porzione di un’immagineCvScalar double val[4] Valore RGBA

Cosı se si vuole disegnare un rettangolo (cvRectangle()) nell’immagine puntatada myImg, si utilizzera la chiamata

cvRectangle( myImg , cvPoint (5 ,10), cvPoint (20 ,30),

cvScalar (255 ,255 ,255) );

M. Scarpiniti Una Introduzione a OpenCV 30 / 53

Page 31: Una Introduzione a OpenCV - ispac.diet.uniroma1.itispac.diet.uniroma1.it/scarpiniti/files/LabEMM/Less10.pdf · Introduzione Le Strutture Dati Una Introduzione a OpenCV Prof. Michele

IntroduzioneLe Strutture Dati

Gestione delle matriciL’Istogramma

La struttura CvMat

La struttura fondamentale e la CvMat, che puo essere definita come

typedef struct CvMat {

int type;

int step;

int* refcount; // per uso interno

union {

uchar* ptr;

short* s;

int* i;

float* fl;

double* db;

} data;

union {

int rows;

int height;

};

union {

int cols;

int width;

};

} CvMat;

M. Scarpiniti Una Introduzione a OpenCV 31 / 53

Page 32: Una Introduzione a OpenCV - ispac.diet.uniroma1.itispac.diet.uniroma1.it/scarpiniti/files/LabEMM/Less10.pdf · Introduzione Le Strutture Dati Una Introduzione a OpenCV Prof. Michele

IntroduzioneLe Strutture Dati

Gestione delle matriciL’Istogramma

La struttura CvMat

Per creare un elemento di tipo CvMat e possibile eseguire il comando:

cvMat* cvCreateMat(int rows , int cols , int type);

E’ comunque possibile creare solamente l’header o i dati di una strutturaCvMat:

cvCreateMatHeader(int rows , int cols , int type);

cvCreateData(int rows , int cols , int type);

o clonare una matrice

mat2 = cvCloneMat(CvMat* mat1);

Infine, per deallocare la memoria, si utilizza

cvReleaseMat(CvMat ** mat);

M. Scarpiniti Una Introduzione a OpenCV 32 / 53

Page 33: Una Introduzione a OpenCV - ispac.diet.uniroma1.itispac.diet.uniroma1.it/scarpiniti/files/LabEMM/Less10.pdf · Introduzione Le Strutture Dati Una Introduzione a OpenCV Prof. Michele

IntroduzioneLe Strutture Dati

Gestione delle matriciL’Istogramma

La struttura IplImage

La struttura dati fondamentale per gestire le immagini e la IplImage, definita come segue:

typedef struct _IplImage {

int nSize;

int ID;

int nChannels;

int alphaChannel;

int depth;

char colorModel [4];

char channelSeq [4];

int dataOrder;

int origin;

int align;

int width;

int height;

struct _IplROI* roi;

struct _IplImage* maskROI;

void* imageId;

struct _IplTileInfo* tileInfo;

int imageSize;

char* imageData;

int widthStep;

int BorderMode [4];

int BorderConst [4];

char* imageDataOrigin;

} IplImage;

M. Scarpiniti Una Introduzione a OpenCV 33 / 53

Page 34: Una Introduzione a OpenCV - ispac.diet.uniroma1.itispac.diet.uniroma1.it/scarpiniti/files/LabEMM/Less10.pdf · Introduzione Le Strutture Dati Una Introduzione a OpenCV Prof. Michele

IntroduzioneLe Strutture Dati

Gestione delle matriciL’Istogramma

La struttura IplImage

Il valore del numero di bit, descritti dalla variabile depth, puo assumere unadelle seguenti alternativeMacro Tipo di pixel

IPL DEPTH 8U intero unsigned a 8 bitIPL DEPTH 8S intero signed a 8 bitIPL DEPTH 16S intero signed a 16 bitIPL DEPTH 32S intero signed a 32 bitIPL DEPTH 32F float singola precisione a 32 bitIPL DEPTH 64F float doppia precisione a 64 bit

M. Scarpiniti Una Introduzione a OpenCV 34 / 53

Page 35: Una Introduzione a OpenCV - ispac.diet.uniroma1.itispac.diet.uniroma1.it/scarpiniti/files/LabEMM/Less10.pdf · Introduzione Le Strutture Dati Una Introduzione a OpenCV Prof. Michele

IntroduzioneLe Strutture Dati

Gestione delle matriciL’Istogramma

Operazioni sulle immagini

Sulle immagini, che sono rappresentate da matrici in OpenCV e possibileutilizzare un insieme di oltre cento funzioni predefinite, che permettonodi sommare, sottrare, ruotare, determinare quantita statistiche, norme, ecc.L’utilizzo di tali funzioni e abbastanza immediato. Per maggiori informazionia riguardo, si rimanda alla guida di OpenCV, nonche a [1] e [2].Vengono poi messe a disposizione alcune funzioni per disegnare figure piuo meno elementari su una determinata finestra contenete un’immagine. Adesempio: linee, cerchi, ellissi, poligoni e testo. Anche queste funzioni sonodi utilizzo abbastanza immediato.Nel seguito vedremo alcune funzioni molto utili nelle applicazioni.

M. Scarpiniti Una Introduzione a OpenCV 35 / 53

Page 36: Una Introduzione a OpenCV - ispac.diet.uniroma1.itispac.diet.uniroma1.it/scarpiniti/files/LabEMM/Less10.pdf · Introduzione Le Strutture Dati Una Introduzione a OpenCV Prof. Michele

IntroduzioneLe Strutture Dati

Gestione delle matriciL’Istogramma

Operazioni sulle immagini: il resize

E’ possibile operare un’operazione di resize su una determinata immagine, attra-verso la funzione

void cvResize(

const CvArr* src ,

cvArr* dst ,

int interpolation = CV_INTER_LINEAR

);

Nella precedente funzione src e l’immagine originaria mentre dst e la nuova

struttura di dimensioni opportune che conterra l’immagine con le nuove

dimensioni. Poiche i pixel dell’immagine originale dovranno essere interpolati, e

possibile stabilire il metodo di interpolazione attraverso il terzo parametro

interpolation, le cui opzioni sono descritte nella seguente tabella:Interpolazione Metodo Descrizione

CV INTER NN Pixel piu vicino Il nuovo pixel assume il valore del pixel piu vicinoCV INTER LINEAR Bilineare Interpolazione bilineareCV INTER AREA Media su un’area Il pixel e sostituito con la media dell’area coperta dai vecchi pixelCV INTER CUBIC Bicubica Interpolazione bicubica

M. Scarpiniti Una Introduzione a OpenCV 36 / 53

Page 37: Una Introduzione a OpenCV - ispac.diet.uniroma1.itispac.diet.uniroma1.it/scarpiniti/files/LabEMM/Less10.pdf · Introduzione Le Strutture Dati Una Introduzione a OpenCV Prof. Michele

IntroduzioneLe Strutture Dati

Gestione delle matriciL’Istogramma

Operazioni sulle immagini: la convoluzione

Essenziale per il filtraggio di immagini e l’operazione di convoluzione bidi-mensionale, ottenuta attraverso la funzione

void cvFilter2D(

const CvArr* src ,

cvArr* dst ,

const CvMat* kernel ,

cvPoint anchor = cvPoint (-1,-1)

);

Nella precedente funzione src e l’immagine originaria mentre dst e lanuova struttura di dimensioni opportune che conterra l’immagine filtrata.kernal e una matrice contenente la risposta impulsiva del filtro. Il quartoparametro, anchor, e opzionale e indica il punto in cui centrare il filtrobidimensionale. L’opzione di default e il centro della matrice kernel.

M. Scarpiniti Una Introduzione a OpenCV 37 / 53

Page 38: Una Introduzione a OpenCV - ispac.diet.uniroma1.itispac.diet.uniroma1.it/scarpiniti/files/LabEMM/Less10.pdf · Introduzione Le Strutture Dati Una Introduzione a OpenCV Prof. Michele

IntroduzioneLe Strutture Dati

Gestione delle matriciL’Istogramma

Operazioni sulle immagini: la DFT

E’ possibile valuare la DFT bidimensionale

I (kx , ky ) =

Nx−1∑nx=0

Ny−1∑ny =0

I (nx , ny ) exp

(−2πj

Nxkxnx

)exp

(−2πj

Nykyny

),

attraverso la funzione

void cvDFT(

const CvArr* src ,

cvArr* dst ,

int flags

int nonzero_rows = 0

);

Nella precedente funzione src e l’immagine originaria mentre dst e la nuova struttura di

dimensioni opportune che conterra l’immagine in frequenza. flags e un parametro che

seleziona la trasformata diretta (CV DXT FORWARD) e inversa (CV DXT INVERSE). L’ultimo

parametro, nonzero rows, serve per gestire lo zero padding. Utilizzando la precedente

funzione e possibile implementare la convoluzione tra due immagine come prodotto delle

relative DFT.M. Scarpiniti Una Introduzione a OpenCV 38 / 53

Page 39: Una Introduzione a OpenCV - ispac.diet.uniroma1.itispac.diet.uniroma1.it/scarpiniti/files/LabEMM/Less10.pdf · Introduzione Le Strutture Dati Una Introduzione a OpenCV Prof. Michele

IntroduzioneLe Strutture Dati

Gestione delle matriciL’Istogramma

L’istogramma di un’immagine

Poiche moltissimi algoritmi di image processing si basano sul concetto di istogram-ma, diviene essenziale saper lavorare con questi ultimi in OpenCV. La struttura checontiene l’istogramma e definita come segue

typedef struct CvHistogram

{

int type;

CvArr* bins;

float thresh[CV_MAX_DIM ][2]; // for uniform histograms

float** thresh2; // for nonuniform histograms

CvMatND mat; // embedded matrix for array

histograms

} CvHistogram;

Nella precedente struttura, type indica il tipo di istogramma, ovvero se

mono-dimensionale o multi-dimensionale; bins contiene i bin dell’istogramma. Le

matrici thresh e thresh2 sono le soglie utilizzate per creare l’istogramma, nel

caso uniforme e non uniforme, rispettivamente. Infine, mat contiene i valori

dell’istogramma.

M. Scarpiniti Una Introduzione a OpenCV 39 / 53

Page 40: Una Introduzione a OpenCV - ispac.diet.uniroma1.itispac.diet.uniroma1.it/scarpiniti/files/LabEMM/Less10.pdf · Introduzione Le Strutture Dati Una Introduzione a OpenCV Prof. Michele

IntroduzioneLe Strutture Dati

Gestione delle matriciL’Istogramma

L’istogramma di un’immagine

Dopo aver definita la struttura CvHistogram e possibile creare un istogrammaattraverso

CvHistogram* cvCreateHist(

int dims ,

int* sizes ,

int type ,

float** ranges = NULL ,

int uniform = 1

);

Nella precedente funzione, dims indica il numero di dimensioni dell’istogramma.

sizes e un vettore di interi lungo quanto il numero di dimensioni, che indicano il

numero di bin da assegnare a ciascuna dimensione. type indica il tipo di

istogramma, ovvero se multidimensionale (CV HIST ARRAY) o di tipo sparso

(CV HIST SPARSE). La variabile ranges denota i limiti dell’istogramma, mentre la

variabile booleana uniform indica se stiamo utilizzando un istogramma uniforme

(valore positivo) oppure no (valore 0).

M. Scarpiniti Una Introduzione a OpenCV 40 / 53

Page 41: Una Introduzione a OpenCV - ispac.diet.uniroma1.itispac.diet.uniroma1.it/scarpiniti/files/LabEMM/Less10.pdf · Introduzione Le Strutture Dati Una Introduzione a OpenCV Prof. Michele

IntroduzioneLe Strutture Dati

Gestione delle matriciL’Istogramma

Manipolare un istogramma

Esistono alcune utili funzioni che consentono di manipolare un istogramma, precedente-mente creato. Precisamente

cvNormalizeHist( CvHistogram* hist, double factor ); che consente dinormalizzare un istogramma di un fattore factor;

cvThreshHist( CvHistogram* hist, double thresh ); che consente diapplicare una soglia thresh;

void cvCopyHist( const CvHistogram* src, CvHistogram** dst );

permette di copiare un istogramma contenuto in src nella nuova variabile dst.

void cvGetMinMaxHistValue(

const CvHistogram* hist ,

float* min_value ,

float* max_value ,

int* min_idx = NULL ,

int* max_idx = NULL );

consente di ottenere il valore minimo min value e il valore massimo max value diun istogramma hist. Le variabili min idx e max idx servono nel caso diistogrammi multi-dimensionali.

M. Scarpiniti Una Introduzione a OpenCV 41 / 53

Page 42: Una Introduzione a OpenCV - ispac.diet.uniroma1.itispac.diet.uniroma1.it/scarpiniti/files/LabEMM/Less10.pdf · Introduzione Le Strutture Dati Una Introduzione a OpenCV Prof. Michele

IntroduzioneLe Strutture Dati

Gestione delle matriciL’Istogramma

Manipolare un istogramma

E ancora:

void cvCalcHist(

IplImage ** image ,

CvHistogram* hist ,

int accumulate = 0,

const CvArr* mask = NULL );

consente di calcolare automaticamente l’istogramma hist di una immagine image.Il parametro accumulate, se non zero, consente di mantenere in memorial’istogramma. mask consente di escludere alcuni pixel dal calcolo dell’istogramma.

void cvEqualizeHist(

const CvArr* src ,

CvArr* dst );

consente di equalizzare un’immagine migliorandone il contrasto, in modo tale chel’immagine risultante dst abbia un istogramma piu piatto dell’immagine dipartenza src.

M. Scarpiniti Una Introduzione a OpenCV 42 / 53

Page 43: Una Introduzione a OpenCV - ispac.diet.uniroma1.itispac.diet.uniroma1.it/scarpiniti/files/LabEMM/Less10.pdf · Introduzione Le Strutture Dati Una Introduzione a OpenCV Prof. Michele

IntroduzioneLe Strutture Dati

Gestione delle matriciL’Istogramma

Manipolare un istogramma

Infine, e fondamentale la seguente funzione

void cvCompareHist(

const CvHistogram* hist1 ,

const CvHistogram* hist2 ,

int method

);

che consente di paragonare due istogrammi. La variabile method descrive la

particolare distanza utilizzata per paragonare i due istogrammi. I possibili valori

sono riassunti nella seguente tabellaMetodo Descrizione Espressione

CV COMP CORREL Correlazione dcorr (H1,H2) =∑

i (H1(i)−mH1)(H2(i)−mH2

)√∑i (H1(i)−mH1

)2(H2(i)−mH2)2

CV COMP CHISQR Chi-Quadro dchi (H1,H2) =∑

i(H1(i)−H2(i))2

H1(i)+H2(i)

CV COMP INTERSECT Intersezione dint (H1,H2) =∑

i min (H1(i),H2(i))

CV COMP BHATTACHARYYA Battacharria dBhatt (H1,H2) =

√1−

∑i

√H1(i)H2(i)√∑

i H1(i)·∑

i H2(i)

M. Scarpiniti Una Introduzione a OpenCV 43 / 53

Page 44: Una Introduzione a OpenCV - ispac.diet.uniroma1.itispac.diet.uniroma1.it/scarpiniti/files/LabEMM/Less10.pdf · Introduzione Le Strutture Dati Una Introduzione a OpenCV Prof. Michele

IntroduzioneLe Strutture Dati

Gestione delle matriciL’Istogramma

Back Projection

Con Back Projection si intende una tecnica con la quale si cerca di capire quantoalcuni pixel di un’immagine o alcune aree di un’immagine abbiano un istogrammasimile ad un istogramma di riferimento.Il primo scopo e raggiunto attraverso la funzione

void cvCalcBackProject(

IplImage ** image ,

CvArr* back_project ,

const CvHistogram* hist

);

in cui image e l’immagine da analizzare, back project contiene i valori

dell’istogramma dell’immagine image e hist contiene l’istogramma di

riferimento.

M. Scarpiniti Una Introduzione a OpenCV 44 / 53

Page 45: Una Introduzione a OpenCV - ispac.diet.uniroma1.itispac.diet.uniroma1.it/scarpiniti/files/LabEMM/Less10.pdf · Introduzione Le Strutture Dati Una Introduzione a OpenCV Prof. Michele

IntroduzioneLe Strutture Dati

Gestione delle matriciL’Istogramma

Back Projection

Nel secondo caso, siamo interessati ad una regione di pixel, che magari appartengono adun oggetto noto. Infatti, applicando una finestra mobile ad una data immagine, e possibiledeterminare in quali posizione l’istogramma della finestra e simile a quello di riferimento:in questi casi, infatti, e altamente possibile che la regione di analisi appartiene all’oggettocercato. Tale funzione e definita come segue:

void cvCalcBackProjectPatch(

IplImage ** image ,

CvArr* dst ,

CvSize patch_size ,

CvHistogram* hist ,

int method ,

float factor

);

in cui image e l’immagine da analizzare, dst conterra l’istogramma valutato,

patch size e l’ampiezza della finestra mobile, hist e l’istogramma di riferimento,

method e il metodo con cui e valutata la distanza tra i due istogramma e, infine, factor

e il fattore di normalizzazione.

M. Scarpiniti Una Introduzione a OpenCV 45 / 53

Page 46: Una Introduzione a OpenCV - ispac.diet.uniroma1.itispac.diet.uniroma1.it/scarpiniti/files/LabEMM/Less10.pdf · Introduzione Le Strutture Dati Una Introduzione a OpenCV Prof. Michele

IntroduzioneLe Strutture Dati

Gestione delle matriciL’Istogramma

Template Matching

Una tecnica simile alla Back Projection, ma non basata sull’istogramma, e il Tem-plate Matching. Essa e basata sul far scorrere una piccola immagine target suun’altra immagine da analizzare, al fine di capire se il target sia contenuta o menonell’immagine data. La funzione che implementa tale operazione e

void cvMatchTemplate(

const CvArr* image ,

const CvArr* templ ,

CvArr* result ,

int method

);

in cui image e l’immagine da analizzare, templ e l’immagine target, result e

l’immagine risultato e method rappresenta l’algoritmo di calcolo dell’immagine

risultante, elencato nella seguente tabella (con relativa versione normalizzata).Metodo Descrizione Metodo Normalizzato

CV TM SQDIFF Metodo della differenza quadratica CV TM SQDIFF NORMEDCV TM CCORR Metodo della correlazione CV TM CCORR NORMEDCV TM CCOEFF Metodo del coefficiente di correlazione CV TM CCOEFF NORMED

M. Scarpiniti Una Introduzione a OpenCV 46 / 53

Page 47: Una Introduzione a OpenCV - ispac.diet.uniroma1.itispac.diet.uniroma1.it/scarpiniti/files/LabEMM/Less10.pdf · Introduzione Le Strutture Dati Una Introduzione a OpenCV Prof. Michele

IntroduzioneLe Strutture Dati

Gestione delle matriciL’Istogramma

La calibrazione

Un passo fondamentale affinche il tutto funzioni correttamente, nel caso di utilizzouna web-camera, e la procedura di calibrazione.In pratica la calibrazione e effettuata identificando prima i bordi di una scacchierache viene mostrata alla camera e quindi invocando una funzione per la calibrazione.

M. Scarpiniti Una Introduzione a OpenCV 47 / 53

Page 48: Una Introduzione a OpenCV - ispac.diet.uniroma1.itispac.diet.uniroma1.it/scarpiniti/files/LabEMM/Less10.pdf · Introduzione Le Strutture Dati Una Introduzione a OpenCV Prof. Michele

IntroduzioneLe Strutture Dati

Gestione delle matriciL’Istogramma

La calibrazione

Le due funzioni precedenti sono, rispettivamente:

int cvFindChessboardCorners(

const void* image ,

CvSize pattern_size ,

CvPoint2D32f* corners ,

int* corner_count = NULL ,

int flags = CV_CALIB_CB_ADAPTIVE_THRESH

);

void cvCalibrationCamera2(

CvMat* object_points ,

CvMat* image_points ,

int* point_counts ,

CvSize image_size ,

CvMat* intrinsic_matrix ,

CvMat* distorsion_coeffs ,

CvMat* rotation_vectors = NULL ,

CvMat* translation_vectors = NULL ,

int flags = 0

);

Si rimanda a [1] per il significato di tutti i parametri.

M. Scarpiniti Una Introduzione a OpenCV 48 / 53

Page 49: Una Introduzione a OpenCV - ispac.diet.uniroma1.itispac.diet.uniroma1.it/scarpiniti/files/LabEMM/Less10.pdf · Introduzione Le Strutture Dati Una Introduzione a OpenCV Prof. Michele

IntroduzioneLe Strutture Dati

Gestione delle matriciL’Istogramma

Il Machine Learning

OpenCV mette a disposizione una libreria per il Machine Learning , in cui sonocontenuti molti algoritmi utili nelle applicazioni.Di seguito sono elencati gli algoritmi messi a disposizione:

Mahalanobis;

K-means;

Bayes Classifier;

Binary decision trees;

Boosting;

Random trees;

Haar Classifier;

Face detector;

Expectation Maximization (EM);

K-nearest neighbors;

Multilayer Perceptron (MLP);

Support Vector Machines (SVM).

Di seguito esamineremo in dettaglio un paio di algoritmi significativi.

M. Scarpiniti Una Introduzione a OpenCV 49 / 53

Page 50: Una Introduzione a OpenCV - ispac.diet.uniroma1.itispac.diet.uniroma1.it/scarpiniti/files/LabEMM/Less10.pdf · Introduzione Le Strutture Dati Una Introduzione a OpenCV Prof. Michele

IntroduzioneLe Strutture Dati

Gestione delle matriciL’Istogramma

Il K-means

L’algoritmo K-means si applica attraverso la seguente funzione

void cvKMeans2(

const CvArr* samples ,

int cluster_count ,

CvArr* labels ,

CvTermCriteria termcrit

);

in cui samples e un array multidimensionale su cui applicare il K-means,

cluster count e il numero di cluster, labels e un array contenete l’indice del

cluster relativo e termcrit e il criterio di stop utilizzato.

M. Scarpiniti Una Introduzione a OpenCV 50 / 53

Page 51: Una Introduzione a OpenCV - ispac.diet.uniroma1.itispac.diet.uniroma1.it/scarpiniti/files/LabEMM/Less10.pdf · Introduzione Le Strutture Dati Una Introduzione a OpenCV Prof. Michele

IntroduzioneLe Strutture Dati

Gestione delle matriciL’Istogramma

Il Face Detector

OpenCV mette a disposizione un potente algoritmo di face detection, basato su un clas-sificatore di Haar e proposto da Viola & Jones. Tutte le caratteristiche sono stateprecedentemente apprese e salvate in un file distribuito con OpenCV.La funzione per invocare il face detector e la seguente

CvSeq∗ c v H a a r D e t e c t O b j e c t s (c o n s t CvArr∗ image ,C v H a a r C l a s s i f i e r C a s c a d e∗ cascade ,CvMemstorage∗ s t o r a g e ,d o u b l e s c a l e f a c t o r = 1 . 1 ,i n t m i n n e i g h b o r s = 3 ,i n t f l a g s = 0 ,CvS ize m i n s i z e = c v S i z e ( 0 , 0 )

) ;

in cui image e l’immagine a scala di grigi i cui cercare le facce, cascade contiene le

caratteristiche del classificatore, storage e un buffur utilizzato dall’algoritmo,

scale factor e un fattore di scale che indica quanto elevato e il salto tra una scala e la

successiva, min neighbors indica il numero di detection contemporanee affinche venga

stabilito che effettivamente ci sia una faccia. flags permette di eliminare alcune ragioni

dell’immagine dalla ricerca e, infine, min size indica la dimensione piu piccola in cui

effettuare la ricerca.

M. Scarpiniti Una Introduzione a OpenCV 51 / 53

Page 52: Una Introduzione a OpenCV - ispac.diet.uniroma1.itispac.diet.uniroma1.it/scarpiniti/files/LabEMM/Less10.pdf · Introduzione Le Strutture Dati Una Introduzione a OpenCV Prof. Michele

IntroduzioneLe Strutture Dati

Gestione delle matriciL’Istogramma

Il Face Detector

A questo punto e possibile disegnare un rettangolo o un cerchio intornoalla faccia o alle facce individuate dalla funzione cvHaarDetectObjects(),per avere una rappresentazione grafica intuitiva del numero effettivo di facceindividuate.

M. Scarpiniti Una Introduzione a OpenCV 52 / 53

Page 53: Una Introduzione a OpenCV - ispac.diet.uniroma1.itispac.diet.uniroma1.it/scarpiniti/files/LabEMM/Less10.pdf · Introduzione Le Strutture Dati Una Introduzione a OpenCV Prof. Michele

IntroduzioneLe Strutture Dati

Gestione delle matriciL’Istogramma

Bibliografia

G. Bradski, A. Kaehler.

Learnin OpenCV: Computer Vision with the OpenCV Library.O’Reilly, 2008.

R. Laganiere.

OpenCV 2 Computer Vision - Application Programming Cookbook.PACKT Publishing,2011.

H. Schildt.

La Guida completa C.McGraw Hill, 2003.

P. Viola and M. J. Jones.

Rapid Object Detecting Using a Boosted cascade of Simple Features.IEEE CVPR, 2001.

P. Viola and M. J. Jones.

Robust Real-time Face Detection.International journal of Computer Vision, Vol. 57, pp. 137–154, 2004.

M. Scarpiniti Una Introduzione a OpenCV 53 / 53