1 università degli studi di messina facoltà di ingegneria visilab – computer vision and image...

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

Upload: rachele-poli

Post on 02-May-2015

218 views

Category:

Documents


1 download

TRANSCRIPT

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

11

Università degli Studi di MessinaUniversità degli Studi di MessinaFacoltà di IngegneriaFacoltà di Ingegneria

Visilab – Computer Vision and Image Processing LabVisilab – Computer Vision and Image Processing Lab

Librerie OpenCV

Corso di Calcolatori Elettronici II (Visione artificiale)Messina, 14/04/2011Seminario tenuto dall’ing. Filippo Battaglia

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

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

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

3

OpenCVOpenCVSono le librerie open source più comuni per l’esecuzione diSono le librerie open source più comuni per l’esecuzione di

algoritmi di visione artificiale.algoritmi di visione artificiale.

Rilasciate da Intel come OSS sotto licenza BSD (BerkeleyRilasciate da Intel come OSS sotto licenza BSD (Berkeley

Software License)Software License)

http://sourceforge.net/projects/opencvlibrary/http://sourceforge.net/projects/opencvlibrary/

Visilab – Computer Vision and Image Processing LabUniversity of Messina - Italy

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

4 Visilab – Computer Vision and Image Processing LabUniversity of Messina - Italy

Le librerie OpenCV possono gestire svariatialgoritmi di visione artificiale per mezzo di routine totalmente standardizzate

Conversione RGB/YUVRotazioni, scaling, translazioniApplicazione di filtri immagineCalcolo di istogrammi ed applicazione di soglieApplicazione di operatori (gradiente, laplaciano)Riconoscimento faccialeRicerca di connected componentAlgoritmi di segmentazione

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

5 Visilab – Computer Vision and Image Processing LabUniversity of Messina - Italy

Per programmare con le librerie OpenCV ènecessario procurarsi uno dei manualiapplicativi presenti in rete

OpenCVReferenceManual.pdf

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

6 Visilab – Computer Vision and Image Processing LabUniversity of Messina - Italy

oppure alcuni libri

Gary Bradsky, Kaehler AdrianLearning OpenCV: Computer Vision with the OpenCV LibraryEditrice O’Reilly

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

7 Visilab – Computer Vision and Image Processing LabUniversity of Messina - Italy

Le librerie OpenCV supportano i linguaggiC, C++ e Python

Sotto x86 possono essere usate sotto i3 linguaggi, sotto Nanodesktop (PSP) possonoessere usate solo sotto C e C++(linking solo statico)

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

8 Visilab – Computer Vision and Image Processing LabUniversity of Messina - Italy

Dal punto di vista del programmatore C,il sistema OpenCV è composto daquattro librerie

cxcoreContiene le routine di manipolazioneimmagine a basso livello, funzioni digestione della memoria, manipolazionedegli array e dei vettori

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

9 Visilab – Computer Vision and Image Processing LabUniversity of Messina - Italy

cvLe routine di calcolo istogrammi, trasformazioni geometriche,determinazione di featuresono contenute qui

cvauxContiene routine ausiliarie fondamentaliper i sistemi di face detection Viola-Jones,e per la face recognition via HMM e PCA

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

10 Visilab – Computer Vision and Image Processing LabUniversity of Messina - Italy

highguiQui 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

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

11 Visilab – Computer Vision and Image Processing LabUniversity of Messina - Italy

La versione attuale delle librerie OpenCV per x86 è la 2.2

http://sourceforge.net/projects/opencvlibrary/

Per Nanodesktop PSPE/PSP è disponibilela versione 1.0 delle OpenCV

http://visilab.unime.it/~filippo/Nanodesktop/nanodesktop.htm

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

12 Visilab – Computer Vision and Image Processing LabUniversity of Messina - Italy

Vediamo ora come è possibile installarele librerie OpenCV su PC

(Per l’uso sotto Nanodesktop PSP, virimando alla Nanodesktop User Guide,capitolo 29)

Qui mi occuperò esclusivamente dell’installazione sotto Win32.

Inoltre, useremo le OpenCV 2.1 e non leultime 2.2 per ragioni di compatibilità

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

13 Visilab – Computer Vision and Image Processing LabUniversity of Messina - Italy

