Sei sulla pagina 1di 8

Augmented Reality: augmented cover of a book.

Fantoni Maria Elena, Furieri Luca

February 2, 2015

Obiettivo del seguente progetto di realtà aumentata è quello di sovrapporre a un video, nel quale viene costantemente inquadrato un libro, un layer su cui sono presenti un logo ed un terzo autore da aggiungere alla copertina: il video aumentato dovrà essere tale da rendere realistica tale sovrapposizione.

Partendo dai suggerimenti proposti, è utile osservare come sussista una relazione di identità fra il layer fornito ed il primo frame del video di input. Poichè la telecamera compie delle roto- traslazioni durante il video, la posizione del libro nell’inquadratura cambia ad ogni frame, ed è necessario quindi definire un algoritmo in grado di parametrizzare tale variazione e di applicarla al layer così che risulti orientato esattamente come il libro. Un secondo problema è poi rappresentato dai cambi di luminosità che avvengono nella scena tra i successivi frame del video (lenti in un primo momento, salto repentino verso il finale del video). Questo comporta infatti sensibili variazioni al colore del libro reale, e risulta quindi necessario ai fini del realismo del video aumentato inseguire al meglio tali cambiamenti cro- matici anche nel layer di realtà aumentata.

Il progetto può quindi essere separato nei due sottoproblemi appena descritti; nel presente documento si procede trattandoli separatamente.

1 LA SOVRAPPOSIZIONE

Analizzando due diversi frame del video di input, dal momento che la telecamera compie delle roto-traslazioni, è possibile trovare la trasformazione geometrica che lega le due scene. L’idea è quella di applicare al layer di realtà aumentata tale trasformazione in modo da sovrap- porlo correttamente alla copertina del libro. Partendo dal fatto che la relazione che lega la

copertina del libro al layer aumentato nel primo frame del video è l’identità, possiamo indi- viduare due modi principali di procedere:

• Frame-to-Reference (F2R): per ogni frame si calcola l’omografia che lo lega al frame iniziale del video, la quale viene poi semplicemente applicata al layer aumentato per sovrapporlo alla copertina. Le variazioni tra le due scene possono però essere anche molto elevate, rendendo difficoltoso in alcuni casi il calcolo dell’omografia.

• Frame-to-Frame (F2F): le due scene confrontate sono sempre due frame consecutivi. In questo modo le variazioni nella posizione del libro risultano contenute, agevolando così il calcolo dell’omografia. Tuttavia, si verifica un fenomeno di accumulo di errore rendendo nel tempo l’omografia calcolata sempre più inesatta.

Tratteremo in seguito più nel dettaglio il problema dell’implementazione software di questi approcci; proporremo anche un approccio ibrido F2R-F2F, in grado di mitigare gli effetti in- desiderati di entrambi.

1.1 IL CALCOLO DELLOMOGRAFIA: LOCAL INVARIANT FEATURES

E‘ necessario estrarre informazioni semantiche di alto livello relativamente a ciascun frame, in modo da identificarne la relazione reciproca e quindi l’omografia che li lega. Esistono diversi metodi per determinare tale tipo di relazione: il più utilizzato nell’ambito della Aug- mented Reality (markerless) è basato sulla descrizione dell’immagine tramite caratteristiche locali invarianti (rispetto alle trasformazioni che subisce la scena) e sulla disposizione di queste ultime, per poi effettuare il matching con il modello di riferimento (nel nostro caso, il primo frame oppure il frame precedente). La descrizione teorica dei necessari algoritmi (fea- ture detectors, descriptors, matchers) esula dagli scopi di questa trattazione: porremo il focus solamente sull’implementazione in OpenCv.

la funzione

void cvGoodFeaturesToTrack( const CvArr* image, CvArr* eig_image, CvArr* temp_image, CvPoint2D32f* corners, int* corner_count, double quality_level, double min_distance,const CvArr* mask=NULL, int block_size=3, int use_harris=0, double k=0.04 );

è stata utilizzata per estrarre i migliori feature points (impostabile con algoritmo Harris Cor- ner Detector oppure Lukas Kanade Tomasi), mentre la funzione

void cvCalcOpticalFlowPyrLK( const CvArr* prev, const CvArr* curr,

CvArr* prev_pyr, CvArr* curr_pyr, const CvPoint2D32f* prev_features,

CvSize win_size, int level,

char* status, float* track_error, CvTermCriteria criteria, int flags );

CvPoint2D32f* curr_features, int count,

è stata utilizzata per trovare le corrispondenze tra i feature points nelle coppie di imma-

gini. Trovate le corrispondenze, lo step successivo è quello di calcolare gli effettivi parametri

dell’omografia tra le due scene planari; tuttavia i frames sono affetti da rumore, e così anche le coordinate dei feature points. Risulta quindi necessario utilizzare molte più corrispondenze

