Una Introduzione a OpenCV -...
Transcript of Una Introduzione a OpenCV -...
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
M. Scarpiniti Una Introduzione a OpenCV 1 / 53
IntroduzioneLe Strutture Dati
1 IntroduzioneIntroduzioneI primi passi
2 Le Strutture DatiGestione delle matriciL’Istogramma
M. Scarpiniti Una Introduzione a OpenCV 2 / 53
IntroduzioneLe Strutture Dati
IntroduzioneI primi passi
Introduzione
Introduzione
M. Scarpiniti Una Introduzione a OpenCV 3 / 53
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
IntroduzioneLe Strutture Dati
Gestione delle matriciL’Istogramma
Le Strutture Dati
Le Strutture Dati
M. Scarpiniti Una Introduzione a OpenCV 29 / 53
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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