Per prima cosa, è necessario scaricare dallarete il pacchetto OpenCV 2.1.

Il file OpenCV-2.1.0-win32-vs2008.exeè un installer per Win32 che permette diinstallare le librerie e di settare correttamentela variabile PATH del sistema Win32.

Questo è importante, perchè sotto Win32OpenCV lavora per mezzo di 4 libreriedinamiche (cxcore210.dll, cv210.dll,cvcam210.dll, highgui210.dll)

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

14 Visilab – Computer Vision and Image Processing LabUniversity of Messina - Italy

Adesso ci serve un IDE (Integrated DevelopmentEnvironment).

In commercio ce ne sono diversi: io vi consiglioil buon, vecchio Dev-C++(www.bloodshed.com)

che ha il vantaggio di essere utilizzabile ancheper Nanodesktop.

(Chi si diletta di programmazione Java puòusare NetBeans + pacchetto supporto C++)

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

15 Visilab – Computer Vision and Image Processing LabUniversity of Messina - Italy

Scarichiamo dunque l’installer di Dev-C++5.0 beta1 dal sito di Bloodshed

devcpp-4.9.9.2_setup.exe

e provvediamo ad installarlo

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

16 Visilab – Computer Vision and Image Processing LabUniversity of Messina - Italy

L’IDE al primo avvio si presenta in questo modo

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

17

Creiamo un nuovo progetto Dev-C++ scegliendo Creiamo un nuovo progetto Dev-C++ scegliendo Empty projectEmpty project

Visilab – Computer Vision and Image Processing LabUniversity of Messina - Italy

Dev-C++ chiederà una cartella dove salvare i file...Dev-C++ chiederà una cartella dove salvare i file...

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

18

Adesso aggiungiamo un nuovo file che si chiamerà Adesso aggiungiamo un nuovo file che si chiamerà main.cmain.c

Visilab – Computer Vision and Image Processing LabUniversity of Messina - Italy

Click con il tasto destro, Click con il tasto destro, Nuova unità, Nuova unità, e verrà creato un file chiamatoe verrà creato un file chiamatoSenza titolo. Senza titolo. Lo salviamo come Lo salviamo come main.cmain.c

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

19 Visilab – Computer Vision and Image Processing LabUniversity of Messina - Italy

Inseriamo il nostro primo programma OpenCV. Per ora non preoccupiamoci di come funziona

#include <highgui.h>#include <highgui.h>#include <cxcore.h>#include <cxcore.h>#include <cv.h>#include <cv.h>

int main (void)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);}}

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

20

Per compilare, dobbiamo dire a Dev-C++ dove trovare i filePer compilare, dobbiamo dire a Dev-C++ dove trovare i file

headers che abbiamo inserito nel sorgente. headers che abbiamo inserito nel sorgente.

Click con il tasto destro sul nome del progetto a sinistra,Click con il tasto destro sul nome del progetto a sinistra,

Opzioni progetto, Opzioni progetto, ed andiamo nel tab ed andiamo nel tab Cartelle IncludeCartelle Include

Visilab – Computer Vision and Image Processing LabUniversity of Messina - Italy

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

21

Le cartelle Include da inserire sono le seguentiLe cartelle Include da inserire sono le seguenti

<opencv folder>\include\opencv<opencv folder>\include\opencv

Dove <opencv folder> è la cartella dove avete installato leDove <opencv folder> è la cartella dove avete installato le

librerie OpenCVlibrerie OpenCV

Visilab – Computer Vision and Image Processing LabUniversity of Messina - Italy

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

22

Adesso diciamo al linker (ld) dove trovare le librerie OpenCV (sotto Adesso diciamo al linker (ld) dove trovare le librerie OpenCV (sotto

Win32 sono Win32 sono dinamichedinamiche) che serviranno per il nostro programma. ) che serviranno per il nostro programma.

Click con il tasto destro sul nome del progetto a sinistra,Click con il tasto destro sul nome del progetto a sinistra,

Opzioni progetto, Opzioni progetto, ed andiamo nel tab ed andiamo nel tab Cartella LibrerieCartella Librerie

Visilab – Computer Vision and Image Processing LabUniversity of Messina - Italy

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

23

Le cartelle di ricerca per il linker da inserire sono le seguentiLe cartelle di ricerca per il linker da inserire sono le seguenti

