La presentazione è in caricamento. Aspetta per favore

La presentazione è in caricamento. Aspetta per favore

Laboratorio ETI Image Processing with VIPLib HandOut © mmLab by Alessandro Polo mercoledì 24 maggio 2006.

Presentazioni simili


Presentazione sul tema: "Laboratorio ETI Image Processing with VIPLib HandOut © mmLab by Alessandro Polo mercoledì 24 maggio 2006."— Transcript della presentazione:

1 Laboratorio ETI Image Processing with VIPLib HandOut © mmLab by Alessandro Polo mercoledì 24 maggio 2006

2 Installazione: Windows  Scaricare e installare un client Subversion (TortoiseSVN oppure command line)  Connettersi a repository di VIPLib../VIPLib/> svn co svn://mmlab.science.unitn.it/VIPLib/trunk  Scaricare e installare/decomprimere Package Studio oppure  Eseguire Package Studio e configurare il percorso di installazione di VIPLib

3 Installazione: Linux  Scaricare e installare un client Subversion (eSVN oppure command line)  Connettersi a repository di VIPLib../VIPLib$ svn co svn://mmlab.science.unitn.it/VIPLib/trunk  Package Studio è disponibile solo per piattaforme Windows, è necessario implementare tutto il pacchetto manualmente o importare un pacchetto creato preventivamente con una macchina Windows.  Per utilizzare alcuni componenti è necessario installare nel sistema le librerie necessarie, leggere./INSTALL e./COMPILE

4 Documentazione Un tutorial introduttivo è disponibile nella sezione resources del server mmLab: Handout – Using VIPLib for Image Processing.pdf Inoltre è online la documentazione di Package Studio

5 Flusso Dati Implementazione di vipInput I dati vengono acquisiti da un driver o una libreria esterna, convertiti nello standard di VIPLib e indirizzati in uscita quando richiesto. Implementazione di vipOutput I dati vengono letti in ingresso, convertiti nel formato richiesto e inviati all’interfaccia successiva come un driver o una libreria esterna.

6 Flusso Dati (2) vipFilter eredita vipInput e vipOuput incorporandone le capacità di interazione. Implementazione di vipFilter I dati acquisiti in ingresso vengono elaborati, salvati in un buffer e indirizzati in uscita quando richiesto. [Ex. vipDigitalFilter, vipFilterGeometric]

7 Filtraggio int main(int argc, char* argv[]) { vipFrameRGB24 srcImage; vipFrameRGB24 outImage; vipFilterSobel myFilterClass; vipCodec_BMP::load(srcImage, "frame1.bmp", vipCodec_BMP::FORMAT_BMP_24); myFilterClass.getParameters(). setRunMode(vipFilterSobelParameters::DO_SOBEL ); myFilterClass.getParameters().setThreshold(20); myFilterClass << srcImage; myFilterClass >> outImage; vipCodec_BMP::save(outImage, "vipFilterSobel_PROCESSED.bmp", vipCodec_BMP::FORMAT_BMP_24); return 0; } buffers globali Istanza componente carico immagine configurazione filtro importo e filtro frame esporto il frame finale salvo immagine filtrata

8 Filtraggio (2) Il filtraggio avviene quando si importa un frame nel componente: myFilterClass << srcImage; Ciò corrisponde direttamente alla chiamata: (./source/vetFilter.h) myFilterClass.importFrom(srcImage); Infatti l’elaborazione all’interno del filtro è gestita da: VIPRESULT vipFilterSobel::importFrom(vipFrameRGB24& img) { [..] } Ci sono 3 metodi diversi per i formati RGB24, YUV420, vipFrameT. I parametri di lavoro devono essere memorizzati nella classe vipFilterSobelParameters, l’argomento è trattato più avanti.

