La presentazione è in caricamento. Aspetta per favore

La presentazione è in caricamento. Aspetta per favore

1 Università degli Studi di Messina Facoltà di Ingegneria Visilab – Computer Vision and Image Processing Lab Librerie OpenCV Corso di Calcolatori Elettronici.

Presentazioni simili


Presentazione sul tema: "1 Università degli Studi di Messina Facoltà di Ingegneria Visilab – Computer Vision and Image Processing Lab Librerie OpenCV Corso di Calcolatori Elettronici."— Transcript della presentazione:

1 1 Università degli Studi di Messina Facoltà di Ingegneria Visilab – Computer Vision and Image Processing Lab Librerie OpenCV Corso di Calcolatori Elettronici II (Visione artificiale) Messina, 14/04/2011 Seminario tenuto dalling. Filippo Battaglia

2 2 Visilab – Computer Vision and Image Processing Lab University of Messina - Italy

3 3 OpenCV Sono le librerie open source più comuni per lesecuzione di algoritmi di visione artificiale. Rilasciate da Intel come OSS sotto licenza BSD (Berkeley Software License) Software License) Visilab – Computer Vision and Image Processing Lab University of Messina - Italy

4 4 Visilab – Computer Vision and Image Processing Lab University of Messina - Italy Le librerie OpenCV possono gestire svariati algoritmi di visione artificiale per mezzo di routine totalmente standardizzate Conversione RGB/YUV Rotazioni, scaling, translazioni Applicazione di filtri immagine Calcolo di istogrammi ed applicazione di soglie Applicazione di operatori (gradiente, laplaciano) Riconoscimento facciale Ricerca di connected component Algoritmi di segmentazione

5 5 Visilab – Computer Vision and Image Processing Lab University of Messina - Italy Per programmare con le librerie OpenCV è necessario procurarsi uno dei manuali applicativi presenti in rete OpenCVReferenceManual.pdf

6 6 Visilab – Computer Vision and Image Processing Lab University of Messina - Italy oppure alcuni libri Gary Bradsky, Kaehler Adrian Learning OpenCV: Computer Vision with the OpenCV Library Editrice OReilly

7 7 Visilab – Computer Vision and Image Processing Lab University of Messina - Italy Le librerie OpenCV supportano i linguaggi C, C++ e Python Sotto x86 possono essere usate sotto i 3 linguaggi, sotto Nanodesktop (PSP) possono essere usate solo sotto C e C++ (linking solo statico)

8 8 Visilab – Computer Vision and Image Processing Lab University of Messina - Italy Dal punto di vista del programmatore C, il sistema OpenCV è composto da quattro librerie cxcore Contiene le routine di manipolazione immagine a basso livello, funzioni di gestione della memoria, manipolazione degli array e dei vettori

9 9 Visilab – Computer Vision and Image Processing Lab University of Messina - Italy cv Le routine di calcolo istogrammi, trasformazioni geometriche, determinazione di feature sono contenute qui cvaux Contiene routine ausiliarie fondamentali per i sistemi di face detection Viola-Jones, e per la face recognition via HMM e PCA

10 10 Visilab – Computer Vision and Image Processing Lab University of Messina - Italy highgui Qui troverete le routine per - caricamento e salvataggio dei formati immagine supportati (BMP, JPG, PNG, and TIFF) - acquisizione da video camera - acquisizione da video AVI e MPG - gestione delle finestre del window manager HighGUI ha diverse dipendenze: - Usa Video4Linux sotto Linux e Video For Windows sotto Win32; - Richiede le librerie di gestione dei formati immagine (incluse sotto Win32) - Sotto Linux usa GTK+ e sotto Win32 usa Windows GDI

11 11 Visilab – Computer Vision and Image Processing Lab University of Messina - Italy La versione attuale delle librerie OpenCV per x86 è la 2.2 Per Nanodesktop PSPE/PSP è disponibile la versione 1.0 delle OpenCV

12 12 Visilab – Computer Vision and Image Processing Lab University of Messina - Italy Vediamo ora come è possibile installare le librerie OpenCV su PC (Per luso sotto Nanodesktop PSP, vi rimando alla Nanodesktop User Guide, capitolo 29) Qui mi occuperò esclusivamente dell installazione sotto Win32. Inoltre, useremo le OpenCV 2.1 e non le ultime 2.2 per ragioni di compatibilità

13 13 Visilab – Computer Vision and Image Processing Lab University of Messina - Italy Per prima cosa, è necessario scaricare dalla rete il pacchetto OpenCV 2.1. Il file OpenCV win32-vs2008.exe è un installer per Win32 che permette di installare le librerie e di settare correttamente la variabile PATH del sistema Win32. Questo è importante, perchè sotto Win32 OpenCV lavora per mezzo di 4 librerie dinamiche (cxcore210.dll, cv210.dll, cvcam210.dll, highgui210.dll)

14 14 Visilab – Computer Vision and Image Processing Lab University of Messina - Italy Adesso ci serve un IDE (Integrated Development Environment). In commercio ce ne sono diversi: io vi consiglio il buon, vecchio Dev-C++ (www.bloodshed.com)www.bloodshed.com che ha il vantaggio di essere utilizzabile anche per Nanodesktop. (Chi si diletta di programmazione Java può usare NetBeans + pacchetto supporto C++)

