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

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

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

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

Laboratorio ETI

Image Processing with VIPLib

HandOut

© mmLab

by Alessandro Polomercoledì 24 maggio 2006

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

Installazione: Windows

Scaricare e installare un client Subversion (TortoiseSVN oppure command line)http://mmlab.science.unitn.it/services/subversion

Connettersi a repository di VIPLib../VIPLib/> svn co svn://mmlab.science.unitn.it/VIPLib/trunk

Scaricare e installare/decomprimere Package Studiohttp://mmlab.science.unitn.it/projects/vipPS/downloads/VIPLIB-PKGSTUDIO.MSI

oppure

http://mmlab.science.unitn.it/projects/vipPS/downloads/VIPLIB-PKGSTUDIO.ZIP Eseguire Package Studio e configurare il percorso di installazione di VIPLib

http://mmlab.science.unitn.it/projects/vipPS/docs

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

Installazione: Linux

Scaricare e installare un client Subversion (eSVN oppure command line)http://mmlab.science.unitn.it/services/subversion

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

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

Documentazione

Un tutorial introduttivo è disponibile nella sezione resources del server mmLab:

http://mmlab.science.unitn.it/resources/

Handout – Using VIPLib for Image Processing.pdf

Inoltre è online la documentazione di Package Studio

http://mmlab.science.unitn.it/projects/vipPS/docs

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

Flusso Dati

Implementazione di vipInputI dati vengono acquisiti da un driver o una libreria esterna, convertiti nello standard di VIPLib e indirizzati in uscita quando richiesto.

Implementazione di vipOutputI dati vengono letti in ingresso, convertiti nel formato richiesto e inviati all’interfaccia successiva come un driver o una libreria esterna.

vipFrameRGB24vipFrameYUV420vipFrameT<uchar>

OS DependentLibraries and Drivers

VIPLib Processes,

Filters, Outputs

vipInputImplementation

Ex.vipVideo4Linux

vipFrameRGB24 vipFrameYUV420 vipFrameT<uchar>

OS DependentLibraries and Drivers

vipOutputImplementation

Ex.vipWindowQT

VIPLib Processes,

Filters, Inputs

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

Flusso Dati (2)

vipFilter eredita vipInput e vipOuput incorporandone le capacità di interazione.

Implementazione di vipFilterI dati acquisiti in ingresso vengono elaborati, salvati in un buffer e indirizzati in uscita quando richiesto. [Ex. vipDigitalFilter, vipFilterGeometric]

vipFrameRGB24 vipFrameYUV420 vipFrameT<uchar>

vipFrameRGB24 vipFrameYUV420 vipFrameT<uchar>

VIPLib Processes,

Filters,Inputs

vipFilterImplementation

Ex.vipDigitalFilter

VIPLib Processes,

Filters, Outputs

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

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 frameesporto il frame finale

salvo immagine filtrata

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

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.

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

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;}

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

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);

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

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; };

}

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

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.

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

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<int> intTable(10, 10);

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

Accesso pixel e Canvas

#include “../../source/vipFrameRGB24.h”

pixel-index = y*img.width + x;

PixelRGB24 p = img.data[ pixel-index ];

unsigned char Ri = p[0] ≡ img.data[ pixel-index ][ 0 ];

unsigned char Gi = p[1] ≡ img.data[ pixel-index ][ 1 ];

unsigned char Bi = p[2] ≡ img.data[ pixel-index ][ 2 ];

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

Ottimizzazioni

Esempi di operazioni bitwise0000 0000 1000 0011b << 4 = 0000 1000 0011 0000b = 0x830h = 2096d

X = Y * 8 ↔ X = Y << 3 ; X = Y / 4 ↔ X = Y >> 2

X = Y % 8 ↔ X = Y & 7 ; X ^ Y = Y ^ X; X = X ^ 0;

Esempio di ottimizzazione in scritturafor ( unsigned int i=0; i < buffer->height; i++ )

memcpy( &buffer->data[i*buffer->width],

&img.data[(buffer->height-i-1)*buffer->width],

buffer->width * sizeof(PixelRGB24)

);

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

Riferimenti

All’interno della facoltà:

http://mmlab.science.unitn.it/

https://mmlab.science.unitn.it/

ftp://mmlab.science.unitn.it/

All’esterno della facoltà:

http://mmlab.science.unitn.it:8080/

https://mmlab.science.unitn.it:4430/

ftp://mmlab.science.unitn.it:2121/