9 Filtraggio (3) VIPRESULT vipFilterSobel::importFrom(vipFrameRGB24& img) { switch ( myParams->runMode ) { case vipFilterSobelParameters::DO_NOTHING: useBufferRGB(img.width, img.height); *bufferRGB = img; return VIPRET_OK_DEPRECATED; case vipFilterSobelParameters::DO_SOBEL: useBufferRGB(img.width, img.height); return applySobel(*bufferRGB, img, myParams->threshold); default: return VIPRET_PARAM_ERR; } return VIPRET_NOT_IMPLEMENTED; }

10 Filtraggio (4) VIPRESULT vipFilterSobel::applySobel(vipFrameRGB24& dest, vipFrameRGB24& source, int threshold) { for(x=0; x < source.width; x++) for(y=0; y < source.height; y++) [..] } La funzione è dichiarata static quindi può accedere solo alle variabili passate come argomento, infatti la soglia viene impostata nella funzione importFrom() ed era memorizzata in myParams->threshold. In questo modo, altri sviluppatori possono chiamare la funzione direttamente all’interno del loro codice (si pensi a più filtri in catena), la sintassi sarebbe semplicemente: vipFilterSobel::applySobel(myLocalDest, myLocalSrc, 78);

11 Parametri del Filtro class vipFilterSobelParameters : public vipFilterParameters { public: enum RUNMODE{ DO_NOTHING, DO_SOBEL }; protected: RUNMODE runMode; int threshold; void setRunMode(RUNMODE mode) { runMode = mode; }; RUNMODE getRunMode() { return runMode; }; void setThreshold(int value) { threshold = value; }; int getThreshold() { return threshold; }; }

12 Caricare Immagini #include “../../source/codecs/ vipCodec_BMP.h” [..] vipCodec_BMP::load(srcImage,// un vipFrameRGB24 “image.bmp",// file (BMP-24b) vipCodec_BMP::FORMAT_BMP_24); #include “../../source/codecs/ vipCodec_IMG.h” [..] vipCodec_IMG::load(srcImage, // un vipFrameRGB24 “ANY_IMAGE_FORMAT“); Sono metodi statici, non è necessario istanziare i componenti. vipCodec_IMG è in grado di caricare qualunque formato.

13 Matrici La classe vipMatrix implementa una semplice matrice memorizzando i valori in un array (disposizione raster), è possibile accedere tramite i metodi: setValue(unsigned int x, unsigned int y, T& value) getValue(unsigned int x, unsigned int y) Oppure direttamente all’array tramite T* dump_data() L’utilizzo di una classe template è banale, le differenze si esauriscono all’inizializzazione: vipMatrix intTable(10, 10);

14 Accesso pixel e Canvas #include “../../source/vipFrameRGB24.h” pixel-index = y*img.width + x; PixelRGB24 p = img.data[ pixel-index ]; unsigned char R i = p[0] ≡ img.data[ pixel-index ][ 0 ]; unsigned char G i = p[1] ≡ img.data[ pixel-index ][ 1 ]; unsigned char B i = p[2] ≡ img.data[ pixel-index ][ 2 ];

15 Ottimizzazioni Esempi di operazioni bitwise b << 4 = b = 0x830 h = 2096 d X = Y * 8 ↔ X = Y > 2 X = Y % 8 ↔ X = Y & 7;X ^ Y = Y ^ X; X = X ^ 0; Esempio di ottimizzazione in scrittura for ( unsigned int i=0; i height; i++ ) memcpy(&buffer->data[i*buffer->width], &img.data[(buffer->height-i-1)*buffer->width], buffer->width * sizeof(PixelRGB24) );

16 Riferimenti All’interno della facoltà: https://mmlab.science.unitn.it/ ftp://mmlab.science.unitn.it/ All’esterno della facoltà: https://mmlab.science.unitn.it:4430/ ftp://mmlab.science.unitn.it:2121/


Scaricare ppt "Laboratorio ETI Image Processing with VIPLib HandOut © mmLab by Alessandro Polo mercoledì 24 maggio 2006."

Presentazioni simili


Annunci Google