15 15 Visilab – Computer Vision and Image Processing Lab University of Messina - Italy Scarichiamo dunque linstaller di Dev-C beta1 dal sito di Bloodshed devcpp _setup.exe e provvediamo ad installarlo

16 16 Visilab – Computer Vision and Image Processing Lab University of Messina - Italy LIDE al primo avvio si presenta in questo modo

17 17 Creiamo un nuovo progetto Dev-C++ scegliendo Empty project Visilab – Computer Vision and Image Processing Lab University of Messina - Italy Dev-C++ chiederà una cartella dove salvare i file...

18 18 Adesso aggiungiamo un nuovo file che si chiamerà main.c Visilab – Computer Vision and Image Processing Lab University of Messina - Italy Click con il tasto destro, Nuova unità, e verrà creato un file chiamato Senza titolo. Lo salviamo come main.c

19 19 Visilab – Computer Vision and Image Processing Lab University of Messina - Italy Inseriamo il nostro primo programma OpenCV. Per ora non preoccupiamoci di come funziona #include #include int main (void) { IplImage *src; IplImage *src; char name [255]="c:\\lena.png"; char name [255]="c:\\lena.png"; cvNamedWindow("window",CV_WINDOW_AUTOSIZE); cvNamedWindow("window",CV_WINDOW_AUTOSIZE); src=cvLoadImage(name, 1); src=cvLoadImage(name, 1); cvShowImage("window", src); cvShowImage("window", src); cvWaitKey(0); cvWaitKey(0); cvDestroyWindow("window"); cvDestroyWindow("window"); cvReleaseImage(&src); cvReleaseImage(&src);}

20 20 Per compilare, dobbiamo dire a Dev-C++ dove trovare i file headers che abbiamo inserito nel sorgente. Click con il tasto destro sul nome del progetto a sinistra, Opzioni progetto, ed andiamo nel tab Cartelle Include Visilab – Computer Vision and Image Processing Lab University of Messina - Italy

21 21 Le cartelle Include da inserire sono le seguenti \include\opencv \include\opencv Dove è la cartella dove avete installato le librerie OpenCV Visilab – Computer Vision and Image Processing Lab University of Messina - Italy

22 22 Adesso diciamo al linker (ld) dove trovare le librerie OpenCV (sotto Win32 sono dinamiche) che serviranno per il nostro programma. Click con il tasto destro sul nome del progetto a sinistra, Opzioni progetto, ed andiamo nel tab Cartella Librerie Visilab – Computer Vision and Image Processing Lab University of Messina - Italy

23 23 Le cartelle di ricerca per il linker da inserire sono le seguenti \bin \binATTENZIONE: La sottocartella \lib contiene le librerie a collegamento dinamico per Linux (.lib) !!!! Ma noi siamo sotto Win32, quindi ci servono le librerie dll che sono in \bin. Visilab – Computer Vision and Image Processing Lab University of Messina - Italy

24 24 Infine, dobbiamo dire al linker (ld) che librerie dinamiche linkare. Andiamo nel tab Parametri, textbox Linker... Visilab – Computer Vision and Image Processing Lab University of Messina - Italy ed inseriamo le librerie dinamiche che sono necessarie

25 25 Sotto Win32 ci servono le dll: -lcxcore210-lcv210-lcvaux210-lhighgui210 Nota: gli utenti Linux invece usano le librerie (.lib) -lcxcore-lcv-lcvaux-lhighgui Visilab – Computer Vision and Image Processing Lab University of Messina - Italy

26 26 Visilab – Computer Vision and Image Processing Lab University of Messina - Italy Siamo pronti. Clicchiamo su Ok per confermare i parametri e torniamo allinterfaccia principale. Adesso Menu/Compila ed esegui

27 27 Visilab – Computer Vision and Image Processing Lab University of Messina - Italy Il nostro programma visualizza il file C:\lena.png sullo schermo, perciò dobbiamo assicurarci che il file sia presente sullhard disk prima di lanciare il programma #include #include int main (void) { IplImage *src; IplImage *src; char name [255]="c:\\lena.png"; char name [255]="c:\\lena.png"; cvNamedWindow("window",CV_WINDOW_AUTOSIZE); cvNamedWindow("window",CV_WINDOW_AUTOSIZE); src=cvLoadImage(name, 1); src=cvLoadImage(name, 1); cvShowImage("window", src); cvShowImage("window", src); cvWaitKey(0); cvWaitKey(0); cvDestroyWindow("window"); cvDestroyWindow("window"); cvReleaseImage(&src); cvReleaseImage(&src);}

28 28 Visilab – Computer Vision and Image Processing Lab University of Messina - Italy E questo è il risultato

29 29 Visilab – Computer Vision and Image Processing Lab University of Messina - Italy Ok, abbiamo visto che funziona. Adesso torniamo al nostro programma ed analizziamolo nelle sue componenti