<opencv folder>\bin<opencv folder>\bin

ATTENZIONE:ATTENZIONE:

La sottocartella \lib contiene le librerie a collegamento dinamicoLa sottocartella \lib contiene le librerie a collegamento dinamico

per Linux (.lib) !!!! Ma noi siamo sotto Win32, quindi ci servonoper Linux (.lib) !!!! Ma noi siamo sotto Win32, quindi ci servono

le librerie dll che sono in \bin.le librerie dll che sono in \bin.

Visilab – Computer Vision and Image Processing LabUniversity of Messina - Italy

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

24

Infine, dobbiamo dire al linker (ld) che librerie dinamiche linkare.Infine, dobbiamo dire al linker (ld) che librerie dinamiche linkare.

Andiamo nel tab Andiamo nel tab Parametri, Parametri, textbox textbox Linker...Linker...

Visilab – Computer Vision and Image Processing LabUniversity of Messina - Italy

ed inseriamo le librerie dinamiche che sono necessarieed inseriamo le librerie dinamiche che sono necessarie

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

25

Sotto Win32 ci servono le dll:Sotto Win32 ci servono le dll:

-lcxcore210-lcxcore210

-lcv210-lcv210

-lcvaux210-lcvaux210

-lhighgui210-lhighgui210

Nota: gli utenti Linux invece usano le librerie (.lib)Nota: gli utenti Linux invece usano le librerie (.lib)

-lcxcore-lcxcore

-lcv-lcv

-lcvaux-lcvaux

-lhighgui-lhighgui

Visilab – Computer Vision and Image Processing LabUniversity of Messina - Italy

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

26 Visilab – Computer Vision and Image Processing LabUniversity of Messina - Italy

Siamo pronti. Clicchiamo su Ok per confermare i parametri etorniamo all’interfaccia principale. Adesso Menu/Compila ed esegui

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

27 Visilab – Computer Vision and Image Processing LabUniversity of Messina - Italy

Il nostro programma visualizza il file C:\lena.png sulloschermo, perciò dobbiamo assicurarci che il file siapresente sull’hard disk prima di lanciare il programma

#include <highgui.h>#include <highgui.h>#include <cxcore.h>#include <cxcore.h>#include <cv.h>#include <cv.h>

int main (void)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);}}

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

28 Visilab – Computer Vision and Image Processing LabUniversity of Messina - Italy

E questo è il risultatoE questo è il risultato

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

29 Visilab – Computer Vision and Image Processing LabUniversity of Messina - Italy

Ok, abbiamo visto che funziona. Ok, abbiamo visto che funziona.

Adesso torniamo al nostro programma ed Adesso torniamo al nostro programma ed analizziamolo nelle sue componentianalizziamolo nelle sue componenti

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

30 Visilab – Computer Vision and Image Processing LabUniversity of Messina - Italy

Le direttive include permettono al compilatore di trovareLe direttive include permettono al compilatore di trovarei prototipi delle funzioni delle librerie i prototipi delle funzioni delle librerie cxcore, cv cxcore, cv e e highgui.highgui.

#include <highgui.h>#include <highgui.h>#include <cxcore.h>#include <cxcore.h>#include <cv.h>#include <cv.h>

int main (void)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);}}

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

31 Visilab – Computer Vision and Image Processing LabUniversity of Messina - Italy

Ogni immagine OpenCV è contenuta in una struct di tipo Ogni immagine OpenCV è contenuta in una struct di tipo IplImage, IplImage, chechene contiene tutti i parametri ed i pixel. OpenCV, però, in genere nonne contiene tutti i parametri ed i pixel. OpenCV, però, in genere nonagisce sulle struct IplImage, ma su agisce sulle struct IplImage, ma su puntatoripuntatori a tali struct a tali struct

#include <highgui.h>#include <highgui.h>#include <cxcore.h>#include <cxcore.h>#include <cv.h>#include <cv.h>

int main (void)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);}}

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

32 Visilab – Computer Vision and Image Processing LabUniversity of Messina - Italy

cvLoadImage carica l’immagine, alloca la struct IplImage cvLoadImage carica l’immagine, alloca la struct IplImage necessarianecessariaa contenerne i dati, e restituisce in uscita un puntatore a tale struct.a contenerne i dati, e restituisce in uscita un puntatore a tale struct.