di quelle matematicamente necessarie (almeno 4), rendendo così impossibile la risoluzione

analitica del sistema. Si perviene allora ad una soluzione cosiddetta ai minimi quadrati (re- gressione lineare). Un metodo particolarmente efficace per trovarla è fornito dall’algoritmo RANSAC, il cui scopo è quello di eliminare preventivamente gli outliers (i.e. misure non co- erenti con la distribuzione del rumore che si assume affligga i dati) che possono pesare in maniera consistente sul risultato della regressione; si parla in questo caso di regressione ro- busta. L’algoritmo RANSAC viene utilizzato nel programma tramite la funzione

void RansacEstimator::m_fRansacModelEstimation(CvPoint2D32f* pCorners, CvPoint2D32f* pPreviousCorners,int iCorners,float fEstimatedCornersUncertainty)

presente nel file “Ransac.cpp”. La matrice 3x3 rappresentante l’omografia viene ricavata da un’istanza della classe RansacEstimator

pEstimator->m_pFinalTransformationMat

a

seguito di un reshaping dei parametri.

1.2 IMPLEMENTAZIONE

Il

complessa e più pesante a livello computazionale. Tuttavia, al fine di una corretta implemen- tazione degli algoritmi è stato necessario considerare anche diversi “side aspects”.

calcolo dell’omografia costituisce senza dubbio la parte del progetto concettualmente più

Analizzando le immagini fornite come input, si può notare come il layer presenti su sfondo

nero gli elementi da aggiungere alla copertina, cioè il logo e l’autore. È quindi evidente che una semplice sovrapposizione del layer al frame non darebbe l’esito desiderato, poichè la scena del video verrebbe completamente oscurata. Viene a tal proposito fornita una maschera,

in cui sono presenti pixel bianchi in corrispondenza degli elementi utili del layer, contornati

sempre da sfondo nero. Anche fra maschera e layer sussiste una relazione di identità, così come fra layer e frame iniziale. Pertanto, l’omografia da applicare al layer potrà essere uti- lizzata anche per la maschera. Per individuare i punti del layer da riportare sul frame (una volta applicata l’omografia a tutte le immagini coinvolte) è necessario un ciclo che selezioni unicamente i punti dell’immagine che corrispondono a pixel bianchi della maschera.

Si noti a tal proposito che, per ottenere immagini realistiche, è opportuno utilizzare l’opzione

CV_INTER_LINEAR della funzione

void cvWarpPerspective(const CvArr* src, CvArr* dst, const CvMat* map_matrix, int flags=CV_INTER_LINEAR+CV_WARP_FILL_OUTLIERS, CvScalar fillval=cvScalarAll(0) )

L’utilizzo dell’interpolazione lineare ha però l’effetto negativo di “sporcare” le zone di con- fine del layer, in quanto a seguito dell’applicazione dell’omografia vengono pesati anche i

pixel circostanti (neri nel layer fornito). Per ovviare a questo problema si sostituiscono i pixel neri con i pixel corrispondenti presi dal reference frame. Si vedano a tal proposito le due im- magini 1.1 e 1.2 .

Si vedano a tal proposito le due im- magini 1.1 e 1.2 . Figure 1.1: pixel

Figure 1.1: pixel neri riportati per interpolazione lineare.

Figure 1.1: pixel neri riportati per interpolazione lineare. Figure 1.2: soppressione pixel neri Passiamo ora

Figure 1.2: soppressione pixel neri

Passiamo ora all’analisi dei possibili approcci (F2R,F2F,ibrido)

1.2.1 FRAME-TO-REFERENCE

Come abbiamo detto, nel caso dell’approccio frame-to-reference è sufficiente applicare l’omo- grafia al layer ed alla corrispondente maschera, per poi passare alla fase di ricolorazione e stampaggio sul frame.

PRO: facile da implementare una volta ottenuta l’omografia/ non c’è accumulo di errore. CONTRO: fenomeno di jitter del layer aumentato, dovuto alla difficoltà di trovare sufficienti feature points quando la differenza tra frame corrente e reference frame è molto marcata.

1.2.2 FRAME-TO-FRAME

Nel caso frame-to-frame invece, ottenuta l’omografia che lega le due immagini analizzate, si deve considerare il fatto che il layer non è legato da una relazione di identità con nessuno dei due frame in esame, ma si riferisce a quello iniziale. Si deve dunque considerare la relazione che sussiste fra i due frame analizzati e quello di riferimento. Si procede quindi nel seguente modo:

• L’omografia trovata viene definita diffHomography, a indicare che si tratta di quella relativa a due frame consecutivi. Si utilizza poi una seconda matrice, chiamata pre- vHomography, inizializzata, a inizio progetto, alla matrice identità. Infine una terza matrice, pHomography, contiene i dati da applicare al layer e alla maschera.

