• Non ci sono risultati.

Una volta installato il pacchetto fornito dagli sviluppatori di OpenCV e predisposto l’ambiente di lavoro, è possibile utilizzare le funzioni implementate: a tale scopo viene di seguito svolta una panoramica sulla struttura della libreria.

La libreria si presenta suddivisa in tre parti principali, a cui si aggiungono due secondarie: nella parte che fa capo al file header <cv.h> sono presenti esclusivamente funzioni che implementano algoritmi di image processing e computer vision; nella parte chiamata CXCORE, il cui header è <cxcore.h>, vengono definiti tipi composti e funzioni che sono utilizzati per funzionalità di base, quali ad esempio strutture di tipo immagine o matrice, funzioni per la manipolazione di vettori o che regolano la gestione della memoria; il terzo ed ultimo blocco principale, che è utilizzabile all’interno delle applicazioni create fornendo al preprocessore la direttiva di inclusione del file <highgui.h>, gestisce l’interfaccia grafica di alto livello e permette di caricare o salvare immagini e filmati, acquisire flusso video da una telecamera, oppure di creare finestre per la visualizzazione su schermo delle immagini. Le due parti secondarie, le cui funzioni e strutture sono definite in <cvcam.h> e <cvaux.h>, vengono fornite per l’inclusione in applicazioni sviluppate utilizzando le versioni precedenti di OpenCV, in quanto al loro interno sono contenute funzioni provenienti da tali versioni ma ritenute obsolete (CVAUX) o di prossima eliminazione (CVCAM).

La struttura che definisce le immagini in OpenCV, è IplImage , nella

maggior parte delle funzioni quello che viene richiesto in ingresso e restituito in output sono puntatori a questo tipo di struttura compatibile con YARP.

7.3.2 Immagini digitali

In questo paragrafo si cercherà di dare un’idea di come funzioni la

Digitalizzazione di un’immagine, ovvero la trasformazione di un’immagine

analogica in una copia digitale, e di come sia possibile rappresentare il colore tramite sequenze di 0 e 1. Per ottenere da un’immagine analogica, per sua natura continua su un dominio bidimensionale continuo, ossia una distribuzione su un dominio a due dimensioni discreto ed a valori discreti, è necessario quindi effettuare due passi principali: il primo, mediante il quale si ottiene una discretizzazione dello spazio, consiste nel suddividere

88

l’immagine originale in un numero intero e limitato di elementi, che verranno definiti pixel (acronimo di picture elements ); con il secondo viene invece discretizzato l’intervallo su cui può variare l’intensità irradiata da ogni punto dell’immagine, suddividendolo in livelli di energia con un processo definito quantizzazione .Mediante la quantizzazione, si stabilisce la

profondità dei pixel, ossia quanti valori diversi potrà assumere un elemento e

si definisce la quantità di bit necessari per descrivere l’intero intervallo di valori: ad esempio un intero ad 8-bit, potendo assumere 2 valori diversi 8 descriverà una quantizzazione (detta semplice ) in 2 livelli, e così via per interi a 16-bit e 8 numeri in virgola mobile a 32 o 64-bit. Il processo completo di suddivisione dell’immagine e quantizzazione dell’energia è definito digitalizzazione . L’effetto dell’applicazione di tale processo ad un’immagine viene mostrato in figura 7.5..

Figura 7.5: Effetto della digitalizzazione di un’immagine. in (a) si può vedere la discretizzazione dello spazio in n×m = 32×32 elementi; infine in (b) si ha il risultato finale, ottenuto suddividendo in livelli l’intervallo di valori dell’immagine.

All’immagine originale viene sovrapposto un reticolo con n righe e m colonne (in questo esempio, come mostrato in Figura 7.5 (a), n=m=32), dopodichè si assegna all’elemento il valor medio dell’energia presente al suo interno, arrotondato all’intero superiore (fig. 7.5 .(b)) . L’esempio nella figura 7.5 (b) mostra un’immagine a tonalità di grigio: è lecito chiedersi se quanto detto in precedenza valga anche se vogliamo digitalizzare

89

un’immagine a colori. La risposta a questa domanda è sì, ma per dimostrare ciò dobbiamo definire i concetti di rappresentazione tricromia e di spazi di

colore .