#include <highgui.h>#include <highgui.h>#include <cxcore.h>#include <cxcore.h>#include <cv.h>#include <cv.h>

int main (void)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 Se il puntatore restituito è zero (NULL), allora il processo di caricamento è fallito.caricamento è fallito.

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

33 Visilab – Computer Vision and Image Processing LabUniversity of Messina - Italy

Quando l’immagine non serve più, possiamo liberare l’area di Quando l’immagine non serve più, possiamo liberare l’area di memoria ad essa associata tramite memoria ad essa associata tramite cvReleaseImage.cvReleaseImage.

#include <highgui.h>#include <highgui.h>#include <cxcore.h>#include <cxcore.h>#include <cv.h>#include <cv.h>

int main (void)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 Il puntatore src src potrà essere riutilizzato per altre immaginipotrà essere riutilizzato per altre immagini

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

34 Visilab – Computer Vision and Image Processing LabUniversity of Messina - Italy

Per creare una finestra, si usa Per creare una finestra, si usa cvNamedWindow. cvNamedWindow. Ogni finestra è Ogni finestra è identificata per mezzo di una stringa (nome)identificata per mezzo di una stringa (nome)

#include <highgui.h>#include <highgui.h>#include <cxcore.h>#include <cxcore.h>#include <cv.h>#include <cv.h>

int main (void)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 Quando una finestra non serve più, si può usare cvDestroyWindowcvDestroyWindow

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

35 Visilab – Computer Vision and Image Processing LabUniversity of Messina - Italy

Per visualizzare una immagine caricata in una finestra si usaPer visualizzare una immagine caricata in una finestra si usacvShowImage.cvShowImage.

#include <highgui.h>#include <highgui.h>#include <cxcore.h>#include <cxcore.h>#include <cv.h>#include <cv.h>

int main (void)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);}}

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

36 Visilab – Computer Vision and Image Processing LabUniversity of Messina - Italy

cvWaitKey(ms)cvWaitKey(ms) sospende l’esecuzione finchè non viene premuto sospende l’esecuzione finchè non viene premutoun tasto o non trascorrono ms millisec. (ms=0, attendi per sempre)un tasto o non trascorrono ms millisec. (ms=0, attendi per sempre)

#include <highgui.h>#include <highgui.h>#include <cxcore.h>#include <cxcore.h>#include <cv.h>#include <cv.h>

int main (void)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 ilSotto Win32 determina anche una chiamata al driver video per ilflushing delle chiamate in coda (chiamate flushing delle chiamate in coda (chiamate cvWaitKey(1) cvWaitKey(1) ))

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

37 Visilab – Computer Vision and Image Processing LabUniversity of Messina - Italy

Bene, ora vediamo come possiamo usare leBene, ora vediamo come possiamo usare lelibrerie OpenCV per applicare un filtro gaussianolibrerie OpenCV per applicare un filtro gaussianoad una immaginead una immagine

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

38 Visilab – Computer Vision and Image Processing LabUniversity of Messina - Italy

Dal corso di elaborazione delle immagini sappiamo Dal corso di elaborazione delle immagini sappiamo che applicare un filtro gaussiano ad una immagineche applicare un filtro gaussiano ad una immaginesignifica eseguire il prodotto della f-trasformatasignifica eseguire il prodotto della f-trasformatadell’immagine di lavoro per una funzione gaussianadell’immagine di lavoro per una funzione gaussianache taglierà le frequenze spaziali di valoreche taglierà le frequenze spaziali di valorepiù elevatopiù elevato

La f-trasformata che otteniamo viene poi La f-trasformata che otteniamo viene poi antitrasformata ottenendo l’immagineantitrasformata ottenendo l’immaginefinale.finale.

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

39 Visilab – Computer Vision and Image Processing LabUniversity of Messina - Italy

Siccome le componenti frequenziali piùSiccome le componenti frequenziali piùelevate di una immagine sono associate aielevate di una immagine sono associate aiparticolari più fini (ed al rumore salt andparticolari più fini (ed al rumore salt andpepper...), nel momento in cui noi lepepper...), nel momento in cui noi leattenuiamo tramite un filtro gaussianoattenuiamo tramite un filtro gaussianootterremo un’immagine con dettagliotterremo un’immagine con dettaglimeno definiti (smoothing).meno definiti (smoothing).

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