• Dopo aver applicato RANSAC, e quindi aggiornato la matrice diffHomography, la si moltiplica per la matrice prevHomography, memorizzando il risultato in pHomogra- phy che sarà quella da applicare al layer.

• Per i primi due frame, il confronto avverrà come nel caso F2R, perchè la prima se-

quenza video coinciderà con il riferimento. In questo caso, l’omografia fra i due frame sarà analoga a quella da applicare al layer. Infatti, essendo prevHomography l’identità, diffHomography e pHomography conterranno gli stessi dati e il caso si riconduce a quello F2R. Per i frame successivi è invece necessario aggiornare prevHomography, copiandovici ad ogni ciclo pHomography. In questo modo si tiene memoria della re- lazione del frame corrente con quello iniziale e si riesce ad ottenere la trasformazione

da applicare al layer, moltiplicando ogni volta prevHomography aggiornata con la ma-

trice ottenuta dall’algoritmo RANSAC.

PRO: si trovano sempre molti feature points tra frame consecutivi, evitando così il fenomeno

di jitter.

CONTRO: Si verifica un fenomeno di accumulo di errore nell’omografia effettivamente ap- plicata al layer (prodotto di omografie “in serie”, nessuna perfetta) che si ripercuote in un disallineamento, a volte piuttosto evidente, del layer rispetto alla scena.

1.2.3 APPROCCIO IBRIDO

Al fine di evitare gli svantaggi che comporta l’utilizzo di uno dei due metodi F2R o F2F, legati

per motivi diversi al calcolo di un’omografia errata, si è pensato di inserire uno stadio di stima

dell’approccio più corretto per ogni frame della sequenza video. Una volta scelto l’approccio,

si procede nella sua applicazione in base a quanto descritto nei due paragrafi precedenti. A

tal fine:

Si

binarizza il reference frame, basandosi sul canale B nella rappresentazione RGB e

scegliendo la soglia con l’algoritmo di Otsu. Nella nostra applicazione si riesce così

ad

isolare in maniera sufficientemente efficace il libro dal resto della scena. Un modo

di

procedere più preciso ed universale sarebbe stato quello di scegliere un reference

color e binarizzare l’immagine in base alla distanza di Mahalanobis da quel colore (scegliendo una soglia T opportuna).

Ad ogni iterazione del ciclo principale, si binarizza alla stessa maniera il frame corrente.

Si

calcolano entrambe le omografie secondo l’approccio F2R e F2F.

Applichiamo entrambe le omografie così calcolate al reference frame binarizzato, e per entrambi i metodi effettuiamo il confronto pixel-by-pixel con il frame corrente binariz- zato. L’approccio più corretto sarà quello per cui il numero di pixel di colore differente è minore.

N.B: la binarizzazione, effettuata in questo modo, considera una parte considerevole del li- bro come sfondo; porzione che in più varia al cambiare della luminosità. L’algoritmo rimane

comunque efficace perchè ciò che interessa non è tanto identificare correttamente il libro, quanto piuttosto lo scarto di identificazione tra i due metodi.

Generando il video aumentato secondo questa procedura, ci accorgiamo che entrambi i prin- cipali problemi di F2R e F2F (rispettivamente jitter e disallineamento progressivo) vengono eliminati, proprio in virtù del fatto che viene scelta per ogni frame l’omografia più esatta (in- terrompendo così anche il fenomeno di accumulo di errore ogni volta che si passa a F2R).

2 TRACKING DEL COLORE

La luminosità del video di input non è costante: si assiste a variazioni ridotte durante la prima fase del video (sufficienti a far risaltare il layer di realtà aumentata nel caso non si prendano provvedimenti) e molto grandi nella fase finale (il colore di sfondo della copertina del libro vira improvvisamente verso il viola). Gli obiettivi da raggiungere applicando opportune trasformazioni cromatiche sono:

• “Trasparenza” tra layer e frame in corrispondenza di quelle zone in cui il layer non inserisce informazione aggiuntiva rispetto al video di input.

• Mantenere costante il rapporto di colore e intensità tra la scritta aumentata (“Pietro Azzari”) e la scritta reale (“Richard Harley and Andrew Zisserman”) durante tutta la durata del video.

• Modificare il colore di sfondo del logo “CVLab” per rispecchiare i cambiamenti di lumi- nosità.

Si è dapprima provato ad operare nello spazio di colore RGB, ma con scarsi risultati: i tre canali risultano altamente correlati ed è molto difficile comprendere come si ripercuotono su di essi i cambi di luminosità, essendo uno spazio percettivamente non uniforme. Nella ricerca di uno spazio di colore che isolasse su un singolo canale l’informazione relativa alla luminosità, abbiamo identificato Lab.

