Laboratorio ETI
Image Processing with VIPLib
HandOut
by Alessandro Polo
mercoledì 24 maggio 2006
©
mmLab
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 Studio
http://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
OS Dependent
Libraries and Drivers
vipInput
Implementation
Ex.
vipVideo4Linux
vipFrameRGB24
vipFrameYUV420
vipFrameT<uchar>
VIPLib
Processes,
Filters,
Outputs
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.
VIPLib
Processes,
Filters,
Inputs
vipFrameRGB24
vipFrameYUV420
vipFrameT<uchar>
vipOutput
Implementation
OS Dependent
Libraries and Drivers
Ex.
vipWindowQT
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.
Flusso Dati (2)
VIPLib
Processes,
Filters,
Inputs
vipFrameRGB24
vipFrameYUV420
vipFrameT<uchar>
vipFilter
Implementation
Ex.
vipDigitalFilter
vipFrameRGB24
vipFrameYUV420
vipFrameT<uchar>
VIPLib
Processes,
Filters,
Outputs
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]
Filtraggio
int main(int argc, char* argv[])
{
vipFrameRGB24 srcImage;
vipFrameRGB24 outImage;
vipFilterSobel myFilterClass;
buffers globali
Istanza componente
vipCodec_BMP::load(srcImage, "frame1.bmp",
vipCodec_BMP::FORMAT_BMP_24);
carico immagine
configurazione filtro
myFilterClass.getParameters().setRunMode(vipFilterSobelParameters::DO_SOBEL);
myFilterClass.getParameters().setThreshold(20);
myFilterClass << srcImage;
myFilterClass >> outImage;
importo e filtro frame
esporto il frame finale
vipCodec_BMP::save(outImage, "vipFilterSobel_PROCESSED.bmp",
vipCodec_BMP::FORMAT_BMP_24);
return 0;
}
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 bitwise
0000 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 scrittura
for ( 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/
Scarica

Laboratorio ETI - AlessandroPolo.name