Allo scopo di rappresentare i colori sulla base di variabili numeriche, dobbiamo definire un sistema denominato spazio di colore : il nome deriva dal fatto di poter rappresentare tali variabili in un sistema di assi cartesiani, in modo da ottenere una rappresentazione spaziale dei colori. Lo spazio di colori più utilizzato,come visto nella visione digitale, è il sistema tricromico indicato dalla sigla RGB.

Dunque per ogni pixel di un’immagine a colori il valore associato ad esso può essere rappresentato mediante tre valori, corrispondenti alle tre coordinate di un punto appartenente allo spazio RGB: in questo caso si dice che l’immagine ha tre canali. Esistono molti altri spazi di colore: è doveroso citare lo spazio HSV, che definendo il colore in base ai tre valori di Hue (tonalità) Saturation (purezza del colore) e Value (intensità luminosa), trova

90

largo utilizzo nelle applicazioni informatiche, e lo spazio CMYK, a quattro dimensioni definito dai colori ciano (Cyan), Magenta, giallo (Yellow) e nero (Black), utilizzato principalmente per la stampa a colori (stampa in

quadricromia ) che sintetizza il colore in maniera sottrattiva.

7.3.3 Gestione di Immagini a Più Canali in OpenCV

Un’immagine a colori è composta da un numero di canali pari alla dimensione dello spazio di colore in cui è definita. OpenCV definisce numerosi spazi di colore e permette di passare da uno all’altro con l’uso della

funzione CvtColor, ma la rappresentazione di base di un’immagine a colori

è data nello spazio BGR, ottenuto da RGB mediante una permutazione dei due assi corrispondenti a blu e rosso. E’ necessario tener conto di questa differente disposizione degli assi dello spazio di colore, in quanto in tutte le funzioni che permettono la gestione dei diversi canali di un’immagine. Gli sviluppatori hanno pensato ad un modo per ovviare a questo inconveniente definendo una macro del preprocessore, CV_RGB, che servisse a definire un valore di colore nel familiare spazio RGB. Fatte queste doverose premesse, è ora possibile analizzare la tecnica di filtraggio implementata nell’applicazione scopo della tesi .

7.3.4 Filtraggio del Colore

Per rendere possibile la selezione dei punti di riferimento in una specifica area, nel nostro caso si tratta della sfera colorata (fig. 6.7) e non avendo altre informazioni sulla conformazione della scena, è stato necessario implementare un algoritmo di filtraggio per escludere lo sfondo ed ottenere un’immagine in cui fosse presente solo la sfera. Nella prima immagine è mostrato il flusso video proveniente dalla telecamera rappresentante l’occhio sinistro del robot di gruppi di pixel su cui calcolare media e deviazione standard del colore nei tre canali BGR a cui segue un’esclusione di tutti i valori di colore nell’immagine che giacciono al di fuori di una finestra definita da (media –n*deviazione_standard, media + n*deviazione_standard), con n fissato e diverso per ogni canale: in sostanza, è stato implementato un filtro passa-banda. L’immagine binaria ottenuta da tale filtraggio è stata poi utile per andare a calcolare il centroide della sfera

91

ed inviare al modulo che simula il blocco RLS i valori di velocità e di posizione di tale punto istante per istante.

7.3.5 Applicazione dell’ algoritmo di filtraggio

I passi implementativi descritti in questa sezione si basano sullo stesso algoritmo di filtraggio di cui si è parlato nella sezione precedente. Inoltre il flusso video sarà acquisito in tempo reale dalla telecamera dell’occhio

sinistro.Saranno necessari dei puntatori a IplImage e un puntatore ad una

struttura di tipo CvCapture, che può contenere un flusso video acquisito da telecamera o da file AVI

Vengono inserite le direttive di inclusione dei file header che utilizzerà il linker, quindi i puntatori a IplImagee a CVCapture

#include <cv.h> #include <cxcore.h> #include <highgui.h>

IplImage* frame, *original, *processed; CvCapture* capture;

All’interno della definizione della prima funzione di filtraggio, si definiscono e inizializzano quindi media e deviazione standard nei tre canali ai valori necessari per filtrare solamente il colore verde

int red_avg = 144; int red_std_dev = 139; int green_avg = 108; int green_std_dev = 255; int blue_avg = 116; int blue_std_dev = 255;

L’accesso alle immagini della telecamera avviene mediante la funzione CaptureFromCAM , e si entra nel ciclo, indefinito, di acquisizione .Per ogni ripetizione del ciclo, il fotogramma corrente del flusso video viene posto nella struttura immagine puntata da frame

92

Documenti correlati