40 Visilab – Computer Vision and Image Processing LabUniversity of Messina - Italy

La funzione che ci serve si chiamaLa funzione che ci serve si chiama

void void cvSmoothcvSmooth(const CvArr* src, (const CvArr* src, CvArr* dst, CvArr* dst, int smoothtype=CV_GAUSSIAN, int smoothtype=CV_GAUSSIAN, int param1=3, int param1=3, int param2=0, int param2=0, double param3=0, double param3=0, double param4=0)double param4=0)

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

41 Visilab – Computer Vision and Image Processing LabUniversity of Messina - Italy

dove dove - - srcsrc è l’immagine IPL sorgente;è l’immagine IPL sorgente;- dstdst è l’immagine di destinazioneè l’immagine di destinazione- smoothtypesmoothtype è una costante cheè una costante che indica il tipo di smoothing. Per esempio, può essereindica il tipo di smoothing. Per esempio, può essere CV_BLUR, CV_GAUSSIAN o CV_MEDIANCV_BLUR, CV_GAUSSIAN o CV_MEDIAN- param1param1 è inv. proporzionale alla sigma che è inv. proporzionale alla sigma che verrà usata nella gaussiana. Per i filtri blur, verrà usata nella gaussiana. Per i filtri blur, param1*param2param1*param2 indica le dimensioni della finestraindica le dimensioni della finestra- gli altri parametri (gli altri parametri (param3param3 e e param4param4) ) possono possono essere posti a 0 per ora.essere posti a 0 per ora.

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

42 Visilab – Computer Vision and Image Processing LabUniversity of Messina - Italy

Ok, il programma che ci serve è il seguenteOk, il programma che ci serve è il seguente

#include <highgui.h>#include <highgui.h>#include <cxcore.h>#include <cxcore.h>#include <cv.h>#include <cv.h>

int main (void)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); // Carica a toni di grigio // 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);}}

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

43 Visilab – Computer Vision and Image Processing LabUniversity of Messina - Italy

Notate che stavolta abbiamo creato 2 finestre: una per l’immagineNotate che stavolta abbiamo creato 2 finestre: una per l’immaginesorgente ed una per l’immagine di destinazionesorgente ed una per l’immagine di destinazione

#include <highgui.h>#include <highgui.h>#include <cxcore.h>#include <cxcore.h>#include <cv.h>#include <cv.h>

int main (void)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);}}

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

44 Visilab – Computer Vision and Image Processing LabUniversity of Messina - Italy

Abbiamo il problema di creare una immagine che abbia le stesseAbbiamo il problema di creare una immagine che abbia le stessedimensioni della sorgente. Usiamo dimensioni della sorgente. Usiamo cvCreateImage cvCreateImage per creare unaper creare unaimmagine vuotaimmagine vuota

#include <highgui.h>#include <highgui.h>#include <cxcore.h>#include <cxcore.h>#include <cv.h>#include <cv.h>

int main (void)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);

}}

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

45 Visilab – Computer Vision and Image Processing LabUniversity of Messina - Italy

cvSmooth() cvSmooth() eseguirà il filtraggio vero e proprioeseguirà il filtraggio vero e proprio

#include <highgui.h>#include <highgui.h>#include <cxcore.h>#include <cxcore.h>#include <cv.h>#include <cv.h>

int main (void)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);}}

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

46 Visilab – Computer Vision and Image Processing LabUniversity of Messina - Italy

Dopo avere creato le due immagini IPL in memoria, dobbiamoDopo avere creato le due immagini IPL in memoria, dobbiamovisualizzarle in due finestrevisualizzarle in due finestre

#include <highgui.h>#include <highgui.h>#include <cxcore.h>#include <cxcore.h>#include <cv.h>#include <cv.h>

int main (void)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);}}

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

47 Visilab – Computer Vision and Image Processing LabUniversity of Messina - Italy

Dopo che l’utente ha premuto un tasto, cancelliamo le due finestreDopo che l’utente ha premuto un tasto, cancelliamo le due finestree liberiamo la memoria impegnata dalle 2 immaginie liberiamo la memoria impegnata dalle 2 immagini