30 30 Visilab – Computer Vision and Image Processing Lab University of Messina - Italy Le direttive include permettono al compilatore di trovare i prototipi delle funzioni delle librerie cxcore, cv e highgui. #include #include int main (void) { IplImage *src; IplImage *src; char name [255]="c:\\lena.png"; char name [255]="c:\\lena.png"; cvNamedWindow("window",CV_WINDOW_AUTOSIZE); cvNamedWindow("window",CV_WINDOW_AUTOSIZE); src=cvLoadImage(name, 1); src=cvLoadImage(name, 1); cvShowImage("window", src); cvShowImage("window", src); cvWaitKey(0); cvWaitKey(0); cvDestroyWindow("window"); cvDestroyWindow("window"); cvReleaseImage(&src); cvReleaseImage(&src);}

31 31 Visilab – Computer Vision and Image Processing Lab University of Messina - Italy Ogni immagine OpenCV è contenuta in una struct di tipo IplImage, che ne contiene tutti i parametri ed i pixel. OpenCV, però, in genere non agisce sulle struct IplImage, ma su puntatori a tali struct #include #include int main (void) { IplImage *src; IplImage *src; char name [255]="c:\\lena.png"; char name [255]="c:\\lena.png"; cvNamedWindow("window",CV_WINDOW_AUTOSIZE); cvNamedWindow("window",CV_WINDOW_AUTOSIZE); src=cvLoadImage(name, 1); src=cvLoadImage(name, 1); cvShowImage("window", src); cvShowImage("window", src); cvWaitKey(0); cvWaitKey(0); cvDestroyWindow("window"); cvDestroyWindow("window"); cvReleaseImage(&src); cvReleaseImage(&src);}

32 32 Visilab – Computer Vision and Image Processing Lab University of Messina - Italy cvLoadImage carica limmagine, alloca la struct IplImage necessaria a contenerne i dati, e restituisce in uscita un puntatore a tale struct. #include #include int main (void) { IplImage *src; IplImage *src; char name [255]="c:\\lena.png"; char name [255]="c:\\lena.png"; cvNamedWindow("window",CV_WINDOW_AUTOSIZE); cvNamedWindow("window",CV_WINDOW_AUTOSIZE); src=cvLoadImage(name, 1); src=cvLoadImage(name, 1); cvShowImage("window", src); cvShowImage("window", src); cvWaitKey(0); cvWaitKey(0); cvDestroyWindow("window"); cvDestroyWindow("window"); cvReleaseImage(&src); cvReleaseImage(&src);} Se il puntatore restituito è zero (NULL), allora il processo di caricamento è fallito.

33 33 Visilab – Computer Vision and Image Processing Lab University of Messina - Italy Quando limmagine non serve più, possiamo liberare larea di memoria ad essa associata tramite cvReleaseImage. #include #include int main (void) { IplImage *src; IplImage *src; char name [255]="c:\\lena.png"; char name [255]="c:\\lena.png"; cvNamedWindow("window",CV_WINDOW_AUTOSIZE); cvNamedWindow("window",CV_WINDOW_AUTOSIZE); src=cvLoadImage(name, 1); src=cvLoadImage(name, 1); cvShowImage("window", src); cvShowImage("window", src); cvWaitKey(0); cvWaitKey(0); cvDestroyWindow("window"); cvDestroyWindow("window"); cvReleaseImage(&src); cvReleaseImage(&src);} Il puntatore src potrà essere riutilizzato per altre immagini

34 34 Visilab – Computer Vision and Image Processing Lab University of Messina - Italy Per creare una finestra, si usa cvNamedWindow. Ogni finestra è identificata per mezzo di una stringa (nome) #include #include int main (void) { IplImage *src; IplImage *src; char name [255]="c:\\lena.png"; char name [255]="c:\\lena.png"; cvNamedWindow("window",CV_WINDOW_AUTOSIZE); cvNamedWindow("window",CV_WINDOW_AUTOSIZE); src=cvLoadImage(name, 1); src=cvLoadImage(name, 1); cvShowImage("window", src); cvShowImage("window", src); cvWaitKey(0); cvWaitKey(0); cvDestroyWindow("window"); cvDestroyWindow("window"); cvReleaseImage(&src); cvReleaseImage(&src);} Quando una finestra non serve più, si può usare cvDestroyWindow

35 35 Visilab – Computer Vision and Image Processing Lab University of Messina - Italy Per visualizzare una immagine caricata in una finestra si usa cvShowImage. #include #include int main (void) { IplImage *src; IplImage *src; char name [255]="c:\\lena.png"; char name [255]="c:\\lena.png"; cvNamedWindow("window",CV_WINDOW_AUTOSIZE); cvNamedWindow("window",CV_WINDOW_AUTOSIZE); src=cvLoadImage(name, 1); src=cvLoadImage(name, 1); cvShowImage("window", src); cvShowImage("window", src); cvWaitKey(0); cvWaitKey(0); cvDestroyWindow("window"); cvDestroyWindow("window"); cvReleaseImage(&src); cvReleaseImage(&src);}

