Università degli studi di Roma La Sapienza Facoltà di Informatica Tesi di Laurea in Informatica Sintesi di volti virtuali da foto ortogonali Relatore Candidato Prof. Paolo Bottoni Graziella Geremia Correlatore Ing. Marco Fratarcangeli Anno Accademico 2005/2006 Dedica Indice 1 Introduzione 4 1.1 Contesto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 1.2 Descrizione del problema . . . . . . . . . . . . . . . . . . . . . 5 1.3 Soluzione proposta . . . . . . . . . . . . . . . . . . . . . . . . 6 1.4 Struttura della tesi . . . . . . . . . . . . . . . . . . . . . . . . 8 2 Background 11 2.1 Modellazione di un volto . . . . . . . . . . . . . . . . . . . . . 11 2.2 Generazione di texture . . . . . . . . . . . . . . . . . . . . . . 13 2.3 Modello generico di un volto umano . . . . . . . . . . . . . . . 15 2.4 Standard MPEG-4 . . . . . . . . . . . . . . . . . . . . . . . . 17 3 Deformazione del volto 20 3.1 Acquisizione foto ortogonali . . . . . . . . . . . . . . . . . . . 21 3.2 Specifica FDP sulle foto . . . . . . . . . . . . . . . . . . . . . 22 3.3 Morphing con le radial basis function . . . . . . . . . . . . . . 25 3.4 Scelta della radial basis function . . . . . . . . . . . . . . . . . 27 3.5 Algoritmo di deformazione . . . . . . . . . . . . . . . . . . . . 40 4 Texturizzazione del volto 41 4.1 Texture mapping . . . . . . . . . . . . . . . . . . . . . . . . . 42 4.2 Cube Map . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44 4.3 Confronto tra cube map e tecniche tradizionali . . . . . . . . . 46 4.4 Generazione texture . . . . . . . . . . . . . . . . . . . . . . . 47 2 4.5 Disegno Mesh . . . . . . . . . . . . . . . . . . . . . . . . . . . 55 4.6 Algoritmo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55 5 Implementazione 61 5.1 Struttura dell’applicazione . . . . . . . . . . . . . . . . . . . . 61 5.2 Sottosistema Modellazione-Texturizzazione . . . . . . . . . . . 62 5.3 Sottosistema Interfaccia grafica . . . . . . . . . . . . . . . . . 66 5.4 Librerie utilizzate . . . . . . . . . . . . . . . . . . . . . . . . . 68 6 Risultati 69 6.1 Prove di rendering . . . . . . . . . . . . . . . . . . . . . . . . 70 6.2 Analisi dei tempi di esecuzione . . . . . . . . . . . . . . . . . . 78 6.3 Analisi qualitativa dei risultati . . . . . . . . . . . . . . . . . . 80 7 Conclusioni 7.1 82 Possibili sviluppi . . . . . . . . . . . . . . . . . . . . . . . . . 83 A OpenGL e cubemap 89 B Risoluzione sistema tramite fattorizzazione LU 93 3 Capitolo 1 Introduzione 1.1 Contesto La generazione di modelli di volti umani 3D realistici ha attirato negli ultimi anni un crescente interesse nell’ambito dell’informatica grafica moderna, stimolato dallo sviluppo dei numerosi campi in cui trova applicazione e favorito dall’evoluzione delle schede grafiche dalla potenza di calcolo sempre maggiore. La sintesi di volti realistici è il primo passo verso l’animazione facciale; il suo dominio di applicazione è vasto ed include vari settori che spaziano dall’ambito puramente ricreativo(film, videogiochi) ad attività di interesse generale(medicina, insegnamento a distanza). In particolare, con lo sviluppo di ambienti virtuali in cui le persone possono interagire tra loro attraverso personaggi virtuali chiamati avatar, è emersa la necessità di creare volti umani 3D che rispecchino l’apparenza di ogni singola persona. Ciò consente di immergere un individuo in un mondo virtuale e trova applicazione, ad esempio, nelle videoconferenze o nei videgiochi dove viene data al giocatore la possibilità di assegnare al proprio personaggio un avatar personalizzato. La generazione di un modello 3D realistico non è un problema banale. Il fattore principale per descrivere una persona è rappresentato dal suo volto, 4 1.2. Descrizione del problema veicolatore di caratteristiche e dettagli somatici che lo rendono distinguibile. Particolare attenzione è quindi richesta nella creazione di personaggi virtuali. Se si considerano la complessità della struttura anatomica di un volto e la naturale propensione di un essere umano nel percepire anche piccoli dettagli e cambiamenti su qualcosa che gli è familiare, si può intuire come la modellazione facciale costituisca un problema aperto ed interessante nell’ambito della computer graphics. 1.2 Descrizione del problema Un volto umano è una forma geometrica estremamente complessa e soggetta a vincoli di proporzionalità. Un modo per ottenere un buon grado di realismo consiste nel basare la sua modellazione su una persona reale. In tal senso, le immagini di uno stesso soggetto catturate da diverse angolazioni forniscono importanti informazioni inerenti la geometria, la forma e l’apparenza di un volto. Il problema affrontato in questa tesi consiste nella ricostruzione tridimensionale di un volto umano attraverso l’utilizzo di immagini ortogonali che lo ritraggono. L’obiettivo è quello di ottenere un modello 3D in grado di riprodurre la forma e l’apparenza del volto. In linea generale, due foto ortogonali, che catturano rispettivamente una vista frontale e una laterale del volto, sono sufficienti per la sua ricostruzione trimidensionale: sfruttando la simmetria del volto, è possibile dedurre approssivamente le informazioni del profilo non rappresentato nella foto laterale a partire dall’immagine che ritrae il profilo opposto.Un numero maggiore di immagini non può far altro che influire positivamente sul risultato finale incrementando il realismo ed il grado di dettaglio. Il processo di generazione di un modello di volto umano descritto in questa tesi può essere pensato come una traslazione da una rappresentazione bidimensionale del volto costituita da fotografie ad una rappresentazione tridimensionale, ossia un modello di volto 3D in congiunzione con le texture da 5 1.3. Soluzione proposta applicarvi. Le problematiche affrontate sono legate principalmente a: • la deformazione di un volto generico in modo da adattarlo al volto presente nelle immagini • la generazione delle texture da applicare al volto per ottenere un effetto realistico 1.3 Soluzione proposta Questo progetto di tesi mostra come sia possibile realizzare volti umani realistici a partire da un generico modello di volto tridimensionale e da una serie di immagini raffiguranti il volto di una persona. Si può pensare quindi ad un processo che, preso in input un modello di volto 3D generico e una serie di immagini raffiguranti il volto di un soggetto umano, restituisca in output il modello 3D rappresentante il volto presente nelle immagini. Nell’ambito di questa tesi chiameremo il modello di volto generico source model, intendendo distinguerlo dal target model definito dal volto presente nelle foto. L’approccio utilizzato prevede la suddivisione del problema in alcuni moduli, ciascuno dei quali rappresenta un’unità logica separata dall’intero sistema. Il primo modulo si occupa di adattare la geometria del source model a quella del target model. A tale scopo è necessario determinare una serie di corrispondenze tra i punti cruciali di ciascun modello. Si utilizzano, nel nostro caso, gli FDP(Facial Definition Points) dello standard MPEG4. Si tratta di un insieme di parametri che, essendo localizzati in parti caratteristiche del volto(pupilla dell’occhio, angolo della bocca, ecc.), consentono di definire l’apparenza di un volto. Si è sviluppata un’interfaccia grafica che consente all’utente di specificare gli FDP su ciascuna foto; la loro posizione nello spazio viene poi utilizzata nel processo di deformazione del source model guidato dalle radial basis function. La selezione degli FDP su ciascuna foto è l’unico 6 1.3. Soluzione proposta passo dell’intero processo in cui è richiesta l’interazione dell’utente. Il secondo modulo riguarda la texturizzazione del volto. Per ottenere modelli sintetici realistici di volti virtuali è fondamentale la creazione e la manipolazione della tessitura che crea l’apparenza dei dettagli caratterizzanti la pelle umana e che sono assenti nella geometria del modello 3D.Il problema consiste nel riuscire a combinare le informazioni provenienti dalle varie foto in modo tale da creare una tessitura del volto uniforme e realistica. Particolare attenzione è stata dedicata a quest’aspetto introducendo una nuova tecnica di texturizzazione basata sull’utilizzo delle cube map. Generalmente le cube map vengono usate per l’environment mapping al fine di creare effetti di riflessione molto realistici di un oggetto nella scena in cui si trova. In questo progetto esse vengono utilizzate come tecnica di texturizzazione di oggetti la cui forma può essere idealmente racchiusa in un cubo. A partire dalle fotografie in input si generano sei texture che andranno a ricoprire le sei facce di un cubo e verranno successivamente mappate sul volto in maniera opportuna. Questa tecnica, comparata con le tecniche tradizionali utilizzate, presenta alcuni vantaggi: è indipendente dal tipo di volto utilizzato, consente di evitare fenomeni di distorsione e il presentarsi delle cuciture, ossia linee che identificano il passaggio dal contributo di una texture all’altra. Si è proposto un algoritmo adattivo volto a scongiurare la presenza di zone di discontinuità di colore. Durante la combinazione di più immagini, a causa di differenti condizioni di illuminazione, presenze di ombre ed errori di registrazione delle immagini, può accadere che zone del volto adiacenti presentino una discontinuità cromatica. Per ovviare a tale problema, si è proposto un algoritmo adattivo che elimina tali artefatti preservando gli attributi di colore. Durante lo sviluppo di questa tesi è stata considerata la complessità computazionale richiesta per eseguire le tecniche descritte cercando di eseguire il maggior numero di ottimizzazioni per alleviarne il carico. Il lavoro svolto in questa tesi risulta essere molto semplice e lineare dal punto di vista concettuale: esso si propone come una linea guida da seguire per 7 1.4. Struttura della tesi ottenere una ricostruzione tridimensionale con un buon grado di realismo. In questa trattazione vengono dichiarate le scelte effettuate, vengono descritte in maniera dettagliata le problematiche osservate e proposte delle soluzioni. La figura 1.1 mostra i passi che descrivono l’intero processo di generazione di volti virtuali. 1.4 Struttura della tesi Capitolo 2 : introduce il tema della sintesi di volti virtuali realistici illustrandone le origine e lo stato dell’arte. Presenta inoltre la descrizione di alcune informazioni richieste alla comprensione della tesi. Capitolo 3 : descrive la nostra tecnica di modellazione di un volto. A partire da un insieme di fotografie ortogonali che ritraggono il volto di una persona, un generico modello di volto tridimensionale viene deformato affinchè assuma la forma del volto presente nelle foto. Viene descritto il metodo di acquisizione degli FDP dalle varie foto e viene illustrato il processo di deformazione del volto guidato dalle radial basis function. La presenza nel capitolo di uno studio dettagliato sulle radial basis function è volta a giustificare la scelta della funzione di interpolazione più idonea al processo di deformazione del volto. Capitolo 4 : è inerente alla texturizzazione del volto. Si introduce la tecnica delle cube map mostrandone le caratteristiche e le differenze rispetto alle tecniche tradizionalmente adottate. L’algoritmo utilizzato per la generazione delle texture a partire dalle immagini iniziali e la loro applicazione sul volto costituiscono il punto focale di questa tesi e vengono descritti in maniera dettagliata. Capitolo 5 : presenta un’analisi descrittiva dell’applicazione. Viene mostrata l’organizzazione e le relazioni fra i vari moduli con l’ausilio di diagrammi UML. 8 1.4. Struttura della tesi Capitolo 6 :descrive, visualizza ed analizza alcuni risultati ottenuti mettendo in evidenza le caratteristiche del sistema. Capitolo 7 : conclude questa tesi con un sommario del lavoro svolto ponendo l’accento sui possibili sviluppi futuri. 9 1.4. Struttura della tesi Foto input Modello generico Selezione FDP Modello generico deformato Texture generate Risultato finale Fig. 1.1: Processo di generazione di volti virtuali 10 Capitolo 2 Background Questo capitolo introduce il tema della sintesi di volti virtuali realistici illustrandone le origine e lo stato dell’arte. Descriveremo i vari approcci al problema presenti in letteratura distinguendo tra la parte di modellazione e deformazione del volto e quella relativa alla generazione di texture. Presenteremo inoltre la descrizione di alcune informazioni richieste alla comprensione della tesi. 2.1 Modellazione di un volto In relazione alla modellazione di volti umani, sono stati proposti e sviluppati molti metodi che possono essere ricondotti in due principali categorie: tecniche basate sull’utilizzo di scanner laser e tecniche basate sulle immagini. Nel primo caso, la geometria e l’apparenza di un volto può essere acquisita da scanner laser che evidenziano le posizioni tridimensionali dei punti sulla superficie. Questo approccio presenta aluni svantaggi. Lo scanner non può acquisire la geometria di aree complesse quali orecchie e capelli,produce texture di bassa risoluzione ed i modelli ottenuti sono sufficienti solo per rappresentazioni statiche del volto, in quanto non presentano le informazioni tali da consentire tecniche di animazione del volto. La nostra tecnica rientra nell’altra categoria: le immagini di un volto ven- 11 2.1. Modellazione di un volto gono utilizzate per creare la geometria del volto. Rispetto ai metodi di modellazione che utilizzano lo scanner, il nostro metodo richiede una semplice attrezzatura rappresentata da una fotocamera e consente di estrarre texture ad alta risoluzione. Il prezzo da pagare per questi vantaggi è la necessità dell’intervento dell’utente nel processo di modellazione. La prima tecnica di modellazione del volto basata sulle foto fu sviluppata da Parke [1, 2] e prevedeva l’utilizzo di griglie disegnate direttamente sul volto del soggetto. A causa della presenza di tali griglie, le immagini utilizzate per costruire il modello di volto non potevano essere usate come mappe di tessitura. Recentemente sono stati proposti molti metodi che permettono la ricostruzione del modello senza l’utilizzo di griglie. In [3, 4, 5] viene utilizzato un database di volti neutrali costruito acquisendo, attraverso uno scanner, la geometria del volto da un centinaio di soggetti. Partendo da una sola fotografia, un algoritmo ricerca la forma del volto che si avvicina maggiormente alla geometria del volto della fotografia. Gli altri approcci prevedono essenzialmente due passi: l’estrazione di alcuni punti del volto e la deformazione di quest’ultimo. Nel primo passo un numero limitato di punti, corrispondenti a punti caratteristici del volto, vengono rilevati in maniera automatica o interattivamente dalle immagini. Kurihara and Arai [6] hanno utilizzato un metodo interattivo per determinare alcuni punti caratteristici. In [7] e [8] viene usato un approccio simile. Questi due approcci tentano di individuare automaticamente i feature points su due immagini ortogonali catturate dalle viste frontale e laterale usando un template dinamico per controllare i punti concavi e convessi sul profilo laterale di una faccia. Gli approcci sinora descritti sono simili ed hanno lo svantaggio di utilizzare un piccolo numero di punti caratteristici per deformare il volto generico. Ciò può condurre ad avere come risultato un volto la cui geometria presenta discostamenti dal reale. Nel lavoro [9] viene descritto un metodo per deformare un volto generico ed 12 2.2. Generazione di texture adattarlo al volto presente in cinque diverse fotografie catturate simultaneamente attraverso l’utilizzo di cinque fotocamere. In ognuna di esse, viene marcato un insieme di punti caratteristici corrispondente ad un sottoinsieme dei vertici della mesh del volto generico. Una volta ottenute queste corrispondenze, viene ricostruita la posizione delle varie fotocamere e la posizione 3D dei punti caratteristici in base ai quali viene effettuata la deformazione. Questo approccio è concettualmente simile al nostro, noi utilizziamo però come punti caratteristici gli FDP dello standard MPEG-4, di cui parleremo ampliamente nel paragrafo 2.4. In [10] [11], viene descritto un metodo che utilizza in input due foto ortogonali (vista frontale e vista di profilo) per ricostruire un modello 3D del volto. Il metodo è basato sull’estrazione degli FDP sulle foto tramite l’utilizzo di un interfaccia con l’utente e il modello viene poi deformato in base alle corrispondenze individuate. Per la parte di texturizzazione viene composta un’unica immagine combinando le informazioni dalle immagini presenti. Il secondo passo è quello della deformazione: i punti estratti vengono utilizzati come punti di controllo per deformare un modello generico; gli altri punti del volto vengono modificati applicando una particolare funzione. Alcuni approcci [12] prevedono l’uso della Dirichlet Free Form Deformation(FFD), noi proponiamo come altri [13, 14, 15], l’utilizzo delle radial basis function che consentono di ottenere una deformazione piuttosto regolare. 2.2 Generazione di texture Una volta determinata la forma del modello di volto, è necessario creare la tessitura(texture) corrispondente. La pelle del volto umano presenta delle caratteristiche che la rendono difficile da riprodurre. L’approccio più semplice [16] consiste nell’utilizzo uno di scanner laser Cyberware in grado di acquisire la forma geometrica del volto e la texture creando una corrispondenza tra i punti 3D ed i pixel dell’immagine texture [17, 18]. Questo metodo ha lo svantaggio di creare texture con bassa risoluzione. In 13 2.2. Generazione di texture [3] viene proposto un metodo per generare la geometria del volto e la texture attraverso l’utilizzo di un database costruito utilizzando uno scanner. Nel lavoro [19] viene descritta una tecnica per acquisire la riflettività della pelle umana e per usare tale informazione per renderizzare il volto in condizioni di luci arbitrarie. La generazione di texture tramite la combinazione di informazioni provenienti da varie foto è un problema affrontato in letteratura da molti autori. In questo lavoro [20] si è proposto un approccio per ottenere la mappatura delle texture su un oggetto geometrico 3D. Partendo da un insieme di fotografie dell’oggetto, le parti rilevanti di tali immagini vengono combinate in un’unica texture atlas. Per fare ciò si partizionano i vertici dei triangoli che costituiscono la mesh del volto a seconda delle immagini da cui ogni vertice prende il suo colore. Ad ogni faccia della mesh che occupa una posizione di confine tra due immagini viene assegnato un pezzo di texture ottenuto come media pesata dei colori delle sezioni adiacenti corrispondenti. La risultante texture map ha però una struttura a patch che rende impossibile la generazione del mip-mapping. In generale, durante la combinazione di più immagini, a causa di differenti condizioni di illuminazioni, ombre o errori di registrazione delle immagini,può presentarsi il problema della presenza di zone di discontinuità di colore nelle zone di confine tra regioni assegnate a differenti foto. Per eliminare tale inconveniente, le informazioni provenienti dalle varie immagini vengono combinate applicando un filtro gaussiano o una funzione continua [21]. Un’altra tecnica per eliminare il problema della discontinuità di colore è stata introdotta da Burt e Adelson [22] Essi propongono la tecnica ’spline multirisoluzione’ che consiste nel decomporre le immagini in bande di alta e bassa frequenza e nel combinare le informazioni delle immagini separatamente ad ogni livello. Il risultato è un’unica grande immagine mosaico che combina le le informazioni provenienti dalle varie fotografie. In [9] si è proposto un sistema per generare volti tridimensionali a partire da fotografie descrivendo una tecnica di combinazione delle texture basata 14 2.3. Modello generico di un volto umano sull’introduzione di una mappa di pesi. Essa verte su alcuni parametri: la visibilità(un peso zero viene assegnato ai vertici della mesh nascosti), la regolarità(i pesi devono variare in modo regolare per garantire continuità) ed infine la direzione della vista(i pesi dipendono dall’angolo della direzione di vista). Cosi come in altri lavori [6, 18], essi combinano le informazioni provenienti dalle varie fotografie in un’unica texture map che viene costruita su di un cilindro virtuale che circonda il modello mesh. Il mapping tra mesh e spazio tessitura viene definito tramite proiezione cilindrica. Un lavoro interessante sulla texturizzazione dei volti è quello presentato in [23]. Viene proposto un metodo per generare, a partire da alcune fotografie di un volto, texture ad alta risoluzione rappresentanti la pelle del volto ed alcune sue componenti quali denti ed occhi. Dopo aver parametrizzato nello spazio 2D la mesh 3D di input, utilizzano le tecniche di interpolazione di colore e di combinazione multirisoluzione per generare texture senza cuciture. 2.3 Modello generico di un volto umano Ogni volto umano presenta alcuni tratti essenziali quali occhi, bocca, naso. E’ la morfologia di tali elementi, unitamente all’eventuale presenza di altri particolari, che consente di distinguere un volto da un altro. Un modello di volto generico deve possedere come caratteristica fondamentale la possibilità di essere modificato in modo tale da poter coprire una vasta gamma di volti differenti. Per rappresentare il volto viene utilizzata una mesh 3D. Il termine mesh viene usato per indicare un oggetto tridimensionale rappresentato mediante una superficie chiusa, mediante cioè un insieme di facce poste l’una accanto all’altra che definiscono la forma dell’oggetto. Nel nostro lavoro utilizzeremo due modelli di volto differenti entrambi memorizzati in file formato VRML(Virtual Reality Modelling Language). Il linguaggio VRML permette di definire attraverso un insieme di comandi e di funzioni il comportamento e la forma 15 2.3. Modello generico di un volto umano di un insieme di oggetti che andranno a comporre la scena. Tutte le entità presenti all’interno di un codice VRML sono rappresentabili come dei nodi in una struttura gerarchica che contiene il modello completo del mondo. Un nodo che rappresenta un oggetto a sua volta contiene diversi campi che permettono di specificarne ulteriori caratteristiche fra cui il colore, la forma, la dimensione, la traslazione o la texture utilizzata per renderlo maggiormente realistico. Il vantaggio di tale formato risiede nella possibilità di poter essere facilmente utilizzato dagli utenti di tutti i pacchetti commerciali che ne supportano l’importazione e l’esportazione. Il primo modello, beta, è costituito da 2196 vertici e 4118 triangoli mentre il secondo, reana, ha 991 vertici e 1601 facce. Entrambi sono composti da vari oggetti: occhio sinistro, occhio destro, denti e resto del volto, a ciascuno dei quali è associata una texture. Ad ognuno dei due modelli è associato inoltre l’insieme degli FDP che rende possibile il processo di deformazione. (a) (b) Fig. 2.1: modelli utilizzati: beta(a), reana(b) 16 2.4. Standard MPEG-4 2.4 Standard MPEG-4 In questo progetto di tesi si è sviluppato un sistema di ricostruzione tridimensionale di un volto compatibile con le specifiche dello standard MPEG-4. Per la comprensione del metodo utilizzato è necessario introdurre i concetti fondamentali riguardanti le specifiche dello standard MPEG-4 [24]. MPEG4, presentato nel 1998, è il nome dato a un’insieme di standard per la codifica dell’audio e del video digitale sviluppati dall’ISO/IEC Moving Picture Experts Group (MPEG). Lo standard definisce un sistema generico per poter creare e accedere interattivamente a contenuti multimediali di qualsiasi tipo. Essi possono essere testi, ipertesti, immagini, disegni, animazioni, filmati, suoni naturali, suoni sintetici ecc. MPEG-4 supporta tutte le caratteristiche degli standard MPEG-1 e MPEG-2 oltre a tutta una serie di nuove caratteristiche come la gestione tridimensionale degli oggetti (tramite un estensione del VRML). I flussi audio e video vengono trattati dallo standard MPEG-4 come oggetti che possono essere manipolati e modificati in tempo reale. L’unità primitiva dello standard MPEG4 è l’oggetto audiovisuale (AVO). Ogni sequenza MPEG risulta composta da più AVO, ognuno dei quali è costituito da informazioni sul contenuto dell’oggetto (campioni audio e/o video) e da informazioni su come, quando e dove l’oggetto vada riprodotto. Una parte interessante dello standard MPEG-4, che riguarda l’argomento della nostra tesi, consiste nelle specifiche necessarie per una codifica efficiente della forma e dell’animazione di volti e corpi umani.(Face and Body Animation o FBA). MPEG-4 definisce un generico stato neutrale del volto unitamente a due insieme di parametri: 84 punti di definizione facciale (Facial Definition Points o FDP) e 68 punti di animazione facciale (Facial Animation Points o FAPS). Lo stato neutrale di un volto è la sua posizione prima che vi sia applicata un’animazione; in questa posizione i muscoli facciali sono rilassati, la bocca è chiusa e gli occhi aperti. Gli FDP definiscono punti somatici rilevanti del volto e sono utilizzati per modificare l’apparenza e la forma di un modello facciale. I FAP costituiti17 2.4. Standard MPEG-4 scono un insieme completo di azioni che il viso può compiere. Includono ad esempio il movimento degli occhi, della lingua e della bocca permettendo in tal modo la rappresentazione di molte delle naturali espressioni facciali. Il valore di un FAP indica l’ampiezza della corrispondente azione; valori esagerati permettono di simulare azioni che normalmente non sono possibili per un volto umano ma possono caratterizzare, ad esempio, il volto di un cartone animato. In questa tesi siamo particolarmente interessati agli FDP chiamati anche punti caratteristici (Feature Point o FP). La nostra applicazione prevede un’interfaccia grafica che consente all’utente di specificare sulle varie immagini i vari Feature Points che costituiranno la base del processo di deformazione. MPEG-4 specifica 84 FDP, ciascuno dei quali è composto da: • Numero: il numero che identifica l’FDP ed il particolare gruppo a cui esso appartiene • Posizione: La posizione memorizza le coordinate x,y,z relative al punto FDP. L’origine è definita dal FDP 7.1. I punti giacciono in un sistema di coordinate con l’asse delle x orientato verso destra, l’asse delle y verso l’alto e l’asse delle z orientato verso l’osservatore • Coordinate Texture: Le coordinate texture memorizzano le coordinate nella texture map. La figura 2.2 mostra la posizione di tali punti, la tabella in appendice ne presenta una descrizione testuale. 18 2.4. Standard MPEG-4 Fig. 2.2: Gli FDP dello standard MPEG-4 19 Capitolo 3 Deformazione del volto In questo capitolo mostriamo come ottenere il modello di volto 3D corrispondente al volto rappresentato nelle foto. Poiché i volti umani sono simili in struttura ed in forma, la tecnica utilizzata consiste nel deformare un generico volto 3D in modo tale da adattarlo alla particolare geometria del volto presente nelle foto ortogonali utilizzando le informazioni che da esse vengono estratte. L’input è quindi rappresentato da un generico modello 3D, nel nostro caso un modello VRML, e da fotografie ortogonali raffiguranti un volto umano visto dai vari profili. Chiameremo il generico volto 3D ’source model’, mentre ci riferiremo al volto 3D presente nelle foto e quindi da rappresentare, come al ’target model’. L’approccio si basa sulla specifica di alcuni punti di riferimento definiti sul modello; cambiando la locazione di tali punti e la relazione fra di essi è possibile modificare la geometria e la forma del volto 3D. I punti di riferimento sono punti caratteristici del modello da deformare(occhi, naso,bocca, ecc), nel nostro caso essi coincidono con gli FDP dello standard MPEG-4 di cui abbiamo parlato nel paragrafo 2.4. Tramite una procedura interattiva l’utente è in grado di specificare una serie di corrispondenze tra source model e target model; tali corrispondenze saranno alla base del processo di deformazione del source model al termine del quale i punti di riferimento del source model coincideranno con quelli del 20 3.1. Acquisizione foto ortogonali target model. E’ necessario quindi costruire una funzione di interpolazione che, preso l’insieme dei punti di riferimento del source model e il corrispondente insieme del target model, esprima la deformazione dei punti generici del modello(non quelli di riferimento) in termini dei cambiamenti dei punti di riferimento. Questo problema di scattered data interpolation viene risolto tramite l’utilizzo delle radial basis function (vedi paragrafo 3.3) ed in particolare del metodo di Hardy che presuppone la risoluzione di un sistema lineare. L’intero processo può essere quindi sintetizzato in questi tre passi: • acquisizione foto ortogonali • specifica FDP sulle foto • deformazione del volto con le radial basis function 3.1 Acquisizione foto ortogonali Il primo passo consiste nell’acquisizione delle foto rappresentanti un volto umano da una semplice macchina fotografica. La posizione della macchina fotografica deve essere scelta in modo tale che le immagini risultanti riescano ad includere l’intero volto. Durante l’acquisizione non è richiesta alcuna speciale illuminazione; tuttavia la presenza di una illuminazione diffusa e uniforme si riflette positivamente sul risultato finale. E’ inoltre necessario che il soggetto assuma la stessa espressione in tutte le foto. La possibilità che le varie fotografie siano catturate a distanze o altezze diverse dal soggetto può costituire un ostacolo in fase di elaborazione delle immagini; l’analisi e la risoluzione di tale problema è descritta dettagliatamente nel paragrafo successivo. Foto con risoluzioni diverse non rappresentano un problema nell’elaborazione in quanto le coordinate delle immagini acquisite non fanno riferimento all’unità di misura pixel ma vengono normalizzate tra 0 e 1 sia in altezza che in larghezza. Ciò consente, oltre ad utilizzare immagini con risoluzioni diverse, di avere un unico sistema di riferimento in tutte le foto. E’ possibile quindi 21 3.2. Specifica FDP sulle foto applicare fattori di scala all’immagine senza che siano necessarie elaborazioni per il riposizionamento dei punti. L’algoritmo utilizzato per normalizzare le coordinate di un punto in una foto consiste nella seguente formula: coordinate normalizzate = coordinate pixel/dimensione immagine (3.1) In altri termini se un punto viene posizionato a coordinate pixel 64x64 in una foto da 256x256 pixel, dividendo la posizione per la dimensione dell’immagine si ottiene una grandezza (0,25x0,25) non più legata alla risoluzione dell’immagine. Ridimensionando l’immagine a 512x512 il punto (0,25x0,25) sarà collocato a 128x128, proprio come ci aspettavamo. 3.2 Specifica FDP sulle foto Come abbiamo visto nel paragrafo 2.4, lo standard MPEG-4 fornisce una parametrizzazione per l’animazione facciale basata sulla fisionomia del volto in grado di definire e controllare la forma e i movimenti di un volto 3D. Esso individua due insiemi di parametri che descrivono ed animano un modello facciale 3D: i FAP (parametri di animazione facciale) e gli FDP (parametri di definizione facciale). Gli FDP sono punti caratteristici del volto 3D che permettono di localizzare le caratteristiche facciali più salienti e sono utilizzati per adattare un generico modello di volto 3D ad un modello particolare. Poiché desideriamo modificare la forma e l’apparenza del generico volto 3D in modo da renderlo il più possibile somigliante a quello presente nelle foto, è necessaria una procedura interattiva di individuazione degli FDP sulle foto. Il posizionamento di uno specifico FDP nelle varie foto consente di recuperare la sua posizione 3D. Ciascuna foto ha un sistema di riferimento basato su due delle tre coordinate dello spazio del modello facciale ed ha in comune almeno un asse con almeno una delle altre foto. L’insieme delle coordinate 2D proveniente dalle foto ci permette di dedurre la posizione 3D di ogni punto FDP. Ogni foto ha un sistema di riferimento con valori compresi tra 0 e 1 e un FDP 22 3.2. Specifica FDP sulle foto è composto da 3 valori che rappresentano le sue coordinate tridimensionali. Ciascuna foto fornisce solamente due di queste tre coordinate. Il fatto di dover utilizzare più foto per determinare la posizione di un punto FDP ha il seguente effetto collaterale: anche se tutte le foto condividono un sistema di riferimento compreso tra 0 e 1, questo non significa che, prese due foto che condividono uno stesso asse di riferimento, il valore assunto dall’FDP in una foto corrisponda al valore dello stesso FDP nell’altra foto. Come mostrato in figura 3.1, nella foto frontale abbiamo un FDP posizionato sul naso con coordinate (xa,ya). Al medesimo FDP sulla foto laterale corrisponde la coordinata (zb,yb). Qualora in fase di acquisizione delle foto non siano stati utilizzati accorgimenti tali che la distanza e la posizione della camera rispetto al soggetto rimanessero costanti, il valore ya è diverso da yb. Tutto questo comporta che la coordinata y dell’FDP è indeterminata in quanto assume valori diversi; ciò è dovuto al fatto che tra le due foto è presente un errore di traslazione (la fotocamera presentava due altezze diverse rispetto al soggetto) oppure un errore di scala(la fotocamera aveva due distanze diverse rispetto al soggetto). E’ quindi necessario fornire alle foto che condividono uno stesso asse carte- Fig. 3.1: siano, un sistema di riferimento omogeneo che consenta di annullare l’errore. A tale scopo vengono posizionati due punti di controllo su ogni foto nelle 23 3.2. Specifica FDP sulle foto medesime zone del volto. Riferendosi all’esempio precedente, dati i punti di controllo a1 e a2 sulla foto frontale e b1 e b2 sulla foto laterale, tramite la seguente espressione ((ya ∗ |a1y − a2y | + a1y − b1y )/|b1y − b2y | = yb (3.2) esiste una corrispondenza biunivoca tra ya e yb. Avendo trovato una corrispondenza biunivoca, scegliamo di utilizzare uno dei due valori come componente y dell’FDP. E’ una condizione necessaria dover poi utilizzare sempre i valori provenienti della medesima foto per dedurre i valori della coordinata y dei restanti FDP. Questo è generalizzabile su tutte e tre le coordinate e su un numero arbitrario di foto. Grazie alla corrispondenza biunivoca venutasi a creare tra le varie foto, modificando la posizione di un punto FDP in una foto, automaticamente in tutte le foto che condividono uno dei due assi cartesiani il corrispondente FDP subisce un’alterazione che soddisfa l’espressione 3.2. Non è richiesto in tal modo alcun riposizionamento dell’FDP in ciascuna foto. Come approfondiremo nel paragrafo successivo, il processo di deformazione considera l’insieme degli FDP presenti nel source model(FS) e l’insieme degli FDP acquisiti dalle foto(FT) per determinare una funzione di interpolazione che sia in grado di mappare gli FS negli FT. Il preciso posizionamento degli FDP si riflette quindi positivamente sul risultato della deformazione. Poiché è difficile localizzare alcuni punti(soprattutto nel caso in cui non siano presenti alcune foto) ed il processo di inserimento potrebbe risultare lungo e noioso, si è implementata una procedura semplice ma efficace di estrazione degli FDP che faciliti ed agevoli l’inserimento. L’idea si basa su successive applicazioni del processo di deformazione che conducono a successivi raffinamenti della posizione degli FDP. Nel primo passo vengono acquisiti sono alcuni FDP di facile individuazione. A questo punto viene calcolata la funzione di interpolazione che permette la mappatura di tali punti. Tale funzione viene poi applicata ai restanti punti sul volto 3D per suggerire all’utente la relativa posizione degli FDP(vedi figura xx). 24 3.3. Morphing con le radial basis function L’intero processo può essere reiterato migliorando la precisione della funzione di interpolazione, sino a quando tutti gli FDP non assumeranno la posizione corretta. 3.3 Morphing con le radial basis function In questo paragrafo mostriamo come deformare il source model in modo da adattarlo alla forma del volto presente nelle foto. L’idea consiste nel definire una funzione di interpolazione in grado di mappare gli FDP del source model negli FDP rappresentati dai punti acquisiti dalle foto e nell’utilizzare tale funzione per deformare i restanti vertici del source model. Poiché gli FDP non sono regolarmente distribuiti sull’intera superficie, si tratta di risolvere un problema standard di scattered data interpolation che può essere formalizzato cosi: Dato un insieme di punti P = pi con i = 1 . . . n definito sul source model e il corrispondente insieme di punti Q = qi con i = 1 . . . n nel target model, trovare una funzione tale che: F (pi ) = qi (3.3) Tale funzione, applicata ad un punto non landmark del source model, consente di ottenere il corrispondente punto nel target model. Ci sono vari metodi per l’individuazione della funzione di interpolazione. La scelta è caduta sulle radial-basis-function (funzioni a base radiale) che risultano particolarmente efficaci quando i punti feature non sono distribuiti regolarmente [25]. Una radial basis function (RBF) è una funzione il cui valore dipende dalla distanza da un punto detto centro. Il metodo di interpolazione è semplicemente una combinazione lineare di tali funzioni: F (x) = n X λi φ(k x − pi k) i=1 25 (3.4) 3.3. Morphing con le radial basis function dove λi è il peso associato al punto pi e φ denota la radial basis function. In alcuni casi, per assicurare la precisione lineare della trasformazione, è necessario aggiungere un polinomio. Siano {π1 , . . . πd } le basi di un polinomio L di grado d e siano {v1 , . . . vd } i coefficienti che consentono di ottenere L in termini di queste basi. La funzione di interpolazione diviene cosi: F (x) = n X λi φ(k x − pi k) + d X (3.5) vc πc (pj ) c=1 i=1 Per determinare i coefficienti λi basta semplicemente sostituire la condizione F (pi ) = qi nell’equazione precedente: F (x) = n X λi φ(k x − pi k) + d X vc πc (pj ) = qi (3.6) c=1 i=1 Per la precisione lineare, richiediamo inoltre che: n X λi = 0, i=1 n X (3.7) λi πc (pi ) = 0 i=1 ottenendo il seguente sistema di equazioni: φ11 φ 21 .. . φn1 π1 (p1 ) .. . φ12 ··· φ1n φ22 .. . ··· .. . φ2n .. . φn2 ··· φnn π2 (p1 ) · · · πd (p1 ) .. .. . ··· . π1 (pn ) π2 (pn ) · · · πd (pn ) π1 (p1 ) π2 (p1 ) · · · πd (p1 ) .. .. .. . . ··· . .. .. .. .. . . . . π1 (pn ) π2 (pn ) · · · πd (pn ) 0 0 0 0 0 0 0 0 0 0 Denotando con: Aij = φ(k pi − pj k) con i, j = 1 . . . n Πij = πj (pi ) con j = 1 . . . d e i = 1 . . . n λ = [λ1 , . . . , λn ]T Q = [q1 , . . . , qn ]T 26 0 0 λ1 q1 q2 .. . λ n = qn v1 0 .. .. . . λ2 .. . vd 0 3.4. Scelta della radial basis function V = [v1 . . . vd ]T Il precedente sistema può essere scritto come: A Π λ ΠT 0 V = Q 0 (3.8) Il sistema ottenuto può essere riscritto in maniera tale da evidenziare l’influenza dei valori del dominio della funzione su λ e V. Sia C D A Π la matrice inversa della matrice E F ΠT a sinistra nell’equazione 3.8 otteniamo: λ V = C D Q E F 0 = C E 0 ; moltiplicandola Q (3.9) dove C è la matrice che rappresenta l’influenza dei valori del dominio della funzione su λ e E è la matrice che esprime l’influenza su v. La funzione di interpolazione nel dominio X, derivata dagli insiemi P e Q, può essere riscritta cosi: Φ(X, P1 ) Π(X) .. .. T T F (X, P, Q) = Q C +E . . Φ(X, Pn ) 3.4 (3.10) Π(X) Scelta della radial basis function Esistono varie radial basis function. Una classificazione può essere effettuata sulla base degli effetti locali o globali, che esse producono nel processo di deformazione. Una trasformazione è globale se è dipendente da tutti i punti di controllo:lo spostamento di uno di essi produce degli effetti sull’intero volto; diversamente in una trasformazione locale gli effetti si localizzano in un’area 27 3.4. Scelta della radial basis function ristretta in prossimità del punto. Nella scelta di quale radial basis function adottare per la deformazione del volto, si deve attribuire particolare importanza, quindi al comportamento che essa assume a fronte di un cambiamento di un punto di controllo. E’ da prediligere infatti una funzione che produca effetti locali mantenendo nel contempo un certo grado di regolarità. Per determinare quale sia l’influenza di uno spostamento di un FDP target sull’intera trasformazione utilizziamo la serie di Taylor che consente di esprimere la funzione interpolante in maniera approssimata. La serie di Taylor in una dimensione (x), è: F (X, P, Qx + ∆Qx ) = F (X, P, Qx ) + ∂F (X, P, Qx ) ∆Qx + O(k Qx k2 ) ∂Qx con: Φ(X, P1 ) Π(X) ∂F (X) .. .. = + ET . . ∂Qx Φ(X, Pn ) Π(X) (3.11) dove: • Qx è l’insieme delle coordinate x dei punti target • O(k Qx k2 ) = 0 poichè tutte le derivate parziali di ordine superiore sono uguali a zero • C è la matrice che rappresenta l’influenza dei valori del dominio della funzione su λ e E è la matrice che esprime l’influenza su v. Supponiamo di avere come punti source l’insieme P = {P1 = −20, P2 = 5, P3 = 18, P4 = 40} e come punti target l’insieme Q = {Q1 = −20, Q2 = 0, Q3 = 21, Q4 = 40} 28 3.4. Scelta della radial basis function Qui di seguito analizzeremo le varie radial basis function mostrando per ciascuna di esse due grafici: il primo mostra l’andamento della funzione considerata; il secondo presnta l’influenza di ogni punto target sull’insieme dei punti del dominio mostrando ( ∂F∂Q(X) = j ∂F (X) ,j ∂Qxj = 1, ...4), il terzo mostra la derivata della funzione considerata. In tutti i casi ci limiteremo allo studio della sola dimensione x. Le radial basis function gaussiana e di hardy presentano un parametro σ che regola la rigidità della deformazione. Esso è arbitrario, ma per garantire che la deformazione sia morbida nell’area in cui punti sono più sparsi e rigida nell’area in cui i punti sono più fitti, viene calcolato come: min j=1,...n,i6=j k pi − pj k 29 (3.12) 3.4. Scelta della radial basis function influenza 1 0 RBF Linear 0 0 -20 0,96 0,04 0 0 -19 0,92 0,08 0 0 -18 0,88 0,12 0 0 r φ(r) = -17 0,84 0,16 0 0 -16 1 0,9 0,8 0,7 0,6 0,5 0,4 0,3 0,2 0,1 0 0,8 0,2 0 0 -15 0,76 0,24 0 0 -14 influenza Q1 influenza Q2 influenza Q3 influenza Q4 -20 -15 -10 -5 0 5 10 15 20 25 30 35 x Fig. 3.2: grafico influenza della funzione lineare 50-20 1 0 0 0 -20 0,96 0,04 0 0 -19,2 -18 0,92 0,08 0 0 -18,4 30 0,88 0,12 0 0 -17,6 50-17 20 -16 0,84 0,16 0 0 -16,8 40 10-15 0,8 0,2 0 0 -16 30 -14 0,76 0,24 0 0 -15,2 0 20 -20 -15 0,72 -10 -5 0 0,285 10 15 0 20 25 030 35 -14,4 -10-13 10-12 0,68 0,32 0 0 -13,6 -20 0,64 0,36 0 0 -12,8 0-11 -30-10 0,6 0,4 0 0 -12 -20 -15 -10 -5 0 5 10 15 20 25 30 35 -10 x -9 0,56 0,44 0 0 -11,2 -20 -8 0,52 0,48 0 0 -10,4 -30 -7 0,48 0,52 0 0 -9,6 x -6 0,44 0,56 0 0 -8,8 -5 0,4 0,6 0 0 -8 -4 0,36 0,64 0 0 -7,2 -3 0,32 0,68 0 0 -6,4 andamento 0della funzione lineare -2 Fig. 3.3: 0,28 grafico0,72 0 -5,6 -1 0,24 0,76 0 0 -4,8 0 0,2 0,8 0 0 -4 1 0,16 0,84 0 0 -3,2 50 2 0,12 0,88 0 0 -2,4 40 3 0,08 0,92 0 0 -1,6 30 4 0,04 0,96 0 0 -0,8 20 5 0 1 0 0 0 30 0 0,923077 0,076923 0 1,615383 10 6 0 0,846154 0,153846 0 3,230766 0 7 8 0 0,769231 0,230769 0 -5 0 5 10 15 20 25 30 4,846149 35 -10 -20 -15 -10 9 0 0,692308 0,307692 0 6,461532 -20 10 0 0,615385 0,384615 0 8,076915 F(x) F(x) F(x) 40-19 -30 x lineare lineare lineare 0,72 0,28 0 0 -13 33 34 35 36 37 38 39 40 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0,318182 0,272727 0,227273 0,181818 0,136364 0,090909 0,045455 0,681818 0,727273 0,772727 0,818182 0,863636 0,909091 0,954545 33,954542 34,818187 35,681813 36,545458 37,409084 38,272729 39,136355 0,863626 0,863645 0,863626 0,863645 0,863626 0,863645 0,863626 3.4. Scelta della radial basis function f'(x) derivata lineare 1,8 1,6 1,4 1,2 1 0,8 0,6 0,4 0,2 0 -19 -14 -9 -4 1 6 11 16 21 26 31 36 x Fig. 3.4: grafico derivata della funzione lineare RBF Cubic φ(r) = r3 2 influenza 1,5 1 influenza Q1 influenza Q2 0,5 influenza Q3 influenza Q4 0 -20 -15 -10 -5 0 5 10 15 20 25 30 35 -0,5 -1 x Fig. 3.5: grafico influenza della funzione cubica 31 3.4. Scelta della radial basis function 50 40 30 F(x) F(x) 20 10 50 0 40 -10 -20 30 -20 20 -30 10 0 -10 -20 -20 cubica -15 -10 -5 0 5 10 15 20 25 30 35 cubica x -15 -10 -5 0 5 10 15 20 25 30 35 Fig. 3.6: grafico andamento della funzione cubica -30 x derivata cubica 2 1,5 f'(x) 1 0 1,5 -0,5 1 f'(x) derivata cubica 0,5 2 -19 -14 -9 -4 1 6 11 16 21 26 31 36 16 21 26 31 36 -1 0,5 x 0 -0,5 -19 -14 -9 -4 1 6 11 -1 influenza influenza x 1,4 1,2 1 0,8 Fig. 3.7: 0,6 1,4 0,4 1,2 0,2 1 0 0,8 -20 -15 -10 -5 -0,2 0,6 -0,4 0,4 0,2 0 -0,2 -20 -15 -10 -5 -0,4 influenza Q1 grafico derivata della funzione influenza Q2 influenza Q3 cubica influenza Q4 influenza Q1 0 5 10 15 20 25 30 35 32 x 0 5 10 15 20 25 30 35 x influenza Q2 influenza Q3 influenza Q4 1,5 f'(x) 1 0,5 0 -0,5 -19 -14 -9 -4 1 6 11 16 21 26 31 36 3.4. Scelta della radial basis function -1 x RBF Thin-plate spline influenza φ(r) = r2 log(r) 1,4 1,2 1 0,8 0,6 0,4 0,2 0 -0,2 -20 -15 -10 -5 -0,4 influenza Q1 influenza Q2 influenza Q3 influenza Q4 0 5 10 15 20 25 30 35 x Fig. 3.8: grafico influenza della funzione thin-splate 50 40 30 F(x) 20 10 thin-plate 0 -10 -20 -15 -10 -5 0 5 10 15 20 25 30 35 -20 -30 x Fig. 3.9: grafico andamento della funzione thin-splate f'(x) derivata thin 1,8 1,6 1,4 1,2 1 0,8 0,6 0,4 0,2 0 33 -19 -14 -9 -4 1 6 11 x 16 21 26 31 36 F(x) 20 10 thin-plate F(x) 0 50 -10 -20 40 -20 30 -30 20 -15 -10 -5 0 5 10 10 15 20 25 30 35 x 3.4. Scelta della radial basis function thin-plate 10 15 0 -10 -20 -15 -10 -5 0 5 20 25 30 35 f'(x) f'(x) -20 derivata thin -30 1,8 1,6 1,4 1,2 1 0,8 0,6 0,4 1,8 0,2 1,6 0 1,4 x derivata thin -4 1 1,2 -19 -14 -9 1 0,8 0,6 0,4 0,2 Fig. 3.10: grafico 0 -19 -14 -9 -4 1 6 11 16 21 26 31 derivata della funzione thin-splate 6 11 16 21 26 31 r2 influenza Q1 φ(r) = e(− σ ) 1 influenza Q2 influenza Q3 0,8 influenza 36 x RBF Gaussian 1,2 influenza 36 x influenza Q4 0,6 0,4 1,2 0,2 1 0 0,8 -20 -15 -10 -0,2 0,6 influenza Q1 influenza Q2 influenza Q3 -5 0 5 10 15 20 25 30 35 15 20 25 30 35 influenza Q4 x 0,4 0,2 0 -0,2 -20 -15 -10 -5 0 5 10 x Fig. 3.11: grafico influenza della funzione gaussiana 34 3.4. Scelta della radial basis function 50 40 30 F(x) 20 gaussiana 10 F(x) 0 50 -20 -10 40 -20 30 -30 20 -15 -10 -5 0 5 10 15 20 25 30 35 x gaussiana 10 0 -10 -20 -15 -10 -5 0 5 10 15 20 25 30 35 Fig. 3.12: grafico andamento della funzione gaussiana -20 derivata gaussiana -30 x 2,5 f'(x) 2 1,5 1 0,5 derivata gaussiana 0 2,5 f'(x) 2 -19 -14 -9 -4 1 6 11 16 21 26 31 36 16 21 26 31 36 x 1,5 1 0,5 0 1,2 1 -19 -14 -9 -4 1 6 influenza 0,8 influenza Q1 0,6 0,4 0,2 1,2 0 influenza Q2 Fig. 3.13: grafico derivata della funzione gaussianainfluenza Q3 1 -20 -15 -10 -0,2 0,8 -0,4 influenza 11 x influenza Q4 -5 0 5 0,6 10 15 x 35 20 25 30 35 influenza Q1 influenza Q2 0,4 influenza Q3 0,2 influenza Q4 0 -0,2 -20 -15 -10 -5 0 5 10 -0,4 x 15 20 25 30 35 derivata gaussiana 2,5 f'(x) 2 1,5 3.4. Scelta della radial basis function 1 0,5 RBF Hardy multiquadrics 0 -19 -14 -9 -4 1 6 16 √21 r2 11 φ(r) = x 26 31 36 + σ2 1,2 1 influenza 0,8 influenza Q1 0,6 influenza Q2 0,4 influenza Q3 0,2 influenza Q4 0 -0,2 -20 -15 -10 -5 0 5 10 15 20 25 30 35 -0,4 x Fig. 3.14: grafico influenza della funzione hardy 50 40 30 F(x) 20 10 hardy 0 -10 -20 -15 -10 -5 0 5 10 15 20 25 30 35 -20 -30 x Fig. 3.15: grafico andamento della funzione hardy 36 '(x) derivata hardy 2 1,8 1,6 1,4 1,2 1 x 3.4. Scelta della radial basis function f'(x) derivata hardy 2 1,8 1,6 1,4 1,2 1 0,8 0,6 0,4 0,2 0 -19 -14 -9 -4 1 6 11 16 21 26 31 36 x Fig. 3.16: grafico derivata della funzione hardy Lo scopo di questi grafici è quello di mostrare quale tra le funzioni analizzate sia la più adatta a rivestire il ruolo di funzione di interpolazione nel nostro processo di deformazione del volto. In linea generale siamo alla ricerca di una radial basis function che abbia regioni di influenza limitata e presenti un andamento morbido e regolare. Guardando i grafici xx, poniamo l’attenzione su quelle radial basis function la cui influenza in un punto Qi sia alta in prossimità di Pi e tenda a decrescere in maniera rapido allontanandosi da esso. Il motivo per cui siamo interessati a ricercare una funzione RBF con tale andamento è dovuto al fatto che in tale circostanza la funzione RBF effettua la deformazione della mesh esclusivamente nella zona limitata e definita dalla posizione assunta dall’FDP Qi . Tale approccio porta il vantaggio che l’FDP Qi non ha influenza sulla deformazione nelle restanti zone della mesh. In conclusione quello che vogliamo avere è che modificando la posizione assunta dall’FDP Qi abbiamo nella mesh una deformazione localizzata nell’intorno dell’FDP Pi . Ad esempio la funzione RBF cubica presenta una deformazione non localizzata: ogni FDP Qi produce un’influenza anche al di fuori dell’area che circonda il corrispettivo FDP Pi . Oltre alla tipologia di deformazione, locale o meno, abbiamo bisogno che la deformazione della mesh abbia un andamento regola37 3.4. Scelta della radial basis function re e morbido tra le varie zone localizzate dai vari FDP Pi . Il rischio in cui si può incorrere è che la funzione RBF per passare da una zona localizzata dall’FDP Pi alla zona adiacente, localizzata dall’FDP Pj , introduca una brusca variazione sul profilo della mesh. Per studiare tale fenomeno si è pensato di calcolare la derivata delle varie funzioni RBF. Il grafico risultante permette facilmente di evidenziare l’andamento che avrà la mesh e in quale zone presenterà delle brusche variazioni nel proprio profilo 3D. Questo perchè la mesh finale è il risultato dell’applicazione della funzione RBF. Nel caso in cui la curva della RBF presenta delle irregolarità in alcune zone, evidenziate da una veloce variazione della pendenza dalla funzione derivata, anche la mesh finale presenterà irregolarità nelle medesime zone. Poniamo quindi l’attenzione su quelle radial basis function in cui non siano presenti brusche variazioni che possono indurre la presenza di zone spigolose nella deformazione. Considerando i fattori di linearità della derivata e località della RBF, la radial basis function di Hardy sembra la più adatta ai nostri scopi. Non presenta variazioni improvvise nella funzione derivata, quindi la modellazione risulta essere regolare e morbida su tutta la mesh, e allo stesso tempo possiede una localizazzione nella deformazione della mesh. Questo studio analitico è stato verificato tramite uno studio pratico: partendo dalla medesima mesh e dallo stesso insieme FDP finale, abbiamo applicato separatamente le varie funzioni RBF e abbiamo quindi messo a confronto i vari modelli finali. Il risultato migliore si è intuitivamente ottenuto con l’uso della multiquadrica di Hardy. In figura xx è mostrato come essa riesca ad adattare bene la mesh 3D al volto presente nelle foto. 38 3.4. Scelta della radial basis function Fig. 3.17: Fig. 3.18: 39 3.5. Algoritmo di deformazione 3.5 Algoritmo di deformazione L’algoritmo utilizzato per il processo di deformazione del volto generico iniziale può essere concettualmente suddiviso in tre parti: • costruzione del sistema di equazioni descritto nel paragrafo 3.3 • risoluzione del sistema • calcolo della funzione di interpolazione e applicazione ai vertici del modello La risoluzione del sistema avviene tramite la fattorizzazione LU che è descritta nell’appendice B. Il costo computazionale per la risoluzione del sistema è O(n3 ) dove n è il numero di FDP. Una volta determinati i coefficienti è necessario applicare la funzione di interpolazione su tutti i vertici del modello in modo tale da produrre la deformazione. Per determinare la nuova posizione di un vertice il costo è pari a O(n), per deformare l’intera mesh il costo diventa quindi O(n ∗ m) dove m è il numero di vertici. Il costo complessivo dell’intero processo di deformazione è quindi il massimo tra la fattorizzazione LU e la deformazione della mesh: max(O(n3 ), O(n ∗ m)) in quanto n2 può essere sia minore che maggiore di m a seconda del tipo di mesh da deformare. 40 Capitolo 4 Texturizzazione del volto Un volto umano può essere pensato come la combinazione di due elementi: una componente geometrica che ne definisce la forma e una componente texture che ne definisce l’apparenza e aggiunge quel grado di dettaglio fondamentale per la caratterizzazione del volto. Nel processo di realizzazione del volto rappresentato nelle foto, la texturizzazione assume quindi un ruolo fondamentale: a differenza di ciò che accade per la deformazione, piccole imprecisioni, anche locali, possono influire negativamente sul grado di realismo finale. Nel precedente capitolo abbiamo visto come deformare la componente geometrica del source model affinché coincida con quella del volto presente nelle foto; in questo capitolo ci occuperemo invece di come ottenere la componente texture. Dato il modello 3D e dato un insieme di immagini prese da diversi punti di vista, il metodo che descriveremo si propone di costruire delle texture che integrino le informazioni di colore contenute nelle immagini d’ingresso, ottimizzando la rappresentazione degli attributi di colore. Poiché in input si hanno varie foto del volto secondo diverse inquadrature, sorge il problema di come combinare le varie foto per generare le texture da mappare sul volto. Se le foto non presentano le medesime condizioni di illuminazione, il colore della pelle può differire notevolmente tra le varie immagini 41 4.1. Texture mapping e in tal caso si hanno sgradevoli effetti di discontinuità di colore sul volto finale laddove si è operata una combinazione tra le varie foto. E’ necessario quindi ideare un algoritmo adattivo che consenta di evitare il presentarsi di zone poco realistiche sul volto causate da differenti tonalità di colore tra le foto. La tecnica adottata a tale scopo è basata sul cube mapping; nei successivi paragrafi ne presenteremo le caratteristiche, i vantaggi rispetto alle tecniche tradizionali e mostreremo come il suo utilizza preveda una prima fase di generazione delle texture seguita da una fase di applicazione delle texture sul volto. 4.1 Texture mapping Il texture mapping è una delle tecniche più diffusa nella grafica 3D e trova grande applicazione in quei rami della computer graphics in cui il realismo è uno dei fattori predominanti. Esso permette di applicare un’immagine sopra una superficie in modo da simulare un grado di dettaglio superiore a quello raggiungibile mediante la sola modellazione. Attraverso l’utilizzo della texture si ottengono ottimi risultati in termini di realismo di una scena computerizzata, infatti l’immagine applicatale ne varia le proprietà di superficie punto per punto, cosı̀ da fornire un apparente livello di dettaglio che invece non è presente nella geometria della superficie. Ovviamente si tratta di una tecnica complessa che richiede una notevole potenza di elaborazione visto che le immagini vengono elaborate pixel per pixel. Il vantaggio del texture mapping è quello di elevare notevolmente il realismo della scena rappresentata, evitando di modellare e renderizzare tutti i dettagli tridimensionali di una superficie. Senza texture mapping la grafica risulta vuota e irrealistica. Il principio del Texture Mapping è poi alla base di tutta una serie di effetti come il Bump Mapping, il reflaction Mapping, le light map, le shadow map, nei quali la texture è usata per applicare proprietà alla 42 4.1. Texture mapping superficie e non banalmente colore. La sua applicazione prevede una prima fase di parametrizzazione della superficie: è necessario assegnare ad un punto P della superficie delle coordinate texture associate ai pixel (o texel) dell’immagine rappresentante la texture. Il punto viene poi mappato dalla proiezione in un punto dello schermo (xs,ys). La figura 4.1 mostra l’intero processo dal dominio texture allo spazio schermo. Una texture è un’immagine che rappresenta la tessitura visiva della superficie Fig. 4.1: Processo di texturizzazione. e viene mappata sui poligoni che modellano gli oggetti della scena. Nel caso bidimensionale una texture è definita all’interno del piano (u,v) chiamato spazio tessitura e le coordinate texture assumono generalmente valori tra 0 e 1; la posizione (0,0) indica l’angolo in alto a destra nell’immagine texture, la posizione (1,1) l’angolo in basso a sinistra. Le coordinate texture sono usualmente specificate per ogni vertice di ogni poligono che compone l’oggetto, definendo in tal modo un mapping tra il poligono della superficie e il poligono tessitura. Ad ogni vertice del poligono corrisponde un punto all’interno dell’immagine, per gli altri punti interni al poligono viene utilizzata l’interpolazione lineare. La texture può essere applicata alla superficie dell’oggetto con vari tipi di proiezione: planare, cubica, sferica e cilindrica. Il tipo più adatto viene scelto in base alla texture da proiettare ed alla forma dell’oggetto su cui sarà proiettata. In tutti i casi il processo consiste nel definire la forma geometrica scelta( piano, cilindro, 43 4.2. Cube Map sfera o cubo) e nel proiettare su di essa i vertici dell’oggetto, derivando le coordinate texture dalle coordinate del vertice. Ciascun tipo di mappatura produce diversi artefatti: la proiezione frontale è adatta nel caso in cui si voglia osservare la superficie da un particolare punto di vista; le proiezioni sferiche e cilindrica limitano la presenza di artefatti alle zone dei poli. Nel nostro lavoro di tesi focalizzeremo l’attenzione sulla proiezione cubica di cui parleremo nel seguente paragrafo. 4.2 Cube Map La cube map è un particolare tipo di texture composta da sei immagini bidimensionali della stessa dimensione, rappresentanti le sei facce di un cubo centrato nell’origine. Ogni texel del cubo rappresenta ciò che può essere visto dall’origine verso quella direzione. Nella figura 4.2 è mostrato un esempio. Fig. 4.2: cube map Per determinare quale delle sei texture e quale texel associare ad ogni vertice, si utilizza una tripla di coordinate texture che rappresentano un vettore direzione 3D. Tale vettore può essere pensato come un raggio che viene emanato dal centro del cubo e raggiunge uno dei sei lati del cubo. La tecnica del cube mapping viene generalmente utilizzata per l’environment mapping che permette effetti di riflessione molto realistici di un oggetto nella scena in cui si trova e consente quindi di dare l’impressione che l’oggetto 44 4.2. Cube Map rifletta l’ambiente circostante. Questo effetto cattura, dal centro della scena, le immagini esterne nelle sei direzioni e le mappa sul cubo; proiettando poi le superfici del cubo sull’oggetto a cui si vogliono applicare le riflessioni si ottiene il risultato voluto. La potenza delle cube map si esplica nella possibilità di poter essere usate efficientemente per calcolare, a livello hardware, una funzione il cui input è un vettore direzione e il cui output è tale da poter essere inserito in un singolo elemento texture. Vengono quindi utilizzate per simulare effetti di illuminazione, rifrazione, bump mapping(metodo che simula le superfici non lisce, utilizzando più texture bidimensionali e un sistema particolare di luci e ombreggiature). Come suggerito da Tarini [26], le cube maps possono essere usate semplicemente per texturizzare un oggetto che può essere racchiuso in un cubo.Nella figura 4.4 è mostrato l’esempio della mela. L’idea è quella di immergere il modello 3D al centro di un cubo sulle cui Superficie Superficie texturizzata Texture cubemap Fig. 4.3: Utilizzo della cubemap per la texturizzazione di una superficie. facce sono posizionate le sei texture da mappare sull’oggetto. Ad ogni vertice 45 4.3. Confronto tra cube map e tecniche tradizionali del modello viene assegnata una coordinata texture 3D sul cubo. Tale coordinata consente di determinare quale delle sei texture e quale texel associare al vertice. 4.3 Confronto tra cube map e tecniche tradizionali Nel processo di texture mapping, la tecnica tradizionale per la parametrizzazione di una mesh triangolare consiste nel suddividere la superficie in zone(charts) e nel parametrizzare individualmente ciascuna di esse mantenendo bassa la distorsione. Questo approccio, chiamato texture atlas, causa però la presenza di cuciture che vengono a crearsi quando ai vertici di un triangolo della mesh corrispondono valori differenti nel dominio texture e la loro interpolazione lineare è un triangolo secante che cade all’esterno della superficie sulla quale è definita l’informazione di colore. A differenza della texture atlas, la cube map consente di texturizzare una superficie senza cuciture e senza distorsione. Schematicamente, i principali vantaggi della cube map rispetto alla texture atlas sono i seguenti: • indipendenza dalla geometria: la texture atlas, a causa della modalità con cui viene costruita, è strettamente legata al modello da texturizzare; qualora siano effettuate piccole variazioni sul modello, la texture non è più riutilizzabile. La stessa texture cube map può essere invece utilizzata per texturizzare modelli con una forma similare o mesh renderizzate con tipi di primitive diverse(triangoli, quadrati, ecc.): basta assegnare ad ogni vertice del modello l’appropriata coordinata texture 3D sul cubo. • assenza di cuciture: a differenza di ciò che accade per le texture atlas, nella cube map, non accade mai che ad un vertice della mesh corri- 46 4.4. Generazione texture spondano differenti valori nel dominio texture; ciò consente di evitare la presenza di cuciture. • mipmapping: il mipmapping è una tecnica di texturizzazione che fa uso di più copie della stessa texture a diverse risoluzioni, in modo da utilizzare quella più adatta alla dimensione della superficie da trattare. L’utilizzo di questa tecnica con una texture atlas produce degli artefatti, effetto che non si verifica se viene applicata su una cube map. In una texture atlas, infine, ci possono essere degli spazi inutilizzati tra una zona e l’altra, in una cube map è definito ogni texel. Generalmente per l’applicazione delle texture ad un volto si preferisce adottare, anzichè la texture atlas, la proiezione cilindrica [6, 16]. Consiste nel proiettare ogni immagine ortogonale su un cilindro che avvolge il volto. Supponendo di avere tre foto, si assume ad esempio che la foto frontale ricopra un’area da -90◦ a 90◦ , la foto laterale sinistra da -180◦ a 0◦ , quella laterale destra da 0◦ a 180◦ . Le regioni sovrapposte vengono combinate insieme per costruire una texture map che ricopre un’area da -180◦ a 180◦ . Come mostrato in figura, per ottenere il mapping tra le coordinate 3D del volto e le coordinate 2D dello spazio tessitura, il modello del volto viene proiettato su un cilindro. Poi il cilindro viene appiattito su un piano. L’adozione della proiezione cilindrica per la texturizzazione nasce dall’assunzione che un volto possa essere approssimato adeguatamente da un cilindro. Questa mappatura produce però degli artefatti che vengono a trovarsi alla base del collo, che generalmente non è visibile, e alla sommità del capo dove possono essere confusi a causa della presenza dei capelli. L’utilizzo della cube map consente di eliminare tali problemi. 4.4 Generazione texture Si consideri un volto 3D e un certo numero di fotografie del volto prese da diverse posizioni; lo scopo è quello di realizzare un texture mapping sul volto 47 4.4. Generazione texture Fig. 4.4: Mappatura cilindrica. 3D in modo efficiente. Avendo a disposizione il meccanismo delle cube map, si può pensare in prima istanza di applicare sulle sei facce del cubo le immagini di input, eventualmente ridimensionandole in modo tale da renderle quadrate. Ciò comporta però la presenza di sgradevoli effetti di discontinuità di colore nelle regioni del volto influenzate da più texture. Le foto in input infatti, a causa di vari fattori, quali ad esempio condizioni di illuminazioni differenti o possibile presenza di ombre, non presentano necessariamente la stessa intensità di colore. Nelle regioni del volto in cui sezioni di superficie adiacenti sono texturizzate sulla base delle informazioni estratte da differenti immagini, si crea uno sbalzo di tonalità di colore che rende il risultato finale poco realistico. Un esempio è rappresentato dalla zona della guancia. In figura 4.5 è facilmente percepibile una cucitura che segna il confine tra l’influenza della foto frontale e quella laterale. Per evitare tale effetto e garantire una continuità cromatica sul volto, si rende quindi necessario un processo di generazione delle texture da applicare sulle sei facce delle cubo, basato sulla combinazione delle foto in input. Il primo passo consiste nel riscalare e traslare temporaneamente la mesh del volto in modo tale da far corrispondere il suo bounding box(parallelepipedo 48 4.4. Generazione texture Fig. 4.5: . che racchiude la mesh) al cubo canonico [-1..+1]x[-1..+1]x[-1..+1]. Le trasformazioni apportate consentono di mantenere invariate le proporzioni del volto, requisito fondamentale per ottenere un modello il più possibile fedele alla realtà. Una volta che la mesh del volto è stata inclusa nel cubo canonico, si procede alla creazione delle texture. Fissata una faccia del cubo e fissato un texel di tale faccia, si traccia un raggio che parte dal texel e raggiunge il centro del cubo intersecando la mesh. Ipotizzando che la mesh non presenti buchi e considerando la sua inclusione nel cubo canonico, si può affermare che sicuramente si avrà un’intersezione. D’altro canto esiste la possibilità che il raggio intersechi più volte la mesh: si pensi a regioni del volto con una geometria piuttosto complicata, ad esempio orecchie, sopracciglie. In tal caso si sceglie di catturare il punto d’intersezione la cui distanza dalla faccia del cubo considerata è minima. Viene in tal modo a crearsi una corrispondenza tra mesh e faccia della cube map: ad ogni texel della faccia della cube map corrisponde un solo punto del volto 3d. 49 4.4. Generazione texture Il punto d’intersezione p individuato può essere visto come la proiezione del texel T sulla mesh; il colore da assegnare al punto p verrà quindi memorizzato nel texel T. Poiché il punto p individuato è visibile in una o più foto bisogna: • determinare il punto corrispondente in ogni foto; • combinare i colori di tali punti in maniera appropriata. Per quanto riguarda il primo punto, il problema consiste nel riuscire ad associare al punto p individuato sulla mesh il corrispondente punto 2D in ciascuna foto. Per un buon risultato finale, è fondamentale che la mesh e le foto siano precisamente allineate: al vertice 3D sulla mesh corrispondente alla punta del naso deve corrispondere esattamente il punto sul naso nelle foto. Visto che si è già operata una deformazione della mesh per far si che la forma corrisponda a quella rappresentata dalle fotografie, la cosa più semplice da fare è una proiezione ortogonale; è necessario cioè determinare (uk , vk ), le coordinate del pixel che si ottengono proiettando p sulla k-esima foto. Si consideri inizialmente la sola fotografia frontale e supponiamo che la mesh abbia il naso rivolto verso l’asse z positivo e gli occhi su un piano parallelo al piano xy.Per fare la proiezione ortogonale efficiente, si può mappare ogni vertice (x, y, z) al punto (u, v) = (x + xof f set , y + yof f set ) dove (xof f set , yof f set ) sono i valori per allineare la fotografia alla mesh. Essi si possono calcolare, ad esempio, considerando la posizione della punta del naso (FDP 9.3): (xnaso , ynaso , znaso ) : coordinate del vertice 9.3 sulla face mesh (unaso , vnaso ) : coordinate del punto 9.3 sulla foto frontale. xof f set = unaso − xnaso 50 4.4. Generazione texture yof f set = vnaso − ynaso In questo modo si crea un’associazione tra foto frontale e mesh. Lo stesso ragionamento viene naturalmente ripetuto per ciascuna foto. Una volta determinate le coordinate dei pixel corrispondenti al punto p su ciascuna foto, sorge il problema di come combinare i corrispondenti colori prestando attenzione ad evitare il fenomeno delle cuciture ed a ottenere un risultato il più possibile realistico. Data una collezione di immagini e un volto 3D, il problema può essere ricondotto alla determinazione del colore texture C(p) per ogni punto p del modello. A tale scopo è necessario individuare una funzione peso mk (p) che specifichi il contributo di colore della k-esima fotografia. E’ chiaro come una foto laterale possa catturare la guancia sinistra in maniera più accurata rispetto ad una fotografia frontale. La funzione peso quantifica semplicemente questa proprietà in un valore. Una prima soluzione potrebbe essere quella di basare tale funzione sugli angoli che vengono a formarsi tra il raggio tracciato intersecante il punto della mesh e le normali dei piani del cubo. Per essere più specifici se si considerano solamente il piano frontale ed il piano superiore, il colore C da assegnare al punto p può essere ottenuto tramite la seguente formula d’interpolazione lineare a due parametri C(p) = m1 (p) ∗ C1 (p) + (1 − m1(p)) ∗ C2 (p) con m1 (p) = Φ/90 dove: • m1 (p) è un valore compreso tra 0 e 1 che rappresenta il peso assegnato al pixel della foto frontale; • Φ è l’angolo tra il raggio e la normale del piano superiore ed è compreso tra 0 e 90; • C1 (p) è il colore del pixel della foto frontale, C2 (p) colore del pixel della foto superiore. 51 4.4. Generazione texture Conseguentemente, se l’angolo tra il raggio e la normale del piano superiore è 90 gradi il colore da assegnare al punto p coincide con quello del pixel della foto frontale; se l’angolo è 0, coincide con quello del pixel della foto superiore, altrimenti è proporzionale all’angolo. In realtà si può facilmente intuire come, essendo la mesh racchiusa in un cubo, il colore del punto p sia influenzato da al massimo 3 foto. Questo approccio ha il vantaggio di creare una transizione regolare del colore nelle varie zone del volto. D’altro canto il risultato è influenzato pesantemente dalla forma del volto. A seconda della geometria assunta dal volto, infatti, alcune sue parti posso essere disegnate in una texture piuttosto che in un’altra. Si pensi ad esempio alla zona della fronte: in presenza di un volto regolare essa viene disegnata prevalentemente nella texture frontale; in caso di un volto allungato essa viene disegnata in parte nella texture frontale e in parte nella texture superiore. In tal caso, l’angolo tra il raggio di un punto della fronte e la normale del piano superiore del cubo è tale da assegnare un peso importante alla foto dall’alto che normalmente rappresenta la porzione di capelli superiore . Si può notare in figura come in un volto allungato, sul colore della fronte influisce negativamente il colore dei capelli, difetto che non si presenta in caso di volto regolare. L’interpolazione lineare basata sugli angoli non rappresenta quindi una soluzione efficiente, si rende necessario ideare una tecnica che consenta di ottenere una colorazione che soddisfi i requisiti di uniformità di colore e di indipendenza dalla forma assunta dal volto. L’idea adottata consiste nel fissare alcuni punti sul volto assegnando a ciascuno di essi una funzione peso per ogni fotografia. Nella scelta di quali punti individuare si sfrutta la conoscenza degli FDP e si costruisce una nuova mesh , ’mesh peso’, che ricalca la geometria del volto umano e ne simula l’andamento. Il processo di creazione si suddivide in due fasi. Inizialmente si individuano i seguenti FDP della parte frontale del volto() ottenendo un’approssimazione del perimetro del viso. Successivamente considerando che la testa ha una forma sferica, si tracciano dei raggi che formano i seguenti an- 52 4.4. Generazione texture goli() con le normali dei piani del cubo. Le intersezioni tra questi raggi e la mesh costituiranno i restanti vertici . Tramite la triangolazione dei vertici individuati si ottiene la ’mesh peso’ rappresentata in figura 4.6. Ad ogni ver- Fig. 4.6: Mesh peso. tice v della ’mesh peso’, per ogni fotografia k, viene associato un peso mk (v) tale che 6 X mk (v) = 1. k=1 Nell’assegnazione dei pesi bisogna determinare quale immagine sia la migliore da mappare su quella parte di superficie del volto. E’ chiaro che ad i vertici della parte frontale del volto individuati dagli FDP venga assegnato un peso pari ad 1 per la fotografia frontale. Per gli altri vertici si avrà una distribuzione dei coefficienti dei pesi influenzata dalla posizione del vertice. In tal modo, poiché si fissano dei punti sul volto e gli si associa un peso che prescinde dalla geometria del volto, viene ad essere soddisfatto il requisito dell’indipendenza dalla forma del volto. L’altro requisito di uniformità di colore sul viso viene conseguito adottan53 4.4. Generazione texture do tale strategia: il raggio tracciato dalla faccia della cube map, oltre ad intersecare la mesh del volto, interseca anche la ’mesh peso’ nel punto l appartenente al triangolo T. Il colore da assegnare al punto l si ottiene tramite interpolazione lineare dei pesi assunti dai tre vertici di T. Si utilizza il concetto di coordinate baricentriche. Dato un triangolo di vertici v1 ,v2 , v3 , ed un suo punto p, esistono tre unici scalari a,b,c tali che: p = a ∗ v1 + b ∗ v2 + c ∗ v3 con a + b + c = 1 a,b,c prendono il nome di coordinate baricentriche di p. Nel nostro caso utilizziamo le coordinate baricentriche di l(l1 , l2 , l3 ) per ottenere il peso da assegnare al punto l per ogni fotografia come interpolazione dei pesi dei vertici v1 ,v2 , v3 di T: mk (l) = l1 ∗ mk (v1 ) + l2 ∗ mk (v2 ) + l3 ∗ mk (v3 ) Il colore da assegnare al punto l viene infine determinato tramite la seguente formula: C(l) = X Ck (l) ∗ mk (l). k Nel processo di generazione delle texture, non è necessario avere tutte e cinque le foto in input. Qualora una foto non sia stata caricata, il sistema provvede a sostituirla con un’immagine nera. Ciò produce in output delle texture particolari: sui bordi sono presenti informazioni di colore derivanti dall’interpolazione con le altre immagini; avvicinandosi al centro si avrà un effetto sfumatura tendente al nero. Un ulteriore accorgimento è stato previsto per sopperire all’assenza di una delle due foto laterali. Il sistema permette di considerare, al posto del profilo mancante, l’immagine riflessa orizzontalmente dell’altro profilo. 54 4.5. Disegno Mesh 4.5 Disegno Mesh Nel precedente paragrafo abbiamo visto come generare le sei texture da applicare alle sei facce del cubo. Abbiamo il cubo e la mesh e ci chiediamo ora come associare ad ogni vertice V della mesh la relativa coordinata texture T della cube map. OpenGL permette di generare automaticamente le coordinate texture usando uno dei due speciali metodi di generazione delle coordinate texture da usare in congiunzione con il cube map texturing: reflection map o normal map. Entrambe inglobano dei calcoli per determinare rispettivamente il vettore riflessione ed il vettore normale e sono generalmente usati per l’environment mapping o per l’illuminazione. E’ altresı̀ possibile specificare esplicitamente le coordinate texture: si utilizza una terna (s,r,t) in cui una coordinata indica il piano della faccia della cube map mentre le altre due rappresentano le coordinate del punto all’interno del piano. Al fine di determinare tale terna si è adottato un procedimento inverso rispetto a quello utilizzato per la generazione delle texture. In quel caso si traccia un raggio che parte dal texel della faccia della cube map, interseca la mesh e raggiunge il centro del cubo. Qui invece si fa partire per ogni vertice V della mesh un raggio che parte dal centro del cubo, passa per V e interseca il cubo in un punto p. Al vertice V viene associata la coordinata texture(s,t,r). 4.6 Algoritmo Descriviamo ora l’algoritmo utilizzato per texturizzare il volto modellato. Come visto nei precedenti paragrafi l’algoritmo può essere suddiviso in due parti principali: • generazione delle texture; • texturizzazione del volto tramite cube map. 55 4.6. Algoritmo ALGORITMO PER LA GENERAZIONE DELLE TEXTURE Input : mesh del volto M, n fotografie del volto Output : texture Effettuare delle trasformazioni sulla mesh M in modo tale da includerla nel cubo canonico. Costruire mesh peso. Per ogni faccia f del cubo . Per ogni texel x della faccia f • Tracciare un raggio che parte dal texel x e interseca la mesh nel punto q del triangolo F. • Tracciare un raggio che parte dal texel x e interseca la ’mesh peso’ nel punto p del triangolo T. • Determinare il peso da assegnare, per ciascuna fotografia, al punto p interpolando i pesi assegnati ai vertici del triangolo T. • Proiettare il punto q su ciascuna fotografia e ricavare il colore del texel ad esso associato. • Determinare il colore da assegnare al punto q tramite la combinazione tra colori e pesi. • Memorizzare il colore ottenuto nel texel x. L’algoritmo descritto presenta problemi dal punto di vista computazionale per quanto riguarda la parte delle generazione delle texture. Tale algoritmo presente un costo computazionale dell’ordine di Θ(m ∗ p ∗ n), dove m e p sono rispettivamente la larghezza e l’altezza delle texture della cubemap e n è il 56 4.6. Algoritmo numero di facce della mesh. In particolar modo risulta onerosa l’operazione del calcolo dell’intersezione tra la mesh ed il raggio che parte dal texel della faccia del cubo e raggiunge il centro. E’ un problema di collision detection, vale a dire determinare se il raggio interseca il volto e, in caso affermativo, in quale punto di quale faccia triangolare. La cosa più semplice da fare è scorrere, per ogni faccia del cubo f e per ogni raggio r, tutti i triangoli appartenenti alla mesh sino a che non si trova il triangolo t che interseca il raggio. Emerge in tal caso l’elevata complessità di questo approccio di tipo esaustivo corrispondente a Θ(n), con n numero di triangoli della mesh. Ssono state quindi applicate alcune funzioni di taglio che consentono di ridurre il tempo computazionale di questa operazione. Tutte hanno lo scopo di ridurre il numero di triangoli in cui ricercare per determinare l’intersezione con il raggio. La prima funzione di taglio nasce dall’idea di ottenere dalla posizione del texel dal quale parte il raggio, l’informazione sulla zona della mesh in cui si trova il triangolo intersecato. Dato un raggio che parte da un texel e raggiunge la mesh possiamo pensare di ridurre drasticamente la ricerca non considerando i triangoli del volto che non potranno mai essere intersecati dal raggio. Supponiamo di tracciare un raggio da un texel della faccia frontale; è impossibile che i triangoli della parte posteriore del volto siano intersecati dal raggio. La funzione di taglio che ne deriva e consente di eliminare dei triangoli dall’insieme di ricerca, si basa sul seguente approccio. Dato un piano da texturizzare, si considera un piano virtuale parallelo ad esso passante per il centro del cubo (0, 0, 0); vengono esaminati esclusivamente tutti i triangoli che sono interposti tra il piano virtuale e il piano da texturizzare omettendo la ricerca per tutti i triangoli che non appartengono a tale insieme. Se per ipotesi possiamo considerare che le facce della mesh siano distribuite in maniera tale da poter dimezzare, per ogni faccia del cubo canonico, l’insieme dei triangoli candidati alla ricerca dell’intersezione con il raggio, la complessità dell’algoritmo diviene Θ(m ∗ p ∗ n/2). 57 4.6. Algoritmo Una seconda funzione di taglio è basata sul concetto di adiacenza dei triangoli: quando un raggio interseca un triangolo, è molto probabile che il raggio successivo vada ad intersecare lo stesso triangolo oppure uno dei triangoli vicini. Supponiamo infatti di aver dedotto il triangolo associato al texel che si vuole colorare, si può intuire come il raggio che parte dal texel successivo intersechi con buona probabilità lo stesso triangolo. Se ciò non avviene non sarà necessaria una nuova ricerca su tutti i possibili triangoli ma essa potrà essere ridotta a i triangoli adiacenti a quella trovata. Poiché la texturizzazione avviene tramite la tecnica scan-line un ulteriore accorgimento si accompagna a questa tecnica. Una volta processato il primo pixel della riga n-esima, si memorizza il triangolo intersecato. Esso sarà il primo ad essere controllato nel momento in cui si cerca l’intersezione tra il raggio che parte dal primo pixel della riga n+1-esima e la mesh. Esistono inoltre delle situazioni anomale nella ricerca dell’intersezione tra raggio e mesh. La mesh non è un poligono chiuso e presenta alcune parti aperte come ad esempio gli occhi. In tal caso la funzione di taglio precedente fallisce, si ricerca tra tutti i triangoli e non se ne trova uno che intersechi il raggio provocando il rallentamento dell’algoritmo. L’idea adottata è quella di riempire i buchi aggiungendo dei triangoli virtuali. Un esempio è zona degli occhi; sfruttando la conoscenza degli FDP si aggiungono dei triangoli virtuali come mostrato in figura. In tal modo, nel momento in cui viene tracciato un raggio che raggiunge la zona degli occhi, si ottiene sicuramente un’intersezione con un triangolo provocando l’attivazione delle funzioni di taglio precedentemente descritte. I triangoli virtuali aggiunti non vengo però texturizzati, il loro scopo è non far fallire la seconda funzione di taglio quando l’algoritmo è a regime. Riportiamo qui di seguito lo pseudo codice dell’algortimo con le funzioni di taglio. 58 4.6. Algoritmo ALGORITMO PER LA GENERAZIONE DELLE TEXTURE, vers. 2 Input : mesh del volto M, n fotografie del volto Output : texture Effettuare delle trasformazioni sulla mesh M in modo tale da includerla nel cubo canonico. Costruire mesh peso. Per ogni faccia f del cubo . L = lista vuota; . Per ogni texel x della faccia f • Tracciare un raggio che parte dal texel x. · Se L non è vuoto allora F = cercaInLista(L), dove F è triangolo della mesh intersecato dal raggio nel punto q. · Se L è vuoto o T = null allora F = CercaInLista(tutti i triangoli). • Tracciare un raggio che parte dal texel x e interseca la ’mesh peso’ nel punto p del triangolo T. • Determinare il peso da assegnare, per ciascuna fotografia, al punto p interpolando i pesi assegnati ai vertici del triangolo T. • Proiettare il punto q su ciascuna fotografia e ricavare il colore del texel ad esso associato. • Determinare il colore da assegnare al punto q tramite la combinazione tra colori e pesi. • Memorizzare il colore ottenuto nel texel x. 59 4.6. Algoritmo Procedura CercaInLista(lista L) per ogni triangolo T della lista L . se il raggio interseca il triangolo T • L diventa l’insieme costituito da T e dai vicini di T • return T; return null; Tale versione dell’algoritmo di texturizzazione, con l’aggiunta delle due funzioni di taglio, presenta un costo computazionale pari a (m ∗ p ∗ n/2). Analizzando l’algoritmo, dopo la prima iterazione, il costo computazionale di tutte le successive ricerche dell’intersezione tra raggio e mesh passa da Θ(n/2) a Θ(1) in quanto la ricerca si basa sul precedente triangolo o al massimo sui suoi adiacenti. A regime il costo medio computazionale per ogni faccia della cubemap è quindi (m ∗ p). L’algoritmo di seguito proposto ha il compito di assegnare ad ogni vertice della mesh le coordinate delle texture della cubemap. ALGORITMO PER L’APPLICAZIONE DELLE TEXTURE Input : mesh del volto M, texture Output : volto texturizzato Per ogni vertice V della mesh . Tracciare un raggio che parte da V e raggiunge una delle facce del cubo in un punto di coordinate (u,v,t). . Associare le coordinate (u,v,t) al vertice V. Il costo computazionale di tale algoritmo è pari a Θ(w), dove w è il numero di vertici della mesh, in quanto per determinare il punto di intersezione tra un raggio e un piano il costo è pari a O(1). 60 Capitolo 5 Implementazione 5.1 Struttura dell’applicazione I precedenti capitoli descrivono l’aspetto teorico del nostro studio, in questo capitolo mostriamo i dettagli implementativi della nostra applicazione. Tutte le immagini presenti in questa tesi che raffigurano volti 3D renderizzati, sono state generate utilizzando il sistema sviluppato. L’applicazione presenta le seguenti caratteristiche: Sviluppata in C++ seguendo il paradigma della programmazione ad oggetti. Utilizzo della libreria FLTK per l’interfaccia utente. Utilizzo della libreria OpenGL e della libreria visage per il rendering Come scelta progettuale si è deciso di suddividere l’applicazione in due sottosistemi: il sottosistema Modellazione-Texturizzazione che costituisce il motore dell’intera applicazione e il sottosistema Interfaccia grafica che gestisce l’interazione con l’utente e visualizza i risultati ottenuti. La Libreria è in grado di funzionare autonomamente prescindendo dal sottosistema Interfaccia grafica. Nei paragrafi successivi mostreremo in dettaglio i due sottosistemi. 61 5.2. Sottosistema Modellazione-Texturizzazione Sottosistema INTERFACCIA GRAFICA Foto input Acquisizione FDP dalle foto Mesh generica + FDP Deformazione della mesh 3D Sintesi delle texture Volto 3D + FDP Sottosistema MODELLAZIONE-TEXTURIZZAZIONE Fig. 5.1: Sottosistemi 5.2 Sottosistema Modellazione-Texturizzazione Il sottosistema Modellazione-Texturizzazione fornisce le funzionalità idonee per la costruzione di un volto virtuale a partire dalle fotografie di una persona reale. Come si può notare in figura 5.1 essa prende in input alcune foto di una persona ed una mesh di un volto arbitrario con i relativi FDP e restituisce in output il modello unitamente alle texture generate. Il diagramma delle classi inerente a questo sottosistema è il seguente: PhotoFit: è la classe principale; utilizza le funzionalità offerte dalle altre classi per generare la sintesi di un volto virtuale. E’ in grado di acquisire le informazioni che le necessitano tramite file o interfaccia grafica. 62 5.2. Sottosistema Modellazione-Texturizzazione <<interface>> PhotoFitRenderer RenderScene() ReSizeGLScene(width: GLsizei,height: GLsizei) FlashVertex(x: GLfloat, y:GLfloat,z: GLfloat) FitToScreen() Texturize model: VRMLModel* fdpMesh: FDP * pPhotoFit: PhotoFit* SetModel(vrmlmodel VRMLModel *) SetfdpMeshPoints(fdpIMesh FDP *) ToCubeMap(fdpMesh FDP *, mod VRMLModel*) PhotoFitRendererImpl PhotoFit RenderScene() ReSizeGLScene(width: GLsizei,height: GLsizei) FlashVertex(x: GLfloat, y:GLfloat,z: GLfloat) FitToScreen() iMesh: VRMLModel* oMesh: VRMLModel* iFDP: FDP* oFDP: FDP* input_images: image* output_texture:image* LoadPic(picPath:char*) LoadMesh(meshPath:char*) GetMeshFDP(): FDP* GetPicFDP(): FDP* PhotoFit() MorphMesh() BuildCubeMap(): VRMLModel* Visage FDP FDP(fn: char*) getFPPos(group:int, n:int):float* getFPPos(name: char *): float* setFPPos(group:int,n :int, pos :float*) readFromFile(name: char *) Vector3D Morpher MorphModel(start:FDP*,end: FDP*,model:VRMLModel*) RadialBasisFunction SolveLinearSystem Resolve(CoeffMatrix:double*, VectorSolution:double*,dim :int) :double* 63 setRadialBasisFunction(n:RBF) InsertTrainingData(pointP: Vector3D, pointQ: Vector3D) LoadCoeffMatrix() LoadBMatrix() SolverSystem():Vector3D * Morph(coordList:float*, n_points: int, H: Vector3D*) 5.2. Sottosistema Modellazione-Texturizzazione PhotoFitRenderer: è l’interfaccia con la libreria visage. Fornisce i metodi per il rendering del volto. FDP: è la classe che si occupa della gestione degli FDP. Ogni FDP contiene informazioni quali: identificatore coincidente con quello definito dallo standard MPEG-4, numero del vertice corrispondente nel modello di volto, coordinate x, y, z del punto. Offre inoltre funzionalità di scrittura e salvataggio sul file. RadialBasisFunction: calcola la funzione di interpolazione attraverso l’uso delle radial basis function. Consente la scelta fra 5 tipi di RBF: lineare, gaussiana, cubica, hardy, thin-splate ed imposta conseguentemente il sistema da risolvere. SolveLinearSystem: è l’implementazione della risoluzione di un sistema lineare. Data la matrice A dei coefficienti e il vettore b dei termini noti si utilizza la fattorizzazione LU per determinare la soluzione x del sistema Ax=b. Questa classe è stata progettata in modo tale da poter essere utilizzata indipendentemente dal sistema. Morpher:ha il compito di gestire il processo di deformazione di un volto generico coadiuvata dalle classi RadialBasisFunction e SolveLinearSystem. Prende in input l’insieme degli FDP individuati sulle foto, la mesh arbitraria con i relativi FDP e applica la funzione di interpolazione determinata dalla classe RadialBasisFunction ad ogni vertice della mesh. Il risultato è una mesh deformata i cui FDP coincidono con gli FDP individuati sulle immagini. Texturize: si occupa della texturizzazione del volto. A partire dalle immagini e dal volto deformato si generano le texture che vengono poi mappate opportunamente attraverso il meccanismo del cube mapping. Per illustrare in maniera più completa il funzionamento del sottosistema Libreria mostriamo anche i relativi diagramma di sequenza. Nel primo sono evidenziate le fasi di modellazione e texturizzazione. 64 5.2. Sottosistema Modellazione-Texturizzazione PhotoFit Morpher RadialBasisFunction Texturize LoadPic() LoadPicFDP() BuildFaceModel() MorphModel() Morph() ToCubeMap() return VRMLModel In ingresso la classe PhotoPit prende l’insieme delle foto e l’insieme degli FDP estratti da esse e partendo da un modello VRMLModel rappresentante un volto generico, invoca in sequenza i metodi MorphModel() della classe Morpher e ToCubeMap() della classe Texturize per realizzare rispettivamente la deformazione e la texturizzazione. Il risultato è un VRMLModel da renderizzare. Il diagramma seguente illustra come avviene la fase di renderizzazione. Per renderizzare il modello è necessario richiamare il metodo CreateRenderer() della classe PhotoFit che fornisce l’interfaccia per eseguire il rendering dei modelli VRMLModel. Ogni volta che l’applicazione ha bisogno di renderizzare la scena si deve invocare il metodo RenderScene(). Come fase conclusiva del rendering è necessario invocare Release() per rilasciare la memoria occupata. 65 5.3. Sottosistema Interfaccia grafica PhotoFit CreateRendererModel() New PhotoRendererImp LoadModel() return PhotoRender LOOP RenderScene() Release() 5.3 Sottosistema Interfaccia grafica Il sottosistema Interfaccia grafica si occupa di gestire l’interazione dell’utente con l’applicazione e mostra come sia possibile implementare il processo di generazione di un modello virtuale attraverso l’utilizzo della Libreria. Esso è stato sviluppato sulla base di un progetto esistente aggiungendo le caratteristiche necessarie allo svolgimento del nostro lavoro. Le funzionalità appartenenti a questa area sono strettamente legate all’acquisizione delle immagini 2d, all’inserimento e modifica degli FDP sulle varie immagini e all’attivazione delle procedure di modellazione e texturizzazione con visualizzazione del risultato. L’interfaccia grafica sviluppata permette di acquisire i dati necessari all’intero processo consentendo il caricamento di un modello arbitrario e l’acquisizione di al più cinque immagini di un soggetto catturate secondo diverse angolazioni: vista frontale, laterale sinistro, laterale destro, superiore, poste- 66 5.3. Sottosistema Interfaccia grafica Fig. 5.2: Snapshot dell’interfaccia grafica riore. Il numero delle immagini da visualizzare è variabile e dipende dalla qualità del risultato che si desidera ottenere. Un discorso analogo può essere fatto circa la risoluzione delle fotografie: ad alte risoluzioni corrispondono risultati maggiormente realistici. Una volta visualizzate le immagini, una procedura interattiva consente di individuare la posizione dei vari FDP. La finestra FDPEditor permette la scelta dell’FDP da inserire e mostra un volto guida su cui è visualizzata ed evidenziata la posizione dell’FDP prescelto. In tal modo l’utente acquisisce la conoscenza relativa alla posizione dell’FDP e può riprodurla sulle varie foto. Poichè le immagini potrebbero non essere allineate o presentare un diverso fattore di scala, si è previsto un meccanismo che consente all’utente di posizionare i punti correttamente nelle varie foto.La tecnica utilizzata è stata descritta ampiamente nel capitolo 3. Le classiche operazioni di inserimento, modifica, cancellazione dei punti unitamente alla possibilità di ingrandire le immagini, aiutano l’utente nel processo di localizzazione degli FDP. 67 5.4. Librerie utilizzate L’attivazione delle funzioni di deformazione e texturizzazione producono come effetto la visualizzazione del modello risultante, a cui possono essere applicate trasformazioni di rotazione, traslazione, o scalamento. 5.4 Librerie utilizzate Per la realizzazione del sottosistema Interfaccia grafica, si è utlizzato FLTK [27], un toolkit grafico per interfacce utenti, disponibile per Unix/Linux, Windows, MacOS. E’ utilizzabile insieme a qualsiasi ambiente di sviluppo C++ ed è costituito da diverse librerie che permettono la creazione di interfacce grafiche, la gestione degli eventi e offrono un ottimo supporto alle funzioni OpenGL. Con l’uso delle FLTK è possibile creare un’interfaccia grafica con un’unica API indipendetemente dal sistema operativo utilizzato. L’altra libreria esterna utilizzata è quella della visage, fornita dalla Visage Technologies AB [28]. Essa consente la visualizzazione di volti virtuali 3D memorizzati in formato VMRL 2.0. L’utilizzo della cube map ha richiesto la necessità di modificare tale libreria in modo tale che potesse gestire questo tipo di texturizzazione. 68 Capitolo 6 Risultati In questo capitolo evidenzieremo le caratteristiche e le potenzialità della nostra applicazione mostrando e analizzando alcuni risultati. Si è deciso di condurre l’analisi ponendo l’attenzione su due diversi aspetti: da una parte si considera il tempo necessario per la costruzione di un modello, sottolineando le differenze che si vengono a creare al variare di alcuni parametri come il numero delle foto in input e la risoluzione delle texture da generare; dall’altra si pone l’accento sulla qualità dei risultati ottenuti. Iniziamo con una panoramica dei volti generati con il nostro sistema. La scelta dei modelli da rappresentare è stata dettata dalla necessità di testare il nostro lavoro su volti eterogenei con forma, geometria e tratti somatici diversi. Ciascun modello mostra una particolare caratteristica dell’applicazione ed è stato costruito mediante la seguente procedura: dopo aver acquisito attraverso l’interfaccia grafica le immagini raffiguranti un volto umano, si procede all’inserimento degli FDP sulle foto per poi attivare le funzioni di modellazione e texturizzazione. Le figure che presenteremo per esibire i vari volti generati sono tutte suddivise in due parti: nella parte alta vengono visualizzate le foto in input, a seguire viene mostrato il volto texturizzato evidenziandone i vari profili. Per semplicità in questa tesi sono visualizzati solamente modelli le cui texture hanno risoluzione 256 x 256; il motivo è che stampando il modello non sareb- 69 6.1. Prove di rendering be possibile apprezzare il miglioramento della qualità apportato da texture con risoluzione maggiore. 6.1 Prove di rendering Il sistema è stato progettato in modo tale da risultare flessibile, va a dire che è possibile impostare alcune variabili a seconda della varie esigenze. Innanzitutto non è necessario acquisire tutte e cinque le immagini di input (frontale, laterale sinistro, laterale destro, superiore, posteriore), in secondo luogo è possibile definire quale texture generare. L’impostazione della generazione di una texture la cui relativa foto in input non è stata acquisita, non risulta essere un problema: la texture viene generata in base alle informazioni provenienti dalla altre foto producendo un effetto sfumatura laddove tali informazioni vengono a mancare. Ciò consente di creare un effetto di continuità che influisce positivamente sul realismo del volto. E’ l’esempio del modello 1, presente nella figura 6.1. Nonostante l’assenza delle immagini del volto catturate da una vista superiore, inferiore e posteriore, le texture relative sono comunque generate e l’effetto è visibile in figura. Per comprendere meglio quanto questa caratteristica assuma un aspetto importante e influisca positivamente sul risultato finale, nella figura 6.2 mostriamo lo stesso volto prodotto sulla base di due parametri diversi. In input abbiamo due foto: vista frontale e profilo sinistro. Nel primo caso disabilitiamo la generazione della texture relativa al profilo destro, il sistema di conseguenza utilizzerà nel processo di texturizzazione, in corrispondenza della texture relativa a quel profilo, una texture monocolore. Il secondo caso invece è opposto, abilitiamo la generazione della texture relativa al profilo destro. In entrambi i casi mostriamo il risultato evidenziando i profili interessati. Mentre nel primo caso l’assenza della foto in input relativa al profilo destro influisce negativamente sul risultato finale creando uno sgradevole effetto di discontinuità che va a discapito del realismo, nel secondo caso l’effetto sfumatura riesce a mascherare la mancanza di informazioni di colore. Con- 70 6.1. Prove di rendering Fig. 6.1: modello 1. 71 6.1. Prove di rendering frontando i due profili frontali si può notare come nel secondo caso la pelle sul lato destro del volto (il sinistro per l’osservatore) risulti continua e realistica a differenza dell’altro caso, dove la presenza di una macchia di colore nero peggiora la qualità dell’immagine rendendo il volto meno verosimile. Un’altra funzionalità offerta è la possibilità di acquisire una sola delle due immagini laterali; il sistema potrà generare automaticamente il profilo opposto sulla base delle informazioni presenti in quello acquisito. Tale funzionalità è stata mostrata nei modelli 2 e 3, presenti rispettivamente nelle figure 6.3 e 6.4. In tutte e due i casi si hanno in input solamente la foto frontale e la foto del profilo sinistro; come output si ha un volto texturizzato con entrambi i profili anche se uno è speculare all’altro. Inoltre essi sono accomunati dal fatto di non avere le foto in input perfettamente allineate, ad esempio la punta del naso nella foto frontale è posta ad una diversa altezza rispetto a quella raffigurante il profilo. Abbiamo ampliamente parlato nel paragrafo 3.2 di come ovviare a tale problema in fase di inserimento degli FDP sulle foto. Dai risultati si può vedere come il sistema funzioni ugualmente anche in presenza di foto non allineate. L’esempio presentato nella figura 6.5 è stato inserito per mostrare il processo completo per la generazione di un volto 3D, dallo scatto delle fotografie fino ad arrivare al modello 3D finale. In input abbiamo cinque foto: vista frontale, profilo destro, profilo sinistro, vista superiore, vista posteriore. Le foto sono state catturate in maniera artigianale, senza fare particolare attenzione a dettagli o accorgimenti fotografici (luci, distanze, etc.). A differenza degli altri modelli, in questo caso sono state generate tutte e cinque le texture, senza ricorrere quindi all’effetto sfumatura. L’applicazione produce il modello 3D finale,di cui cinque viste sono riportate in figura. Il risultato appare abbastanza realistico e somigliante, anche se la modella è quello che è. In figura 6.6 viene mostrato nuovamente il modello 1. Rispetto all’esempio precedente esso è stato generato a partire dal modello generico iniziale reana(vedi paragrafo 2.3). Oltre a visualizzare le viste del modello ottenuto, in figura è presente un confronto con il modello generato a partire da be- 72 6.1. Prove di rendering Fig. 6.2: confrontro tra modelli con o senza generazione texture destra 73 6.1. Prove di rendering ta. Quel che si può dire è che i lineamenti base del modello 1 in entrambi i casi permangono perchè lo standard prevede un numero sufficiente di FDP per dare l’aspetto anatomico della figura rappresentata nelle foto. L’insieme degli FDP previsto non risulta però sufficientamente dettagliato per poter rappresentare i minimi particolari. 74 6.1. Prove di rendering Fig. 6.3: modello 2 75 6.1. Prove di rendering Fig. 6.4: modello 3 76 6.1. Prove di rendering Fig. 6.5: modello 4 77 6.1. Prove di rendering Fig. 6.6: modello 1 generato con il modello generico reana 78 6.2. Analisi dei tempi di esecuzione 6.2 Analisi dei tempi di esecuzione Analizziamo ora i tempi di esecuzione per la generazione di un modello 3D con il nostro sistema. N° Modello Risoluzione Foto Input Risoluzione Foto Output Foto Input Tempo Creazione Texture 1 2048 x 1536 256 x 256 Frontale Destra Sinistra 2 512 x 512 256 x 256 Frontale Sinistra 55 secondi 3 2272 x 1204 256 x 256 Frontale Sinistra 55 secondi 3 2272 x 1204 256 x 256 Frontale Sinistra 55 secondi 4 1600 x 1200 256 x 256 Tutte 55 secondi 1 2048 x 1536 512 x 512 Frontale Destra Sinistra 3 minuti e 54 secondi 2 512 x 512 512 x 512 Frontale Sinistra 3 minuti e 54 secondi 3 2272 x 1204 512 x 512 Frontale Sinistra 3 minuti e 54 secondi 3 2272 x 1204 512 x 512 Frontale Sinistra 3 minuti e 54 secondi 4 1600 x 1200 512 x 512 Tutte 3 minuti e 54 secondi 55 secondi Texture Output - Frontale, Destra, Sinistra - Posteriore e Inferiore con effetto sfumatura - Frontale,Sinistra - Destra, Posteriore e Inferiore con effetto sfumatura - Frontale,Sinistra - Destra, Posteriore e Inferiore con effetto sfumatura - Frontale,Sinistra - Destra speculare - Posteriore, Inferiore con effetto sfumatura Tutte - Frontale, Destra, Sinistra - Posteriore e Inferiore con effetto sfumatura - Frontale,Sinistra - Destra, Posteriore e Inferiore con effetto sfumatura - Frontale,Sinistra - Destra, Posteriore e Inferiore con effetto sfumatura - Frontale,Sinistra - Destra speculare - Posteriore, Inferiore con effetto sfumatura Fig. 6.7: tabella dei tempi di esecuzione 1. 79 Tutte 6.2. Analisi dei tempi di esecuzione Abbiamo racchiuso i risultati in una tabella per evidenziare le differenze e le uguaglianze a fronte del cambiamento di alcuni parametri. Come premessa occorre sottolineare che le prove sono state effettuate su un Pentium IV 2.80GHz, 512MB RAM. Inoltre tutte le prove mostrate in tabella sono state eseguite partendo dal modello iniziale di volto generico beta(vedi paragrafo 2.3). Non abbiamo inserito il tempo per il morphing in quanto esso dipende esclusivamente dal numero di FDP ed è di circa 3s. Il tempo per la texturizzazione dipende essenzialmente da due parametri: la risoluzione delle texture in output e il numero di texture generate. In tutti i casi presenti nella tabella sono state generate tutte le texture, per quelle la cui relativi foto in input non è presente si è prodotto l’effetto sfumatura. Il tempo texturizzazione a parità di risoluzione delle texture, è costante. Dalla tabella si può inoltre notare che le funzionalità offerte per compensare la mancanza di informazioni non producono aggravi di tempo. Nella tabella sottostante abbiamo considerato uno dei modelli per mostrare come il tempo di esecuzione cambi a seconda della risoluzione e del numero Modello 1 (risoluzione 256 x 256) Modello 2 (risoluzione 512 x 512) 2 Textures 3 Textures 4 Textures 5 Textures 6 Textures 9 secondi 13 secondi 17 secondi 32 secondi 55 secondi 18 secondi 45 secondi 1 minuto e 5 secondi 3 minuti 3 minuti e 4 secondi Fig. 6.8: tabella dei tempi di esecuzione 1. di texture che si genera. Se si vuole ad esempio non dare risalto alla texture posteriore o superiore, il tempo di esecuzione diminuisce. 80 6.3. Analisi qualitativa dei risultati 6.3 Analisi qualitativa dei risultati Il principale scopo di questa tesi è quello di costruire un volto 3D che sia il più possibile fedele al volto raffigurato nelle immagini. Si è deciso quindi di dare maggior risalto alla qualità del risultato finale a discapito dei tempi di esecuzione. Per dedurre se l’obiettivo è stato raggiunto si è deciso di realizzare un test di tipo qualitativo. Si è stabilito un indice di qualità sulla deformazione e la texturizzazione in base ad una scala di 5 valori: 5 - Ottimo:il viso virtuale 3D oltre a rappresentare i lineamenti e l’apparenza, riesce a modellare anche le piccole peculiarità del viso. 4 - Buono: la forma, i lineamenti e l’apparenza del viso virtuale 3D sono somiglianti a quelli del volto delle foto. 3 - Sufficiente: la forma, i lineamenti del viso e l’apparenza del volto virtuale 3D sono somiglianti a quelli del volto delle foto ma si notano piccole imperfezioni e scostamenti dal reale. 2 - Mediocre: la forma, i lineamenti del viso virtuale 3D e l’apparenza sono somiglianti a quelli del volto delle foto ma si notano parecchie imperfezioni e scostamenti dal reale. 1 - Pessimo: il viso 3D virtuale non riesce a rappresentare correttamente l’apparenza ed i lineamenti del viso delle foto. I modelli presentati nel paragrafo 6.1 sono stati fatti vedere (in fase di rendering) ad un gruppo di venti persone. A ciascuna di esse è stato richiesto di esprimere un giudizio.E’ importante sottolineare che questi giudizi sono stati espressi sotto l’indicazione di non considerare, per quanto possibile, i capelli la cui modellazione e texturizzazione non è stata oggetto del nostro lavoro di tesi. In linea generale possiamo affermare che questa prova ha lo scopo di misurare come una persona riesce a percepire somigliante il volto 3D virtuale rispetto al volto della persona raffigurata nelle foto. 81 6.3. Analisi qualitativa dei risultati Media dei giudizi Modello 1 (beta) Modello 1 (reana) Modello 2 Modello 3 Modello 4 3.9 3.5 3.6 3.1 3.6 Fig. 6.9: tabella dei giudizi. I risultati di quest’ultima analisi permettono di poter confermare il raggiungimento dello scopo prefissato, cioè quello di fornire un metodo per la generazione di volti virtuali realistici somiglianti a quelli presenti nelle foto. I risultati inerenti la qualità non sono ottimi sopratutto per via della deformazione che non produce un volto morfologicamente identico a quello delle foto. La texturizzazione, oggetto principale della nostra tesi, sopratutto nel caso in cui siano presenti tutte e 5 le vista ha avuto giudizi più che soddisfacenti ma purtroppo sono stati condizionati negativamente dai giudizi sulla deformazione. I lineamenti del viso coincidono ma alcuni particolari vengono a mancare. Ciò è dovuto al fatto che lo standard MPEG-4 fornisce un numero di FDP sufficiente per la modelazzione della geometria e la forma del volto ma non ottimale per la modellazione di piccoli particolari. 82 Capitolo 7 Conclusioni Scopo di questo progetto di tesi è stato quello di sviluppare un metodo per la ricostruzione tridimensionale di un volto umano attraverso l’utilizzo di immagini ortogonali che lo ritraggono. Partendo dalla descrizione delle tecniche già utilizzate in questo ambito, abbiamo progettato il nostro processo evidenziandone due tematiche fondamentali: la deformazione del volto e la texturizzazione. La prima è la parte del progetto che richiede l’interazione del sistema con l’utente. A tale scopo è stata costruita un’interfaccia grafica che consenta all’utente di acquisire le immagini e selezionare su di esse i punti gli FDP dello standard MPEG-4. Il processo di deformazione è stato sviluppato attraverso l’uso della radial basis function multiquadrica. Alla scelta di tale funzione si è giunti attraverso un’analisi analitica e comparativa delle varie radial basis function finalizzata all’individuazione della funzione che meglio si adattasse alle nostre esigenze di deformazione del volto. Abbiamo cosi ottenuto un metodo per la generazione di un modello di volto 3D la cui forma e la geometria fossero somiglianti a quelle del volto presente nelle foto. La seconda tematicatica affrontata, la texturizzazione, è la parte innovativa della tesi: non esiste in letteratura un’altra trattazione che utilizza il cube mapping per la texturizzazione di un volto. Tale tecnica, usualmente utilizzata per scopi differenti, è stata introdotta ponendola a confronto con le tecni- 83 7.1. Possibili sviluppi che tradizionali ed evidenziandone i vantaggi. Ad essa si è accompagnato un algoritmo adattivo per la risoluzione dei classici problemi di texturizzazione di oggetti a partire da varie fotografie. Una fase finale di analisi dei risultati ottenuti ci porta a considerare raggiunto lo scopo prefissato per questa tesi. 7.1 Possibili sviluppi Durante il processo di analisi e sviluppo del sistema sono emerse alcune problematiche che descriveremo brevemente qui di seguito e che aprono la strada a possibili sviluppi futuri. Procedura automatica per l’estrazione FDP. Il nostro processo richiede l’interazione del sistema con l’utente per la selezione degli FDP. Questa procedura risulta essere per l’utente un po’ lunga e noiosa. Si può ovviare a questo problema sviluppando un metodo di estrazione automatica degli FDP che lavori automaticamente e con maggiore precisione. Utilizzo di foto non ortogonali. Il nostro sistema è stato progettato per generare volti virtuali a partire da foto ortogonali. Questo rappresenta un limite in quanto il soggetto da riprodurre deve essere catturato secondo angolature predefinite. Permettere l’acquisizione di immagini che non presentano tali vincoli, è un’estensione che andrebbe apportata al sistema per migliorarne l’efficienza. Nel nostro caso andrebbe rivista l’interfaccia grafica per la selezione degli FDP e ampliata la procedura per la generazione delle texture con il cube mapping. Miglioramento della complessità computazionale. L’algoritmo attualmente utilizzato per generare le texture di un volto umano richiede un eccessivo costo computazionale. Lo sviluppo di tecniche basate su differenti pattern possono portare ad una riduzio- 84 7.1. Possibili sviluppi ne complessiva della complessità computazionale dellŠalgoritmo da noi proposto. Modellazione e sintesi dei capelli. Una corretta sintesi dei capelli è una parte importante nell’ambito della generazione di volti virtuali in quanto è in grado di apportare un contibuto significativo al raggiungimento del realismo. La loro complessità geometrica li rende però difficili da modellare e texturizzare. Alcuni recenti lavori [29, 30] volti a simulare il moto e l’apparenza dei capelli sono stati proposti ma non risultano particolarmente convincenti. Animazione facciale. la sintesi di un volto virtuale può essere considerato la base per sviluppare un sistema che consenta di animare il volto 85 Bibliografia [1] F.I.Parke. Computer generated animation of faces. Proceedings ACM annual conference, August 1972. [2] F.I.Parke. A parametric model for human faces. PhD thesis, University of Utah, December 1974. UTEC-CSc-75-047. [3] V. Blanz e T. Vetter. A morphable model for the synthesis of 3D faces. Proceedings of SIGGRAPH’99, pages 187–194, August 1999. [4] V. Blanz,C. Basso,T. Poggio e T. Vetter. Reanimating faces in images and video. Proceedings of EUROGRAPHICS, pages 641–650, September 2003. [5] V. Blanz, C. Basso, T. Poggio, T. Vetter. Face recognition based on fitting a 3D morphable model. IEEE Transactions on Pattern Analysis and Machine Intelligence, 25(9):1063–1074, 2003. [6] T. Kurihara e K. Arai. A transformation method for modeling and animation of the human face from photographs. Computer Animation 91, pages 45–58, 1991. [7] R.S. Wallace T. Akimoto, Y. Suenaga. Automatic creation of 3D facial models,. IEEE Computer Graphics and Application, 13(4). [8] H. Horace, S. Ip, Lijun Yin. Constructing a 3D individualized head model from two orthogonal views. The Visual Computer 12, pages 254– 266, 1996. 86 BIBLIOGRAFIA [9] F. Pighin, J.Hecker, D. Lischinski, R. Szeliski, D.H. Salesin. thesizing realistic facial expressions from photographs. Syn- Computer Graphics(SIGGRAPH ’98 Conf.Proc.), pages 75–84, 1998. [10] W.S. Lee, M. Escher, G. Sannier, N. Magnenat-Thalmann. MPEG-4 compatible faces from orthogonal photos. in Proceedings on Computer Animation’99, pages 186–194, May 1999. [11] F. Lavagetto e R. Pockaj. The Facial Animation Engine: Towards a High-Level Interface for Design of MPEG-4 Compliant Animated Faces. IEEE Transaction on Circuits and Systems for Video Technology, pages 277–289, 1999. [12] L. Moccozet, N. Magnenat-Thalmann . Dirichlet free-form deformation and their application to hand simulation. Computer Animation 97, pages 93–102, 1997. [13] F. Ulgen. A Step Toward Universal Facial Animation via Volume Morphing. 6th IEEE International Workshop on Robot and Human communication, pages 358–363, 1997. [14] K. Kahler, J. Haber, H. Yamauchi, H.P. Seidel. Head shop: Generating animated head models with anatomical structure. In Proc. ACM SIGGRAPH Symposium on Computer Animation (SCA ’02)), pages 55–64, 2002. [15] D. Fidaleo, J. Noh, T. Kim, R. Enciso, U. Neumann. Classification and volume morphing for performance driven facial animation. International Workshop on Digital and Computational Video, 2000. [16] Y. Lee, D. Terzopoulis, K. Waters. Realistic modeling for facial animation. in SIGGRAPH 95 Conference Proceedings, pages 55–62, 1995. 87 BIBLIOGRAFIA [17] Yuencheng Lee and Demetri Terzopoulos and Keith Walters. Rea- listic modeling for facial animation. Computer Graphics, 29(Annual Conference Series):55–62, 1995. [18] Yuencheng Lee and Demetri Terzopoulos and Keith Walters. Constructing physics-based facial models of individuals. Proceedings of Graphics Interface ’93, pages 1–8, 1993. [19] P. Debevec, T. Hawkins, C. Tchou, H.P. Duiker, W. Sarokin e M. Sagar. Acquiring the reflectance field of a human face. In Siggraph 2000, Computer Graphics Proceedings, pages 145–156, 2000. [20] C. Rocchini , P. Cignoni, C. Montani, R. Scopigno . Multiple textures stitching and blending on 3D objects. in Proceedings of the 10th Eurographics Workshop on Rendering, pages 127–138, 1999. [21] D. Piponi , G. Borshukov . Seamless texture mapping of subdivision surfaces by model pelting and texture blending. in SIGGRAPH Conference Proceedings, pages 471–478, 2000. [22] P. J. Burt and Edward H. Adelson. A multiresolution spline with application to image mosaics. ACM Transactions on Graphics, 2(4):217–236, 1983. [23] M. Tarini, H. Yamauchi, J. Haber, and H.-P. Seidel. Texturing faces. In Proceedings Graphics Interface 2002, pages 89–98, 2002. [24] Moving Pictures Expert Group. MPEG-4 International standard. ISO/IEC 14496. URL: www.cselt.it/mpeg, December May 2002. [25] S. Fang, R. Raghavan. Volume morphing methods fro landmark-based 3D image deformation. SPIE Int. Symp. on Medical Imaging, CA, 1996. [26] M. Tarini , K. Hormann , P. Cignoni , C. Montani. Polycube-maps. ACM Transactions on Graphics, 23(3):853–860, 2004. 88 BIBLIOGRAFIA [27] FLTK. Fast Light Toolkit Manual. URL: http://www.fltk.org. [28] Visage Technologies AB. URL: www.visagetechnologies.com. [29] K. Anjyo, Y. Usami, and T. Kurihara. A simple method for extracting the natural beauty of hair. In SIGGRAPH 92 Conference Proceedings, pages 111–120, July 1992. [30] Y. Watanabe and Y. Suenaga. A trigonal prism-based method for hair image generation. IEEE Computer Graphics and Applications, 12(1):47– 53, January 1992. 89 Appendice A OpenGL e cubemap In questa appendice mostriamo come sia possibile realizzare il meccanismo del cube mapping attraverso OpenGL. Ricordiamo che OpenGL è una libreria grafica, cioè un insieme di funzioni richiamabili da una programma che consente di produrre su un display immagini di oggetti tridimensionali. OpenGL supporta il meccanismo delle cube map attraverso l’estensione EXT texture cube map. Tale estensione introduce un nuovo tipo di texture, la cube map che va ad affiancarsi ai tipi di texture già esistenti: 1D, 2D, 3D. Ado gni tipo di texture viene associato un target che ne specifica il tipo: nel caso delle cube map alle varie funzioni quali glBindTexture, glTexParameter, glEnable viene passato il target GL TEXTURE CUBE MAP EXT. Poichè le cube map sono costituite da sei facce, il loro utilizzo richiede la chiamata della funzione glTexImage2D per sei volte indicando di volta in volta il target corrispondente a ciascuna delle sei facce del cubo. Mostriamo il codice necessario: glTexImage2D(GL TEXTURE CUBE MAP POSITIVE X, 0, GL RGBA, imageSize, imageSize, 0, GL RGBA, GL UNSIGNED BYTE, image1); glTexImage2D(GL TEXTURE CUBE MAP NEGATIVE X, 0, GL RGBA, imageSize, imageSize, 0, GL RGBA, GL UNSIGNED BYTE, image4); glTexImage2D(GL TEXTURE CUBE MAP POSITIVE Y, 0, GL RGBA, 90 imageSize, imageSize, 0, GL RGBA, GL UNSIGNED BYTE, image2); glTexImage2D(GL TEXTURE CUBE MAP NEGATIVE Y, 0, GL RGBA, imageSize, imageSize, 0, GL RGBA, GL UNSIGNED BYTE, image5); glTexImage2D(GL TEXTURE CUBE MAP POSITIVE Z, 0, GL RGBA, imageSize, imageSize, 0, GL RGBA, GL UNSIGNED BYTE, image3); glTexImage2D(GL TEXTURE CUBE MAP NEGATIVE Z, 0, GL RGBA, imageSize, imageSize, 0, GL RGBA, GL UNSIGNED BYTE, image6); Ogni texture della cube map deve avere l’altezza e la larghezza potenza di due e deve avere le stesse dimensioni delle altre. A causa della presenza di sei texture, il mapping tra le coordinate texture e la posizione sulla cube map è più complicata rispetto alla gestione delle texture tradizionali. Per determinare quale texture e quale texel mappare, la coordinata texture (s,t,r) è usata come un vettore direzione 3D emanato dal centro del cubo per selezionare una faccia particolare a seconda di quale tra (s,t,r) abbia il valore assoluto maggiore. Una nuova coordinata 2D(s’,t’) viene quindi individuata dividendo le due rimanenti coordinate per la coordinata con il valore maggiore.(s’,t’) viene usata infine per determinare il texel nella texture selezionata. Usualmente si utilizzano dei metodi di generazione delle coordinate texture automatici offerti da OpenGL: GL REFLECTION MAP particolarmente adatto per l’environment mapping e GL NORMAL MAP per la riflessione diffusa. Nel nostro caso invece, utilizzando la cube map come semplice metodo di texturizzazione, è necessario calcolare e specificare le coordinate texture esplicitamente nella seguente maniera: glTexCoord3f(s,t,r) glVertex3f(x,y,z). Particolare attenzione deve essere dedicata in questa fase alla relazione tra coordinate texture e coordinate del cubo. Riferendosi alla figura: Al vertice (u, v, 1.0) del piano frontale corrisponde la coordinata texture (u, −v, 1.0) e le istruzioni : 91 Fig. A.1: cube mapping glTexCoord3f(u, −v, 1.0f ); glVertex3f(u, v, 1.0f ). Al vertice (−1.0, u, v) del piano laterale sinistro corrisponde la coordinata texture (−1.0, −u, v) e le istruzioni : glTexCoord3f(−1.0, −u, v); glVertex3f(−1.0, u, v). Al vertice (1.0, u, v) del piano laterale destrp corrisponde la coordinata texture (1.0, −u, v) e le istruzioni : glTexCoord3f(1.0f, −u, v); glVertex3f(1.0f, u, v). Al vertice (u, 1.0, v) del piano superiore corrisponde la coordinata texture (u, 1.0, v) e le istruzioni : glTexCoord3f(u, 1.0f, v); glVertex3f(u, 1.0f, v). Al vertice (u, −1.0, v) del piano inferiore corrisponde la coordinata texture (u, 1.0, v) e le istruzioni : glTexCoord3f(u, 1.0, v); glVertex3f(u, −1.0, v). Al vertice (u, v, −1.0) del piano posteriore corrisponde la coordinata 92 texture (u, v, −1.0) e le istruzioni : glTexCoord3f(u, v, −1.0f ); glVertex3f(u, v, −1.0f ). 93 Appendice B Risoluzione sistema tramite fattorizzazione LU Il sistema lineare impostato nel capitolo 3 per la determinazione della funzione di interpolazione, viene risolto tramite la fattorizzazione LU: un metodo diretto che permette calcolare la soluzione di sistemi di equazioni lineari della forma Ax = b. La fattorizzazione LU è una particolare scomposizione: A = LU tale che L sia triangolare inferiore ed U triangolare superiore. Il sistema lineare quindi diventa: Ax = b LU x = b dunque, ponendo U x = y, la soluzione x è facilmente ottenibile risolvendo in sequenza due sistemi lineari più semplici: Ly = b, U x = y Si dimostra che, se realizzabile, l’algoritmo di eliminazione di Gauss senza strategia di pivoting realizza proprio la fattorizzazione A = LU , con L a diagonale unitaria e con U uguale alla matrice triangolare superiore finale. Nel caso di pivoting parziale entra in gioco una matrice P detta di permutazione, 94 che effettua gli scambi delle righe di A in corrispondenza degli elementi pivot scelti durante l’algoritmo. La fattorizzazione dunque realizza LU = P A. In sostanza si sta risolvendo il sistema equivalente: P Ax = P b Questa fattorizzazione ha un costo di O(n3 /3) mentre la soluzione dei due sistemi Ly = P T b e U x = y usando gli algoritmi di sostituzione in avanti e all’indietro costa O(n2 ). La fattorizzazione LU è particolarmente utile nel caso in cui si debbano risolvere più sistemi lineari, in cui la matrice dei coefficienti è sempre la stessa e cambia solo il vettore dei termini noti. 95