#include <highgui.h>#include <highgui.h>#include <cxcore.h>#include <cxcore.h>#include <cv.h>#include <cv.h>

int main (void)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);}}

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

48 Visilab – Computer Vision and Image Processing LabUniversity of Messina - Italy

E questo è il risultato (param1=9)E questo è il risultato (param1=9)

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

49 Visilab – Computer Vision and Image Processing LabUniversity of Messina - Italy

Invece questo è il risultato per param1=31Invece questo è il risultato per param1=31

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

50 Visilab – Computer Vision and Image Processing LabUniversity of Messina - Italy

Supponiamo adesso di volere eseguire unaSupponiamo adesso di volere eseguire unaoperazione diversa, come il thresholdingoperazione diversa, come il thresholding

Come sapete, l’operazione di thresholdingCome sapete, l’operazione di thresholdingrestituisce una immagine binaria, in cuirestituisce una immagine binaria, in cuii pixel di intensità diversa da 0 rispondonoi pixel di intensità diversa da 0 rispondonoad una condizionead una condizione

(di solito che i(x,y)>T)(di solito che i(x,y)>T)

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

51 Visilab – Computer Vision and Image Processing LabUniversity of Messina - Italy

Per eseguire il thresholding, abbiamo Per eseguire il thresholding, abbiamo bisogno di una funzione OpenCVbisogno di una funzione OpenCVchiamatachiamata

cvThresholdcvThreshold

Il cui prototipo è il seguente: Il cui prototipo è il seguente:

void cvThresholdvoid cvThreshold( const CvArr* src, CvArr* dst, ( const CvArr* src, CvArr* dst, double threshold, double threshold, double maxValue, double maxValue, int thresholdType ); int thresholdType );

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

52 Visilab – Computer Vision and Image Processing LabUniversity of Messina - Italy

Nell’esecuzione del thresholding, è fondamentaleNell’esecuzione del thresholding, è fondamentaleil valore del parametro il valore del parametro thresholdtype thresholdtype perchè perchè definisce il tipo di sogliatura che possiamodefinisce il tipo di sogliatura che possiamoeseguire. eseguire.

Precisamente, esso può assumere i seguenti Precisamente, esso può assumere i seguenti valori:valori:

thresholdType=CV_THRESH_BINARY:thresholdType=CV_THRESH_BINARY:dst(x,y) = maxValue, if src(x,y)>thresholddst(x,y) = maxValue, if src(x,y)>threshold 0, otherwise0, otherwise

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

53 Visilab – Computer Vision and Image Processing LabUniversity of Messina - Italy

thresholdType=CV_THRESH_BINARY_INV: thresholdType=CV_THRESH_BINARY_INV: dst(x,y) = 0, if src(x,y)>threshold dst(x,y) = 0, if src(x,y)>threshold maxValue, otherwisemaxValue, otherwise

thresholdType=CV_THRESH_TRUNC: thresholdType=CV_THRESH_TRUNC: dst(x,y) = threshold, if src(x,y)>threshold dst(x,y) = threshold, if src(x,y)>threshold

src(x,y), otherwise src(x,y), otherwise

thresholdType=CV_THRESH_TOZERO: thresholdType=CV_THRESH_TOZERO: dst(x,y) = src(x,y), if (x,y)>threshold dst(x,y) = src(x,y), if (x,y)>threshold

0, otherwise 0, otherwise

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

54 Visilab – Computer Vision and Image Processing LabUniversity of Messina - Italy

thresholdType=CV_THRESH_TOZERO_INV: thresholdType=CV_THRESH_TOZERO_INV: dst(x,y) = 0, if src(x,y)>threshold dst(x,y) = 0, if src(x,y)>threshold

src(x,y), otherwise src(x,y), otherwise

Notate che tutti questi metodi sono a Notate che tutti questi metodi sono a soglia fissa. soglia fissa. Stiamo cioè parlando di meccanismi di sogliaturaStiamo cioè parlando di meccanismi di sogliaturadi tipo di tipo non adattativo.non adattativo.

Vediamo ora qualche esempio applicativo.Vediamo ora qualche esempio applicativo.

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

55 Visilab – Computer Vision and Image Processing LabUniversity of Messina - Italy

Questo è il programma che useremo sotto OpenCV per x86Questo è il programma che useremo sotto OpenCV per x86