36 36 Visilab – Computer Vision and Image Processing Lab University of Messina - Italy cvWaitKey(ms) sospende lesecuzione finchè non viene premuto un tasto o non trascorrono ms millisec. (ms=0, attendi per sempre) #include #include int main (void) { IplImage *src; IplImage *src; char name [255]="c:\\lena.png"; char name [255]="c:\\lena.png"; cvNamedWindow("window",CV_WINDOW_AUTOSIZE); cvNamedWindow("window",CV_WINDOW_AUTOSIZE); src=cvLoadImage(name, 1); src=cvLoadImage(name, 1); cvShowImage("window", src); cvShowImage("window", src); cvWaitKey(0); cvWaitKey(0); cvDestroyWindow("window"); cvDestroyWindow("window"); cvReleaseImage(&src); cvReleaseImage(&src);} Sotto Win32 determina anche una chiamata al driver video per il flushing delle chiamate in coda (chiamate cvWaitKey(1) )

37 37 Visilab – Computer Vision and Image Processing Lab University of Messina - Italy Bene, ora vediamo come possiamo usare le librerie OpenCV per applicare un filtro gaussiano ad una immagine

38 38 Visilab – Computer Vision and Image Processing Lab University of Messina - Italy Dal corso di elaborazione delle immagini sappiamo che applicare un filtro gaussiano ad una immagine significa eseguire il prodotto della f-trasformata dellimmagine di lavoro per una funzione gaussiana che taglierà le frequenze spaziali di valore più elevato La f-trasformata che otteniamo viene poi antitrasformata ottenendo limmagine finale.

39 39 Visilab – Computer Vision and Image Processing Lab University of Messina - Italy Siccome le componenti frequenziali più elevate di una immagine sono associate ai particolari più fini (ed al rumore salt and pepper...), nel momento in cui noi le attenuiamo tramite un filtro gaussiano otterremo unimmagine con dettagli meno definiti (smoothing).

40 40 Visilab – Computer Vision and Image Processing Lab University of Messina - Italy La funzione che ci serve si chiama void cvSmooth (const CvArr* src, CvArr* dst, int smoothtype=CV_GAUSSIAN, int param1=3, int param2=0, double param3=0, double param4=0)

41 41 Visilab – Computer Vision and Image Processing Lab University of Messina - Italy dove - src è limmagine IPL sorgente; - dst è limmagine di destinazione - smoothtype è una costante che indica il tipo di smoothing. Per esempio, può essere indica il tipo di smoothing. Per esempio, può essere CV_BLUR, CV_GAUSSIAN o CV_MEDIAN CV_BLUR, CV_GAUSSIAN o CV_MEDIAN - param1 è inv. proporzionale alla sigma che verrà usata nella gaussiana. Per i filtri blur, verrà usata nella gaussiana. Per i filtri blur, param1*param2 indica le dimensioni della finestra param1*param2 indica le dimensioni della finestra - gli altri parametri (param3 e param4) possono essere posti a 0 per ora. essere posti a 0 per ora.

42 42 Visilab – Computer Vision and Image Processing Lab University of Messina - Italy Ok, il programma che ci serve è il seguente #include #include int main (void) { IplImage *src, *dst; IplImage *src, *dst; char name [255]="c:\\lena.png"; char name [255]="c:\\lena.png"; cvNamedWindow("window src",CV_WINDOW_AUTOSIZE); cvNamedWindow("window src",CV_WINDOW_AUTOSIZE); cvNamedWindow("window dst",CV_WINDOW_AUTOSIZE); cvNamedWindow("window dst",CV_WINDOW_AUTOSIZE); src=cvLoadImage(name, 0); // Carica a toni di grigio src=cvLoadImage(name, 0); // Carica a toni di grigio dst=cvCreateImage( cvSize(src->width, src->height), IPL_DEPTH_8U, 1); dst=cvCreateImage( cvSize(src->width, src->height), IPL_DEPTH_8U, 1); cvSmooth (src, dst, CV_GAUSSIAN, 9, 0, 0, 0); cvSmooth (src, dst, CV_GAUSSIAN, 9, 0, 0, 0); cvShowImage("window src", src); cvShowImage("window src", src); cvShowImage("window dst", dst); cvShowImage("window dst", dst); cvWaitKey(0); cvWaitKey(0); cvDestroyWindow ("window src"); cvDestroyWindow ("window src"); cvDestroyWindow (window dst); cvDestroyWindow (window dst); cvReleaseImage(&src); cvReleaseImage(&src); cvReleaseImage(&dst); cvReleaseImage(&dst);}

