• Non ci sono risultati.

4.2 Ricostruzione di un oggetto altamente riettente

5.1.2 Algoritmo MATLAB

È possibile reperire in rete i pattern che sono stati presentati nella paragrafo4.1 per risolvere i problemi di interriessione e defocus. Questi pattern sono stati poi caricati all'interno del codice MATLAB, sviluppato dal dipartimento di Ingegneria Meccanica, che avvia la procedura della loro proiezione.

Il codice completo si sviluppa nelle seguenti fasi:

re viene illuminata la scena utilizzando venti pattern per ciascun codice. I primi dieci serviranno per codicare la scena, gli altri dieci per denire le zone correttamente illu- minate (Li > ¯Li). Per ogni pattern proiettato, sarà scattata un'immagine della scena

mediante una telecamera e salvata in un'apposita cartella.

2. codica delle immagini: le ottanta immagine salvate, sono binarizzate e analizzate per ricostruire le zone non correttamente illuminate. Le immagine relative a ciascun codice sono utilizzate per la creazione di un mappa decimale (IC), necessario per denire la profondità della scena.

3. confronto delle immagini: le quattro mappe vengono confrontate fra di loro per denire la corretta codica della scena. In seguito viene applicato un ltro mediano per ri- costruire i pixel che presentano valori discordanti fra i vari codici. Il risultato nale è costituito da un'unica immagine rappresentante il corretto codice IC.

4. ricostruzione tridimensionale dell'oggetto: si utilizzano i dati di calibrazione telecamera- proiettore per ricavare le coordinate 3D dell'oggetto utilizzando il codice IC trovato al passo precedente. Questa procedura viene applicata ad entrambi i sistemi mono. Il risultato nale consiste in due nuvole di punti, con zone a comuni sovrapposte.

Uno degli svantaggi di questo metodo, come già descritto sopra, è la richiesta di un elevato tempo di acquisizione, poichè è necessario proiettare ottanta diversi pattern. Oltre a questo, i tempi di elaborazione delle immagini non sono trascurabili. Il processo completo viene utilizzato quando non si è a conoscenza del difetto di illumminazione indiretta prevalente. Il confronto tra i quattro codici permette, appunto, di rilevare il difetto principale. Nel caso in cui fosse noto a priori la tipologia di errore presente sulla scena, è possibile snellire il codice, proiettando solamente due delle quattro famiglie di codici. Ad esempio nei materiali metallici, dove avremo esclusivamente eetti di interriessione, si utilizzeranno i codici ad alta frequenza ( XOR ).

In virtù di quanto è stato appena detto, si è deciso di apportare delle modiche al codice originario, in modo da poter selezionare preventivamente il tipo di analisi da eseguire: in questo modo verranno proiettati ed analizzati solamente due dei quattro tipi di pattern. Mediante interfaccia graca verrà richiesto all'utente di selezionare il metodo da utilizzare vedi tabella (5.1).

Tipo di difetto Sequenza di codici da utilizzare input MATLAB

Indeterminato Tutti 1

Dispersione sub-superciale ConventionalGray, MaxMinSWGray 2 Interriessione XOR02, XOR04 3 Tabella 5.1: Scelta del tipo di analisi da avviare per la ricostruzione

Figura 5.1.2: Algoritmo MATLAB

Filtro di varianza Il risultato della fase di decodica è un'immagine delle dimensioni della telecamera (1600x1200 pixel), nella quale viene associato a ciascun pixel uno specico codice. Ovviamente l'immagine è correttamente codicata solamente nell'area della scena che risulta investita dal codice. Generalmente le telecamere acquisiscono una porzione di spazio più ampia di quella su cui viene proiettata la sequenza di pattern; questo comporta la presenza di una cornice dell'immagine in cui i pixel sono codicati in maniera erronea e casuale. Questo eetto è visibile nella fase di ricostruzione e causa rumore eccessivo nella nuvola di punti 3D. Risulta quindi necessario pulire l'mmagine: abbiamo deciso quindi di utilizzare un ltro che elimini questa imperfezione.

La dierenza tra il codice di un pixel con quelli circostanti nella zona non illuminata dal proiettore è alta: questo signica che scegliendo un insieme di pixel vicini, la varianza1 ad

1La varianza è un indicatore della variabilità di un insieme di dati. Un valore basso signica che i dati sono

esso associata assume un valore notevole. Al contrario, dove il codice è ben denito, la vairianza assume valori di gran lunga inferiori. Questa considerazione ci ha permesso di costruire un ltro che fosse in grado di eliminare i punti rumorosi. Operativamente dobbiamo quindi denire una mappa della varianza che ciascun pixel assume rispetto a quelli adiacenti: questo valore viene calcolato denendo un intorno di ciascun pixel mediante un valore che può essere denito dall'operatore. Deniamo adesso il valore di soglia che sarà utilizzato per decidere quali pixel fanno parte del codice (varianza bassa) e quelli rumorosi (varianza alta): più il valore è basso più l'immagine nale risulta ltrata. La scelta della soglia è basata su un'analisi della zona dove il codice è corretto: in generale un valore di 50 sul valore di soglia è più che suciente per eliminare queste zone rumorose.

Quanto detto, è stato tradotto in un codice MATLAB. La variabile k indica la grandezza della maschera per il calcolo della varianza (comando var in MATLAB), mentre con Vtresh assumiamo il valore di soglia. Di seguito si riporta il codice di MATLAB compilato per realizzare il ltraggio.

Figura 5.1.3: Codice MATLAB per il ltraggio

Ritaglio dell'immagine (crop) Per quanto il metodo precedentemente descritto risulti ecace, in quanto consenta un ltraggio globale dell'immagine in maniera del tutto automa- tica, esso richiede un tempo di elaborazione non trascurabile. Si è quindi deciso applicare una maschera che consetisse di selezionare manualmente la porzione di immagine che si vuole

venga decodicata. Questa procedura viene eettuata elaborando l'immagine della scena su cui è proiettata un'immagine completamente bianca. I pixel esclusi dal crop sono classicati con un valore logico non numerico, traducibile in MATLAB con NaN; in questo modo non verranno utilizzati in fase di triangolazione.

Ricostruzione del codice Difetti di illumminazione e errate decodiche possono portare alla formazione di zone in cui il codice non è denito correttamente anche se ben illuminato dal proiettore, analogamente a quanto visto in precedenza. L'azione di ltraggio coinvolge anche queste zone, provocando la comparsa di buchi dove in realtà si avrebbe una supercie. È necessario riempire la zona per avere una buona ricostruzione tridimensionale dell'ogget- to. Sempre operando in ambiente MATLAB, è stato riadattato un algoritmo utilizzato da Wangyang Zhang [17], nel quale si prevede la ricostruzione di una mappa di valori, noti alcuni di essi. Si seleziona dall'immagine ltrata, la zona in cui si presenta il foro da riempire, stan- do attenti ad includere zone di cui sono noti i valori. Questi valori verranno utilizzati come base per l'estrapolazione dei pixel mancanti. La sotto immagine ricostruita viene sovrapposta all'immagine originale conoscendo sia la dimensione che le coordinate della prima.

Figura 5.1.4: Codice ricostruito

La procedura può essere ripetuta più volte a patto che i buchi siano al massimo 10x10 pi- xel. Questo limite è dettato da questioni di tempo, in quanto il costo computazionale del procedimento è esponenzialmente crescente con la dimensione della zona da ricostruire.

Documenti correlati