#include <highgui.h>#include <highgui.h>#include <cxcore.h>#include <cxcore.h>#include <cv.h>#include <cv.h>

int main (void)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);}}

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

56 Visilab – Computer Vision and Image Processing LabUniversity of Messina - Italy

Se proviamo ad eseguire il thresholding su Lena, otterremo questo:

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

57 Visilab – Computer Vision and Image Processing LabUniversity of Messina - Italy

Vediamo che succede quando proviamo adeseguire un thresholding binario inverso.

Usiamo CV_THRESH_BINARY_INV

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

58 Visilab – Computer Vision and Image Processing LabUniversity of Messina - Italy

Questo è il programma che useremo sotto OpenCV per x86Questo è il programma che useremo sotto OpenCV per x86

#include <highgui.h>#include <highgui.h>#include <cxcore.h>#include <cxcore.h>#include <cv.h>#include <cv.h>

int main (void)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);}}

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

59 Visilab – Computer Vision and Image Processing LabUniversity of Messina - Italy

Se proviamo ad eseguire il thresholding su Lena, otterremo questo:

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

60 Visilab – Computer Vision and Image Processing LabUniversity of Messina - Italy

Supponiamo ora di volere “tagliare” (a zero) tutti i valoriSupponiamo ora di volere “tagliare” (a zero) tutti i valoridi luminosità minori di una certa soglia T.di luminosità minori di una certa soglia T.

Per i valori di luminosità superiori alla soglia T noi nonPer i valori di luminosità superiori alla soglia T noi nonimporremo un valore (255) ma prenderemo il valoreimporremo un valore (255) ma prenderemo il valoreoriginale i(x;y). originale i(x;y).

Il tipo di thresholding che ci serve si chiama:Il tipo di thresholding che ci serve si chiama:

CV_THRESH_TOZEROCV_THRESH_TOZERO

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

61 Visilab – Computer Vision and Image Processing LabUniversity of Messina - Italy

Questo è il programma che useremo sotto OpenCV per x86Questo è il programma che useremo sotto OpenCV per x86

#include <highgui.h>#include <highgui.h>#include <cxcore.h>#include <cxcore.h>#include <cv.h>#include <cv.h>

int main (void)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);}}

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

62 Visilab – Computer Vision and Image Processing LabUniversity of Messina - Italy

Se proviamo ad eseguire il thresholding su Lena, otterremo questo:

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

63 Visilab – Computer Vision and Image Processing LabUniversity of Messina - Italy

Il problema del thresholding di tipo “a soglia fissa” è cheIl problema del thresholding di tipo “a soglia fissa” è chenon è in grado di distinguere gli elementi dell’immaginenon è in grado di distinguere gli elementi dell’immagineche ci interessano da quelli che invece vannoche ci interessano da quelli che invece vannoscartati, se non in casi particolari (luminosità uniforme).scartati, se non in casi particolari (luminosità uniforme).

Quando la luminosità è non uniforme, il thresholdingQuando la luminosità è non uniforme, il thresholdinga soglia fissa può fallire miseramente.a soglia fissa può fallire miseramente.

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

64 Visilab – Computer Vision and Image Processing LabUniversity of Messina - Italy

Ad esempio, guardate questa immagine:Ad esempio, guardate questa immagine:

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

65 Visilab – Computer Vision and Image Processing LabUniversity of Messina - Italy

Per cercare di risolvere il problema, si usano Per cercare di risolvere il problema, si usano algoritmi di thresholding di tipo algoritmi di thresholding di tipo adattativo, adattativo, dove ildove ilcriterio di appartenenza applicato al punto P(x,y)criterio di appartenenza applicato al punto P(x,y)non è legato ad una soglia fissa T, ma è legatonon è legato ad una soglia fissa T, ma è legatoad un parametro T(x,y) che dipende da ciòad un parametro T(x,y) che dipende da ciòche è presente che è presente nell’intorno del punto (x,y).nell’intorno del punto (x,y).

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

66 Visilab – Computer Vision and Image Processing LabUniversity of Messina - Italy

Un thresholding di tipo adattativo può essere ottenutoUn thresholding di tipo adattativo può essere ottenutoper mezzo della funzione per mezzo della funzione cvAdaptiveThreshold cvAdaptiveThreshold

