• Non ci sono risultati.

Per valutare la correzione delle aberrazioni geometriche, apportate a livello software, occorre generare delle immagini omografate, che è possibile creare in ambiente Matlab. Si è pertanto deciso di cambiare strategia e cioè di abbandonare il software Rhinoceros e di lavorare interamente su Matlab, sfruttando le sue funzionalità in fatto di grafica 3D.

In Matlab è possibile creare uno scenario virtuale ad hoc, nel quale si possono inserire superfici ed oggetti ed osservarli tramite camere virtuali che possano essere liberamente collocate ed orientate all’interno dello spazio virtuale a seconda delle necessità del caso. È stato quindi elaborato un programma per la simulazione dell’intero processo di acquisizione: dall’ottenimento delle immagini di una griglia di riferimento da parte delle telecamere fino alla simulazione di ciò che vedrebbe l’occhio attraverso il display. Per una comprensione completa del simulatore è bene analizzarlo nel dettaglio sezione per sezione.

In primo luogo è stato necessario definire i sistemi di riferimento relativi agli occhi, ai display, alle telecamere e al mondo. Come annunciato alla fine del paragrafo precedente, in queste prime analisi i centri di proiezione di occhi e display sono considerati coincidenti (mentre c’è offset con la camera); successivamente invece si è tenuto conto anche di un offset tra occhio e display. L’origine del mondo virtuale rappresenta l’origine dello spazio virtuale che si sta creando, quindi il successivo posizionamento di tutti gli elementi in gioco (griglia di riferimento, camere, display ed occhi) è stato fatto rispetto a questo punto.

Per determinare i sistemi di riferimento, è stato sfruttato il file CAD relativo ad un visore HMD reale presente in laboratorio, che verrà meglio descritto nel seguito della tesi. Per ciascun sistema ottico in gioco (camere, display e occhi) sono state prelevate dal CAD le coordinate di tre punti noti non allineati (ipotizziamo 𝑷𝟏, 𝑷𝟐 e 𝑷𝟑); i tre sistemi di riferimento sono quindi stati derivati da questi

insiemi di punti grazie alle seguenti formule:

𝑥̂ =

(𝑃2−𝑃1)

‖(𝑃2−𝑃1)‖

𝑦̂ =

(𝑃3−𝑃1)−((𝑃3−𝑃1)𝑇⋅ 𝑥̂)⋅ 𝑥̂

‖(𝑃3−𝑃1)−((𝑃3−𝑃1)𝑇⋅ 𝑥̂)⋅ 𝑥̂ ‖

𝑧̂ = 𝑥̂ ∧ 𝑦̂

(4.6)

Inoltre, insieme ai sistemi di riferimento sono state definite anche le matrici di rototraslazione che consentono di trasformare le pose degli oggetti presenti nello scenario da un sistema di riferimento all’altro.

51 Figura 4.2: Sistemi di riferimento e matrici di rototraslazione utilizzati: la matrice 𝑇𝑤𝑐 esprime la posa della camera nel

sistema di riferimento mondo, la matrice 𝑇𝑤𝑒 esprime la posa dell’occhio nel sistema di riferimento mondo ed infine la

matrice 𝑇𝑐𝑒 indica come è posizionato l’occhio nel sistema di riferimento della camera. La linea tratteggiata sta ad

evidenziare la coincidenza tra il frustum del display e quello dell’occhio.

Definiti i sistemi di riferimento e le matrici di trasformazione si può procedere con il posizionamento degli elementi all’interno dello spazio virtuale. All’utente è richiesto l’inserimento da tastiera delle dimensioni di una griglia che si vuole osservare, della distanza alla quale la si vuole posizionare rispetto alla direzione Z del sistema di riferimento del mondo (il centro della griglia è allineato con il centro di tale piano, e l’unico spostamento consentito è lungo l’asse Z, in blu nella figura precedente, quindi unicamente in avanti e indietro rispetto al piano di riferimento), la distanza interpupillare e la traslazione lungo l’asse Z degli occhi rispetto al piano di riferimento. In particolare, grazie a queste ultime due distanze il programma è in grado di determinare la posizione in cui gli occhi si troveranno rispetto al centro della griglia. La posa finale degli occhi viene determinata successivamente a seconda che questi siano in configurazione parallela tra loro o convergente; anche questa informazione deve essere inserita manualmente dall’utente.

Una volta nota la posizione degli occhi è possibile definire anche la posizione dei display e delle camere; per posizionare i primi possono essere sfruttate le specifiche tecniche del display che si sta simulando: generalmente infatti una delle informazioni fornite dal costruttore del display è proprio la distanza alla quale l’immagine riprodotta sul display è posizionata rispetto all’origine del suo frustum. Per la posizione delle camere si sfruttano invece le matrici di rototraslazione

52 precedentemente definite. Anche in questo caso l’utente deve definire se le camere sono in configurazione parallela o meno; questa informazione viene utilizzata per elaborare la posa finale di entrambi.

Ultimata la disposizione degli elementi nello scenario virtuale si procede con l’acquisizione delle immagini. Le immagini che vengono restituite in output dal programma sono diverse; per ciascun lato (destro e sinistro) si ottengono:

 L’immagine acquisita ad occhio nudo, ovvero l’occhio che osserva la griglia di riferimento;  L’immagine della griglia acquisita dalla telecamera del visore VST che si sta simulando,