43 43 Visilab – Computer Vision and Image Processing Lab University of Messina - Italy Notate che stavolta abbiamo creato 2 finestre: una per limmagine sorgente ed una per limmagine di destinazione #include #include int main (void) { IplImage *src, *dst; IplImage *src, *dst; char name [255]="c:\\lena.png"; char name [255]="c:\\lena.png"; cvNamedWindow("window src",CV_WINDOW_AUTOSIZE); cvNamedWindow("window src",CV_WINDOW_AUTOSIZE); cvNamedWindow("window dst",CV_WINDOW_AUTOSIZE); cvNamedWindow("window dst",CV_WINDOW_AUTOSIZE); src=cvLoadImage(name, 0); src=cvLoadImage(name, 0); dst=cvCreateImage( cvSize(src->width, src->height), IPL_DEPTH_8U, 1); dst=cvCreateImage( cvSize(src->width, src->height), IPL_DEPTH_8U, 1); cvSmooth (src, dst, CV_GAUSSIAN, 9, 0, 0, 0); cvSmooth (src, dst, CV_GAUSSIAN, 9, 0, 0, 0); cvShowImage("window src", src); cvShowImage("window src", src); cvShowImage("window dst", dst); cvShowImage("window dst", dst); cvWaitKey(0); cvWaitKey(0); cvDestroyWindow("window src"); cvDestroyWindow("window src"); cvDestroyWindow(window dst); cvDestroyWindow(window dst); cvReleaseImage(&src); cvReleaseImage(&src); cvReleaseImage(&dst); cvReleaseImage(&dst);}

44 44 Visilab – Computer Vision and Image Processing Lab University of Messina - Italy Abbiamo il problema di creare una immagine che abbia le stesse dimensioni della sorgente. Usiamo cvCreateImage per creare una immagine vuota #include #include int main (void) { IplImage *src, *dst; IplImage *src, *dst; char name [255]="c:\\lena.png"; char name [255]="c:\\lena.png"; cvNamedWindow("window src",CV_WINDOW_AUTOSIZE); cvNamedWindow("window src",CV_WINDOW_AUTOSIZE); cvNamedWindow("window dst",CV_WINDOW_AUTOSIZE); cvNamedWindow("window dst",CV_WINDOW_AUTOSIZE); src=cvLoadImage(name, 0); src=cvLoadImage(name, 0); dst=cvCreateImage( cvSize(src->width, src->height), IPL_DEPTH_8U, 1); dst=cvCreateImage( cvSize(src->width, src->height), IPL_DEPTH_8U, 1); cvSmooth (src, dst, CV_GAUSSIAN, 9, 0, 0, 0); cvSmooth (src, dst, CV_GAUSSIAN, 9, 0, 0, 0); cvShowImage("window src", src); cvShowImage("window src", src); cvShowImage("window dst", dst); cvShowImage("window dst", dst); cvWaitKey(0); cvWaitKey(0); cvDestroyWindow("window src"); cvDestroyWindow("window src"); cvDestroyWindow (window dst); cvDestroyWindow (window dst); cvReleaseImage(&src); cvReleaseImage(&dst); cvReleaseImage(&src); cvReleaseImage(&dst);}

45 45 Visilab – Computer Vision and Image Processing Lab University of Messina - Italy cvSmooth() eseguirà il filtraggio vero e proprio #include #include int main (void) { IplImage *src, *dst; IplImage *src, *dst; char name [255]="c:\\lena.png"; char name [255]="c:\\lena.png"; cvNamedWindow("window src",CV_WINDOW_AUTOSIZE); cvNamedWindow("window src",CV_WINDOW_AUTOSIZE); cvNamedWindow("window dst",CV_WINDOW_AUTOSIZE); cvNamedWindow("window dst",CV_WINDOW_AUTOSIZE); src=cvLoadImage(name, 0); src=cvLoadImage(name, 0); dst=cvCreateImage( cvSize(src->width, src->height), IPL_DEPTH_8U, 1); dst=cvCreateImage( cvSize(src->width, src->height), IPL_DEPTH_8U, 1); cvSmooth (src, dst, CV_GAUSSIAN, 9, 0, 0, 0); cvSmooth (src, dst, CV_GAUSSIAN, 9, 0, 0, 0); cvShowImage("window src", src); cvShowImage("window src", src); cvShowImage("window dst", dst); cvShowImage("window dst", dst); cvWaitKey(0); cvWaitKey(0); cvDestroyWindow("window src"); cvDestroyWindow("window src"); cvDestroyWindow(window dst); cvDestroyWindow(window dst); cvReleaseImage(&src); cvReleaseImage(&src); cvReleaseImage(&dst); cvReleaseImage(&dst);}

46 46 Visilab – Computer Vision and Image Processing Lab University of Messina - Italy Dopo avere creato le due immagini IPL in memoria, dobbiamo visualizzarle in due finestre #include #include int main (void) { IplImage *src, *dst; IplImage *src, *dst; char name [255]="c:\\lena.png"; char name [255]="c:\\lena.png"; cvNamedWindow("window src",CV_WINDOW_AUTOSIZE); cvNamedWindow("window src",CV_WINDOW_AUTOSIZE); cvNamedWindow("window dst",CV_WINDOW_AUTOSIZE); cvNamedWindow("window dst",CV_WINDOW_AUTOSIZE); src=cvLoadImage(name, 0); src=cvLoadImage(name, 0); dst=cvCreateImage( cvSize(src->width, src->height), IPL_DEPTH_8U, 1); dst=cvCreateImage( cvSize(src->width, src->height), IPL_DEPTH_8U, 1); cvSmooth (src, dst, CV_GAUSSIAN, 9, 0, 0, 0); cvSmooth (src, dst, CV_GAUSSIAN, 9, 0, 0, 0); cvShowImage("window src", src); cvShowImage("window src", src); cvShowImage("window dst", dst); cvShowImage("window dst", dst); cvWaitKey(0); cvWaitKey(0); cvDestroyWindow("window src"); cvDestroyWindow("window src"); cvDestroyWindow(window dst); cvDestroyWindow(window dst); cvReleaseImage(&src); cvReleaseImage(&src); cvReleaseImage(&dst); cvReleaseImage(&dst);}