void cvAdaptiveThreshold void cvAdaptiveThreshold (const CvArr* src, CvArr* dst, (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 );

maxValuemaxValue è il valore che verrà inserito nell’immagine di è il valore che verrà inserito nell’immagine didestinazione se la condizione locale è verificatadestinazione se la condizione locale è verificata

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

67 Visilab – Computer Vision and Image Processing LabUniversity of Messina - Italy

thresholdtype thresholdtype può essere una costante con 2 valori:può essere una costante con 2 valori:

CV_THRESH_BINARY, CV_THRESH_BINARY, CV_THRESH_BINARY_INVCV_THRESH_BINARY_INV

Ciò che invece è importante è il metodo di tipoCiò che invece è importante è il metodo di tipoadattativo. Esso può essere di 2 tipi:adattativo. Esso può essere di 2 tipi:

CV_ADAPTIVE_THRESH_MEAN_CCV_ADAPTIVE_THRESH_MEAN_C:In questo caso viene eseguita una media dell’intornoIn questo caso viene eseguita una media dell’intornoquadrato quadrato blockSize x blockSize. blockSize x blockSize. A questo valore vieneA questo valore vienesottratto il parametro sottratto il parametro Param1 Param1 (se non è 0).(se non è 0).

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

68 Visilab – Computer Vision and Image Processing LabUniversity of Messina - Italy

CV_ADAPTIVE_THRESH_GAUSSIAN_CCV_ADAPTIVE_THRESH_GAUSSIAN_C:In questo caso viene eseguita una media pesata In questo caso viene eseguita una media pesata dell’intorno circolare di raggio dell’intorno circolare di raggio blockSize.blockSize.

Il peso è dato da una funzione gaussiana, in modoIl peso è dato da una funzione gaussiana, in mododa rendere meno importanti i valori dei pixelda rendere meno importanti i valori dei pixelpiù lontani dell’intorno. più lontani dell’intorno.

Al valore di media gaussiana ottenuta vieneAl valore di media gaussiana ottenuta vienesottratto il parametro sottratto il parametro Param1 Param1 (se non è 0).(se non è 0).

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

69 Visilab – Computer Vision and Image Processing LabUniversity of Messina - Italy

Questo è il programma che useremo sotto OpenCV per x86Questo è il programma che useremo sotto OpenCV per x86

#include <highgui.h>#include <highgui.h>#include <cxcore.h>#include <cxcore.h>#include <cv.h>#include <cv.h>

int main (void)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);}}

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

70 Visilab – Computer Vision and Image Processing LabUniversity of Messina - Italy

Ed ecco quello che succede:Ed ecco quello che succede:

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

71 Visilab – Computer Vision and Image Processing LabUniversity of Messina - Italy

Possiamo trovare i prototipi di tutte le funzioniPossiamo trovare i prototipi di tutte le funzioniOpenCV 2.1 a questo indirizzo...OpenCV 2.1 a questo indirizzo...

http://opencv.willowgarage.com/documentation/index.html

In questo modo, modificando il programma che viIn questo modo, modificando il programma che viho mostrato, possiamo allenarci ad eseguire altriho mostrato, possiamo allenarci ad eseguire altrifiltraggi (per esempio, blurring, laplaciano, o filtraggi (per esempio, blurring, laplaciano, o applicazione dell’operatore di Sobel)applicazione dell’operatore di Sobel)

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

72 Visilab – Computer Vision and Image Processing LabUniversity of Messina - Italy

La prossima volta vedremo qualche uso più sofisticatoLa prossima volta vedremo qualche uso più sofisticatodelle librerie OpenCV come l’estrazione degli edgedelle librerie OpenCV come l’estrazione degli edge

Nel frattempo, chi volesse approfondire l’argomento puòNel frattempo, chi volesse approfondire l’argomento puòvisionare le ottime slide dr. Francesco La Rosavisionare le ottime slide dr. Francesco La Rosaa questo indirizzo:a questo indirizzo:

http://visilab.unime.it/~flarosa/OpenCV/2004_05/Opencv1_1.pdfhttp://visilab.unime.it/~flarosa/OpenCV/2004_05/Opencv1_1.pdf

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

73

GRAZIEGRAZIE

Visilab – Computer Vision and Image Processing LabUniversity of Messina - Italy