View
218
Download
1
Category
Preview:
Citation preview
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
2 Visilab – Computer Vision and Image Processing LabUniversity of Messina - Italy
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
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
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
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
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)
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
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
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
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
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à
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)
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++)
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
16 Visilab – Computer Vision and Image Processing LabUniversity of Messina - Italy
L’IDE al primo avvio si presenta in questo modo
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...
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
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);}}
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
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
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
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
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
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
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
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);}}
28 Visilab – Computer Vision and Image Processing LabUniversity of Messina - Italy
E questo è il risultatoE questo è il risultato
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
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);}}
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);}}
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.
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
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
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);}}
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) ))
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
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.
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).
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)
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.
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);}}
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);}}
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);
}}
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);}}
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);}}
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);}}
48 Visilab – Computer Vision and Image Processing LabUniversity of Messina - Italy
E questo è il risultato (param1=9)E questo è il risultato (param1=9)
49 Visilab – Computer Vision and Image Processing LabUniversity of Messina - Italy
Invece questo è il risultato per param1=31Invece questo è il risultato per param1=31
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)
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 );
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
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
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.
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);}}
56 Visilab – Computer Vision and Image Processing LabUniversity of Messina - Italy
Se proviamo ad eseguire il thresholding su Lena, otterremo questo:
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
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);}}
59 Visilab – Computer Vision and Image Processing LabUniversity of Messina - Italy
Se proviamo ad eseguire il thresholding su Lena, otterremo questo:
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
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);}}
62 Visilab – Computer Vision and Image Processing LabUniversity of Messina - Italy
Se proviamo ad eseguire il thresholding su Lena, otterremo questo:
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.
64 Visilab – Computer Vision and Image Processing LabUniversity of Messina - Italy
Ad esempio, guardate questa immagine:Ad esempio, guardate questa immagine:
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).
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
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).
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).
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);}}
70 Visilab – Computer Vision and Image Processing LabUniversity of Messina - Italy
Ed ecco quello che succede:Ed ecco quello che succede:
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)
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
73
GRAZIEGRAZIE
Visilab – Computer Vision and Image Processing LabUniversity of Messina - Italy
Recommended