47 47 Visilab – Computer Vision and Image Processing Lab University of Messina - Italy Dopo che lutente ha premuto un tasto, cancelliamo le due finestre e liberiamo la memoria impegnata dalle 2 immagini #include #include int main (void) { IplImage *src, *dst; IplImage *src, *dst; char name [255]="c:\\lena.png"; char name [255]="c:\\lena.png"; cvNamedWindow("window src",CV_WINDOW_AUTOSIZE); cvNamedWindow("window src",CV_WINDOW_AUTOSIZE); cvNamedWindow("window dst",CV_WINDOW_AUTOSIZE); cvNamedWindow("window dst",CV_WINDOW_AUTOSIZE); src=cvLoadImage(name, 0); src=cvLoadImage(name, 0); dst=cvCreateImage( cvSize(src->width, src->height), IPL_DEPTH_8U, 1); dst=cvCreateImage( cvSize(src->width, src->height), IPL_DEPTH_8U, 1); cvSmooth (src, dst, CV_GAUSSIAN, 9, 0, 0, 0); cvSmooth (src, dst, CV_GAUSSIAN, 9, 0, 0, 0); cvShowImage("window src", src); cvShowImage("window src", src); cvShowImage("window dst", dst); cvShowImage("window dst", dst); cvWaitKey(0); cvWaitKey(0); cvDestroyWindow("window src"); cvDestroyWindow("window src"); cvDestroyWindow(window dst); cvDestroyWindow(window dst); cvReleaseImage(&src); cvReleaseImage(&src); cvReleaseImage(&dst); cvReleaseImage(&dst);}

48 48 Visilab – Computer Vision and Image Processing Lab University of Messina - Italy E questo è il risultato (param1=9)

49 49 Visilab – Computer Vision and Image Processing Lab University of Messina - Italy Invece questo è il risultato per param1=31

50 50 Visilab – Computer Vision and Image Processing Lab University of Messina - Italy Supponiamo adesso di volere eseguire una operazione diversa, come il thresholding Come sapete, loperazione di thresholding restituisce una immagine binaria, in cui i pixel di intensità diversa da 0 rispondono ad una condizione (di solito che i(x,y)>T)

51 51 Visilab – Computer Vision and Image Processing Lab University of Messina - Italy Per eseguire il thresholding, abbiamo bisogno di una funzione OpenCV chiamatacvThreshold Il cui prototipo è il seguente: void cvThreshold ( const CvArr* src, CvArr* dst, double threshold, double threshold, double maxValue, double maxValue, int thresholdType ); int thresholdType );

52 52 Visilab – Computer Vision and Image Processing Lab University of Messina - Italy Nellesecuzione del thresholding, è fondamentale il valore del parametro thresholdtype perchè definisce il tipo di sogliatura che possiamo eseguire. Precisamente, esso può assumere i seguenti valori:thresholdType=CV_THRESH_BINARY: dst(x,y) = maxValue, if src(x,y)>threshold 0, otherwise 0, otherwise

53 53 Visilab – Computer Vision and Image Processing Lab University of Messina - Italy thresholdType=CV_THRESH_BINARY_INV: dst(x,y) = 0, if src(x,y)>threshold maxValue, otherwise maxValue, otherwisethresholdType=CV_THRESH_TRUNC: dst(x,y) = threshold, if src(x,y)>threshold src(x,y), otherwise src(x,y), otherwisethresholdType=CV_THRESH_TOZERO: dst(x,y) = src(x,y), if (x,y)>threshold 0, otherwise 0, otherwise

54 54 Visilab – Computer Vision and Image Processing Lab University of Messina - Italy thresholdType=CV_THRESH_TOZERO_INV: dst(x,y) = 0, if src(x,y)>threshold src(x,y), otherwise src(x,y), otherwise Notate che tutti questi metodi sono a soglia fissa. Stiamo cioè parlando di meccanismi di sogliatura di tipo non adattativo. Vediamo ora qualche esempio applicativo.

