Laboratorio ETI Image Processing with VIPLib HandOut © mmLab by Alessandro Polo mercoledì 24...
-
Upload
nicola-foti -
Category
Documents
-
view
217 -
download
1
Transcript of Laboratorio ETI Image Processing with VIPLib HandOut © mmLab by Alessandro Polo mercoledì 24...
Laboratorio ETI
Image Processing with VIPLib
HandOut
© mmLab
by Alessandro Polomercoledì 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
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
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
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
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
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
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.
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;}
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);
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; };
}
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.
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);
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 ];
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)
);
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/