2.1 LO SPAZIO DI COLORE LAB

Riportando una definizione trovata in rete (Wikipedia), risulta che “lo spazio colore Lab o CIELAB o CIE 1976 (L*, a*, b*) è uno spazio colore-opponente con la dimensione L per la lu- minosità e a e b per le dimensioni colore-opponente, basato sulle coordinate dello spazio colore non lineare compresso CIE XYZ.” La luminosità, calcolata come la radice cubica della luminanza relativa, è dunque un’informazione contenuta nel singolo canale L.

OpenCV dispone della funzione

void cvCvtColor(const CvArr* src, CvArr* dst, int code)

che permette di passare dallo spazio RGB a quello Lab, e riconvertire in RGB una volta effet- tuate le operazioni necessarie.

N.B: abbiamo riscontrato che tale funzione contiene un errore nelle prime versioni di OpenCV (la 1 compresa) e non converte correttamente in Lab. Pertanto abbiamo utilizzato OpenCV

2.4.

2.2 L’ ALGORITMO DI CAMBIO COLORE

Per raggiungere l’obiettivo di trasparenza nelle zone senza informazione aggiuntiva, abbiamo due possibili strade:

• Inseguire, pixel per pixel, le variazioni dei valori di ogni singolo canale nel video di input. In questo caso l’alterazione dei canali viene eseguita su tutti quei pixel del layer che risultano bianchi nella sua maschera (a cui sia stata applicata l’omografia).

• effettuare la differenza tra il frame iniziale e la parte non nera del layer (identificabile sfruttando la sua maschera) per estrarre la posizione di quei pixel che appartengono esclusivamente alla scritta "Pietro Azzari" e al logo "CVLab". Tutti gli altri pixel del layer, compresi quindi quelli che vogliamo lasciare “trasparenti”, rimarranno invariati.

Per quanto riguarda il canale L abbiamo optato per la prima ipotesi per un motivo di mag- giore uniformità risultante sui contorni della scritta “Pietro Azzari" (e di “CVLab”, anche se in maniera meno evidente). Questo per permettere che l’interpolazione lineare operasse sui contorni della scritta, in modo da rendere dolci le transizioni di luminosità. Per quanto riguarda i canali a e b, è invece risultato necessario isolare la scritta “Pietro Azzari” ed il logo per non far trasparire in loro corrispondenza l’alterazione dei colori tra i vari frame. Pertanto su tali canali, in corrispondenza della scritta e del logo, verrà propagato inalterato il colore del Layer.

N.B: nell’effettuare tale operazione abbiamo notato che la dicitura relativa agli autori orig- inari non è perfettamente corrispondente tra layer e reference frame (una possibile spie- gazione di questo fatto è che l’algoritmo di compressione “lossy” dell’immagine a seguito dell’editing per inserire le informazioni aggiuntive abbia alterato anche la parte degli autori reali). Abbiamo quindi dovuto restringere la maschera del layer per eliminare questa zona che risultava erroneamente diversa.

In definitiva, l’algoritmo utilizzato per la trasformazione cromatica è riassumibile come segue:

Per tutti i pixel appartenenti a layerMask_warp:

Canale L:

risultato = frame_attuale + layer_warp - referenceFrame_warp; Canali A e B:

IF (e’ un pixel della scritta AZZARI o del logo) risultato = layer_warp

ELSE risultato = frame_attuale + layer_warp - referenceFrame_warp

dove per frame_attuale, layer_warp, referenceFrame_warp si intendono i valori nei rispettivi canali e nelle rispettive immagini (per _warp si intende “a cui è stata applicata l’omografia di sovrapposizione”).

3 RISULTATI.

Il software permette di scegliere con quale approccio generare il video di output (F2R, F2F, ib- rido). E’ possibile anche scegliere se utilizzare la maschera del layer originale, oppure quella ridotta per evitare le scritte dei primi due autori.

È possibile trovare i video di output del software ai seguenti link:

Come previsto, si possono osservare i seguenti fenomeni:

• Nel video F2R la sovrapposizione è a volte instabile: capita che tra frame successivi la posizione del layer cambi di poco ma repentinamente, generando un effetto poco realistico di discontinuità. Il fenomeno è apprezzabile soprattutto nell’ultima parte del video, quando è più difficile trovare corrispondenze con il reference frame a causa dell’alterazione dei colori.

• Nel video F2F non si presentano i problemi evidenziati nel caso F2R: ciononostante si accumula via via un errore che si ripercuote in un disallineamento costante di scritta aggiuntiva e logo rispetto al libro.

• Nel video Hybrid entrambi i problemi di F2R e F2F risultano fortemente mitigati.

• L’effetto dell’utilizzo della maschera originale (non ridotta) è quello di rendere poco nitida e molto rumorosa la zona in corrispondenza dei due autori reali.