posizionata ed orientata come richiesto dall’utente;

 L’immagine omografata, ovvero l’immagine acquisita dalla telecamera elaborata come se fosse stata acquisita dal punto di vista dell’occhio;

 L’immagine che vede l’occhio osservando il display, sul quale è stata precedentemente proiettata l’immagine omografata;

 La sovrapposizione tra l’immagine vista ad occhio nudo e quella vista sul display (ottenuta quindi osservando il display in trasparenza, come se fosse un Optical See-Through);

 La sovrapposizione tra l’immagine osservata nel display destro e nel display sinistro; l’intento in questo caso è quello di simulare le due immagini retiniche utilizzate poi per la fusione che avviene a livello cerebrale tra l’immagine vista dall’occhio destro e dall’occhio sinistro. L’acquisizione ad occhio nudo viene utilizzata come termine di confronto; l’omografia ha infatti l’obiettivo di riportare il punto di osservazione della camera coincidente con il punto di vista dell’occhio. Pertanto, se l’omografia viene applicata in maniera corretta non ci dovrà essere differenza tra l’immagine acquisita ad occhio nudo e quella mediata dal display. Se tutto funziona correttamente dunque la penultima immagine fornita in output deve presentare una sola griglia. Stavolta, piuttosto che utilizzare delle griglie di punti come nei casi ideali analizzati nel capitolo precedente, si è deciso di utilizzare una scacchiera composta da quadrati bianchi e neri di dimensioni note. Si è ritenuto infatti che in questo modo il confronto visivo tra le immagini acquisite ad occhio nudo e le immagini omografate e proiettate sul display fosse più immediato e più facilmente comprensibile.

53 Figura 4.3: Griglia di riferimento utilizzata nel simulatore.

Per l’acquisizione delle immagini sono state create due funzioni separate: ‘emulatoreCamera.m’ da utilizzare nei casi in cui si osserva la griglia nello spazio, sia che la si guardi ad occhio nudo o tramite la telecamera, e ‘screenEyeEmulator.m’ usata quando si vuole invece osservare il display dal punto di vista dell’occhio.

Il principio di funzionamento dei due codici è lo stesso: in entrambi i casi viene utilizzata la funzione ‘surface’ di Matlab [43], che consente di creare una superfice piana delle dimensioni desiderate all’interno della quale viene proiettata come mappa di colore l’immagine di interesse: nella prima funzione la griglia nelle sue dimensioni reali, mentre nella seconda l’immagine acquisita dalle telecamere e omografata, con una risoluzione pari a quella dei display che si stanno simulando (altra informazione fornita tra le specifiche tecniche del display stesso). La funzione ‘surface’, oltre a creare l’oggetto superfice, consente anche di posizionarlo ed orientarlo a piacimento all’interno dello scenario virtuale; in questo modo si è perfettamente in grado di ricreare le condizioni di lavoro reali.

Una volta che l’oggetto superfice è stato correttamente collocato ed orientato nello spazio, non resta che definire la posa della telecamera virtuale con la quale verrà scattata l’istantanea. Per farlo si hanno a disposizione due parametri: il CameraPosition, un vettore di tre elementi (x, y e z) grazie al quale si può definire la posizione della camera nello spazio, ed il CameraTarget, un vettore di tre elementi (x, y e z) con il quale si definiscono invece le coordinate dello spazio verso cui la telecamera punta. Definendo la posizione ed il target si riesce a posizionare e ad orientare la camera, così da simulare la telecamera reale o l’occhio a seconda dei casi.

54 consente di specificare il nome dell’immagine, il formato in cui questa viene salvata, e la sua risoluzione.

La terza ed ultima funzione creata per il simulatore è la funzione ‘homography.m’; questa viene utilizzata per calcolare l’omografia da applicare all’immagine acquisita dalla telecamera prima che questa venga proiettata sul display. In particolare grazie alla matrice omografica presentata nella formula (4.5) viene applicato un warping al frame acquisito dalla telecamera. La funzione ‘homography.m’ restituisce in output sia la matrice omografica che l’immagine risultante in seguito all’applicazione dell’omografia.

La funzione ‘homography.m’ viene utilizzata anche all’interno di ‘emulatoreCamera.m’ nel caso in cui si stia simulando la vista da parte delle telecamere. Nell’ambiente ricreato con Matlab infatti, le telecamere virtuali che vengono utilizzate per inquadrare la scena ed acquisire le immagini sono delle telecamere ideali: il loro principal point, ovvero la proiezione sul piano immagine del centro di proiezione, coincide con il centro del piano immagine stesso. Tuttavia le camere effettivamente usate nei dispositivi reali non presentano mai queste caratteristiche di idealità; pertanto il principal point di queste camere reali risulterà sempre essere traslato rispetto al centro del piano immagine. Dato che l’obiettivo del programma è quello di simulare il più fedelmente possibile ciò che avviene nella realtà, all’immagine acquisita dalla camera virtuale ideale viene applicata una prima omografia bidimensionale al fine di simulare l’acquisizione di un’immagine con una camera “off center”. La R utilizzata in questo caso per il calcolo dell’omografia sarà un’identità, poiché i piani tra i quali viene calcolata la trasformazione sono paralleli tra loro. La componente traslativa che identifica il principal point deve essere spostata rispetto al centro del piano immagine in funzione dei parametri reali della camera che si vuol simulare (ottenibile con il processo di calibrazione per ottenere i parametri intrinseci delle camere).

55

Documenti correlati