55 55 Visilab – Computer Vision and Image Processing Lab University of Messina - Italy Questo è il programma che useremo sotto OpenCV per x86 #include #include int main (void) { IplImage *src, *dst; IplImage *src, *dst; char name [255]="c:\\lena.png"; char name [255]="c:\\lena.png"; cvNamedWindow("window src",CV_WINDOW_AUTOSIZE); cvNamedWindow("window src",CV_WINDOW_AUTOSIZE); cvNamedWindow("window dst",CV_WINDOW_AUTOSIZE); cvNamedWindow("window dst",CV_WINDOW_AUTOSIZE); src=cvLoadImage(name, 0); src=cvLoadImage(name, 0); dst=cvCreateImage( cvSize(src->width, src->height), IPL_DEPTH_8U, 1); dst=cvCreateImage( cvSize(src->width, src->height), IPL_DEPTH_8U, 1); cvThreshold (src, dst, 128, 255, CV_THRESH_BINARY); cvThreshold (src, dst, 128, 255, CV_THRESH_BINARY); cvShowImage("window src", src); cvShowImage("window src", src); cvShowImage("window dst", dst); cvShowImage("window dst", dst); cvWaitKey(0); cvWaitKey(0); cvDestroyWindow ("window src"); cvDestroyWindow ("window src"); cvDestroyWindow (window dst); cvDestroyWindow (window dst); cvReleaseImage(&src); cvReleaseImage(&src); cvReleaseImage(&dst); cvReleaseImage(&dst);}

56 56 Visilab – Computer Vision and Image Processing Lab University of Messina - Italy Se proviamo ad eseguire il thresholding su Lena, otterremo questo:

57 57 Visilab – Computer Vision and Image Processing Lab University of Messina - Italy Vediamo che succede quando proviamo ad eseguire un thresholding binario inverso. Usiamo CV_THRESH_BINARY_INV

58 58 Visilab – Computer Vision and Image Processing Lab University of Messina - Italy Questo è il programma che useremo sotto OpenCV per x86 #include #include int main (void) { IplImage *src, *dst; IplImage *src, *dst; char name [255]="c:\\lena.png"; char name [255]="c:\\lena.png"; cvNamedWindow("window src",CV_WINDOW_AUTOSIZE); cvNamedWindow("window src",CV_WINDOW_AUTOSIZE); cvNamedWindow("window dst",CV_WINDOW_AUTOSIZE); cvNamedWindow("window dst",CV_WINDOW_AUTOSIZE); src=cvLoadImage(name, 0); src=cvLoadImage(name, 0); dst=cvCreateImage( cvSize(src->width, src->height), IPL_DEPTH_8U, 1); dst=cvCreateImage( cvSize(src->width, src->height), IPL_DEPTH_8U, 1); cvThreshold (src, dst, 128, 255, CV_THRESH_BINARY_INV); cvThreshold (src, dst, 128, 255, CV_THRESH_BINARY_INV); cvShowImage("window src", src); cvShowImage("window src", src); cvShowImage("window dst", dst); cvShowImage("window dst", dst); cvWaitKey(0); cvWaitKey(0); cvDestroyWindow ("window src"); cvDestroyWindow ("window src"); cvDestroyWindow (window dst); cvDestroyWindow (window dst); cvReleaseImage(&src); cvReleaseImage(&src); cvReleaseImage(&dst); cvReleaseImage(&dst);}

59 59 Visilab – Computer Vision and Image Processing Lab University of Messina - Italy Se proviamo ad eseguire il thresholding su Lena, otterremo questo:

60 60 Visilab – Computer Vision and Image Processing Lab University of Messina - Italy Supponiamo ora di volere tagliare (a zero) tutti i valori di luminosità minori di una certa soglia T. Per i valori di luminosità superiori alla soglia T noi non imporremo un valore (255) ma prenderemo il valore originale i(x;y). Il tipo di thresholding che ci serve si chiama: CV_THRESH_TOZERO

61 61 Visilab – Computer Vision and Image Processing Lab University of Messina - Italy Questo è il programma che useremo sotto OpenCV per x86 #include #include int main (void) { IplImage *src, *dst; IplImage *src, *dst; char name [255]="c:\\lena.png"; char name [255]="c:\\lena.png"; cvNamedWindow("window src",CV_WINDOW_AUTOSIZE); cvNamedWindow("window src",CV_WINDOW_AUTOSIZE); cvNamedWindow("window dst",CV_WINDOW_AUTOSIZE); cvNamedWindow("window dst",CV_WINDOW_AUTOSIZE); src=cvLoadImage(name, 0); src=cvLoadImage(name, 0); dst=cvCreateImage( cvSize(src->width, src->height), IPL_DEPTH_8U, 1); dst=cvCreateImage( cvSize(src->width, src->height), IPL_DEPTH_8U, 1); cvThreshold (src, dst, 100, 255, CV_THRESH_TOZERO); cvThreshold (src, dst, 100, 255, CV_THRESH_TOZERO); cvShowImage("window src", src); cvShowImage("window src", src); cvShowImage("window dst", dst); cvShowImage("window dst", dst); cvWaitKey(0); cvWaitKey(0); cvDestroyWindow ("window src"); cvDestroyWindow ("window src"); cvDestroyWindow (window dst); cvDestroyWindow (window dst); cvReleaseImage(&src); cvReleaseImage(&src); cvReleaseImage(&dst); cvReleaseImage(&dst);}

62 62 Visilab – Computer Vision and Image Processing Lab University of Messina - Italy Se proviamo ad eseguire il thresholding su Lena, otterremo questo:

63 63 Visilab – Computer Vision and Image Processing Lab University of Messina - Italy Il problema del thresholding di tipo a soglia fissa è che non è in grado di distinguere gli elementi dellimmagine che ci interessano da quelli che invece vanno scartati, se non in casi particolari (luminosità uniforme). Quando la luminosità è non uniforme, il thresholding a soglia fissa può fallire miseramente.

64 64 Visilab – Computer Vision and Image Processing Lab University of Messina - Italy Ad esempio, guardate questa immagine:

65 65 Visilab – Computer Vision and Image Processing Lab University of Messina - Italy Per cercare di risolvere il problema, si usano algoritmi di thresholding di tipo adattativo, dove il criterio di appartenenza applicato al punto P(x,y) non è legato ad una soglia fissa T, ma è legato ad un parametro T(x,y) che dipende da ciò che è presente nellintorno del punto (x,y).

66 66 Visilab – Computer Vision and Image Processing Lab University of Messina - Italy Un thresholding di tipo adattativo può essere ottenuto per mezzo della funzione cvAdaptiveThreshold void cvAdaptiveThreshold (const CvArr* src, CvArr* dst, double maxValue, double maxValue, int adaptiveMethod, int adaptiveMethod, int thresholdType, int thresholdType, int blockSize, int blockSize, double param1 ); double param1 ); maxValue è il valore che verrà inserito nellimmagine di destinazione se la condizione locale è verificata

67 67 Visilab – Computer Vision and Image Processing Lab University of Messina - Italy thresholdtype può essere una costante con 2 valori: CV_THRESH_BINARY,CV_THRESH_BINARY_INV Ciò che invece è importante è il metodo di tipo adattativo. Esso può essere di 2 tipi: CV_ADAPTIVE_THRESH_MEAN_C CV_ADAPTIVE_THRESH_MEAN_C: In questo caso viene eseguita una media dellintorno quadrato blockSize x blockSize. A questo valore viene sottratto il parametro Param1 (se non è 0).

68 68 Visilab – Computer Vision and Image Processing Lab University of Messina - Italy CV_ADAPTIVE_THRESH_GAUSSIAN_C CV_ADAPTIVE_THRESH_GAUSSIAN_C: In questo caso viene eseguita una media pesata dellintorno circolare di raggio blockSize. Il peso è dato da una funzione gaussiana, in modo da rendere meno importanti i valori dei pixel più lontani dellintorno. Al valore di media gaussiana ottenuta viene sottratto il parametro Param1 (se non è 0).

69 69 Visilab – Computer Vision and Image Processing Lab University of Messina - Italy Questo è il programma che useremo sotto OpenCV per x86 #include #include int main (void) { IplImage *src, *dst; IplImage *src, *dst; char name [255]="c:\\lena.png"; char name [255]="c:\\lena.png"; cvNamedWindow("window src",CV_WINDOW_AUTOSIZE); cvNamedWindow("window src",CV_WINDOW_AUTOSIZE); cvNamedWindow("window dst",CV_WINDOW_AUTOSIZE); cvNamedWindow("window dst",CV_WINDOW_AUTOSIZE); src=cvLoadImage(name, 0); src=cvLoadImage(name, 0); dst=cvCreateImage( cvSize(src->width, src->height), IPL_DEPTH_8U, 1); dst=cvCreateImage( cvSize(src->width, src->height), IPL_DEPTH_8U, 1); cvAdaptiveThreshold (src, dst, 255, CV_ADAPTIVE_THRESH_MEAN_C, CV_THRESH_BINARY, 3, 0 ); cvAdaptiveThreshold (src, dst, 255, CV_ADAPTIVE_THRESH_MEAN_C, CV_THRESH_BINARY, 3, 0 ); cvShowImage("window src", src); cvShowImage("window src", src); cvShowImage("window dst", dst); cvShowImage("window dst", dst); cvWaitKey(0); cvWaitKey(0); cvDestroyWindow ("window src"); cvDestroyWindow ("window src"); cvDestroyWindow (window dst); cvDestroyWindow (window dst); cvReleaseImage(&src); cvReleaseImage(&src); cvReleaseImage(&dst); cvReleaseImage(&dst);}

70 70 Visilab – Computer Vision and Image Processing Lab University of Messina - Italy Ed ecco quello che succede:

71 71 Visilab – Computer Vision and Image Processing Lab University of Messina - Italy Possiamo trovare i prototipi di tutte le funzioni OpenCV 2.1 a questo indirizzo... In questo modo, modificando il programma che vi ho mostrato, possiamo allenarci ad eseguire altri filtraggi (per esempio, blurring, laplaciano, o applicazione delloperatore di Sobel)

72 72 Visilab – Computer Vision and Image Processing Lab University of Messina - Italy La prossima volta vedremo qualche uso più sofisticato delle librerie OpenCV come lestrazione degli edge Nel frattempo, chi volesse approfondire largomento può visionare le ottime slide dr. Francesco La Rosa a questo indirizzo:

73 73 GRAZIE Visilab – Computer Vision and Image Processing Lab University of Messina - Italy


Scaricare ppt "1 Università degli Studi di Messina Facoltà di Ingegneria Visilab – Computer Vision and Image Processing Lab Librerie OpenCV Corso di Calcolatori Elettronici."

Presentazioni simili


Annunci Google