Progettazione di un sistema di tracking multicamera Corso di Elaborazione immagini e video Corso di Laurea Specialistica in Linguaggi e Tecnologie dei Nuovi Media Università degli Studi di Udine, sede di Pordenone Loris Tissino, Martin Debernardi Slavic settembre 2008 Pagina 1 Progettazione di un sistema di tracking multicamera 1. Introduzione Una parte interessante del lavoro nel campo della visione artificiale ha a che fare con il tema del tracking, ovvero della localizzazione su di una mappa, con coordinate del mondo reale, di uno o più oggetti in movimento ripresi da telecamere. Con questa relazione intendiamo presentare la nostra esperienza di prototipizzazione di un sistema di tracking basato sulle riprese di più videocamere. L'obiettivo che ci siamo posti è stato di realizzare un'applicazione concreta e funzionante, ampiamente configurabile, in grado di determinare (con un buon livello di affidabilità) le coordinate di una persona in movimento, nonché la sua velocità e direzione, in modo da poter generare un file informativo da utilizzare in un programma di grafica 3D per la ricostruzione del movimento in digitale. L'applicazione e il lavoro di supporto sono stati realizzati congiuntamente, anche se con una suddivisione dei compiti per motivi di efficienza e specializzazione. Ad ogni buon conto, riportiamo in Appendice (6.1) un elenco delle attività concretamente svolte da ciascuno di noi. 1.1. Le riprese di esempio Le sequenze video di esempio utilizzate per il progetto sono state riprese sfruttando due delle telecamere del sistema di videosorveglianza installate presso l'edificio del Consorzio di Pordenone per la formazione superiore, gli studi univesitari e la ricerca1. Si tratta di telecamere PIH0542 day&night con risoluzione di 440mila pixel su 480 linee tv2 (vedi sotto). Illustrazione 1: Telecamera PIH0542 Sono poste nel corridoio dell'ambiente seminterrato dell'edificio, una vicino alle scale, l'altra in un angolo, ad un'altezza di poco più di due metri. La loro posizione e il loro angolo di ripresa sono visibili sotto, nella Illustrazione 2: Mappa con posizione telecamere). 1 http://www.unipordenone.it 2 http://www.sicherheit-nach-mass.de/2005/katalog2008/06.Videotechnik.pdf Pagina 2 Illustrazione 2: Mappa con posizione telecamere A titolo di esempio, riportiamo due fotogrammi senza soggetti in movimento ripresi dalle due telecamere. Illustrazione 3: Fotogramma dalla prima telecamera Pagina 3 Progettazione di un sistema di tracking multicamera Illustrazione 4: Fotogramma dalla seconda telecamera 1.2. Obiettivi e vincoli per l'esercitazione Dopo aver effettuato le riprese e analizzato sommariamente i dati a disposizione, abbiamo definito i seguenti obiettivi: 1. permettere la calibrazione delle telecamere, almeno per quanto riguarda l'ottenimento della matrice omografica secondo il modello pin-hole; 2. individuare nei diversi fotogrammi dei filmati prodotti dalle telecamere i blob relativi agli oggetti in movimento; 3. per ogni blob di dimensione superiore ad una costante da determinare, individuare le coordinate nel mondo reale di un punto corrispondente alla base del rettangolo di ingombro dello stesso; 4. stimare la distanza dalla telecamera, nel mondo reale, del punto mappato; 5. stimare, in base alla lunghezza focale della telecamere, l'altezza reale della persona corrispondente; 6. plottare sulla mappa il punto corrispondente, nel caso in cui l'altezza stimata risulti superiore ad un valore determinato; 7. individuare un metodo per evitare di plottare punti sulla mappa in zone fuori dal campo di visione della telecamera; 8. individuare un metodo per assegnare diversi livelli di priorità alle telecamere, da utilizzare nel caso in cui un soggetto risulti ripreso contemporaneamente da più di una; 9. individuare un metodo per effettuare uno smoothing dei dati relativi al movimento della persona, in modo da neutralizzare, per quanto possibile, il rumore dato dai riflessi, dalle ombre, ecc. 10. produrre un file di testo in formato BVH che riporti posizione e direzione della persona in movimento, fotogramma per fotogramma, in modo da poter utilizzare questi dati in ambito di grafica 3D; 11. realizzare un'applicazione configurabile con file esterni in formato XML, in modo da poter impostare diversi scenari di elaborazione. Al fine di semplificare un po' il lavoro, abbiamo concordato le seguenti limitazioni: 1. lavorare su filmati statici, anziché su riprese dal vivo; 2. gestire una sola persona in movimento per ogni filmato; Pagina 4 3. evitare spostamenti di oggetti nell'ambito della scena, cambi di illuminazione e tutto ciò che potesse costringere ad aggiornare lo sfondo; 4. considerare la telecamera come operante secondo il modello pin-hole, evitando di prendere in considerazione gli effetti della distorsione ottica causata dalle lenti; 5. concentrarci sugli aspetti funzionali dell'applicazione, piuttosto che sull'interfaccia grafica. 1.3. Le riprese Le riprese di esempio sono state effettuate sfruttando le attrezzature del Consorzio per gli studi universitari e quelle a disposizione del Corso di laurea. Ne abbiamo effettuate due, una con un movimento semplice (una persona scende dalle scale, percorre tutto il corridoio rimanendo sempre visibile, torna indietro ed esce dalla porta) e l'altra con un movimento leggermente più complicato da gestire (una persona entra dalla porta, percorre il corridoio, entra in una zona non visibile, torna indietro ed esce salendo le scale; per combinazione, nel momento in cui la persona ripresa è in una zona non visibile, appare in altra area una seconda persona, ripresa solo parzialmente). Le sequenze video sono state riprese con un ciak di sincronizzazione e sono state successivamente elaborate per: 1. tagliare le parti prima dell'ingresso della persona nel corridoio e dopo la sua uscita; 2. ridimensionare i fotogrammi (dal formato PAL 720x576 ad un formato più piccolo e più facilmente gestibile, ossia 360x288), con implicito effetto di deinterlacciamento; 3. codifica in un formato compatibile con la libreria OpenCV (in particolare, è stato usato il formato AVI in formato uncompressed RGB24). Pagina 5 Progettazione di un sistema di tracking multicamera 2. Lo sviluppo dell'applicazione Una parte rilevante del nostro lavoro è consistita nello sviluppo del prototipo di un'applicazione in grado di mostrare il percorso di una persona in movimento all'interno dell'ambiente preso in considerazione, avendo come input le riprese effettuate da diverse telecamere. 2.1. Strumenti di sviluppo impiegati Abbiamo scritto il programma in C++ utilizzando l'ambiente di sviluppo Microsoft Visual Studio 2005, in conformità con quanto si usa presso l'Artificial Vision and Real-Time System Laboratory dell'Università di Udine3. Il programma sfrutta le potenti funzioni delle librerie OpenCV (OpenSource Computer Vision), il cui utilizzo primario è collegato alla visione artificiale4, nonché la libreria FlexibleParser di Michael Chourdakis5 per la lettura dei file di configurazione XML. 2.2. Funzionalità e limiti dell'applicazione L'applicazione che abbiamo sviluppato consente di: 1. calibrare una telecamera mediante l'individuazione in via grafica di coppie di punti sul fotogramma e sulla mappa e il successivo calcolo della matrice omografica da utilizzare; 2. testare la matrice omografica ottenuta in maniera interattiva, selezionando un punto sul fotogramma e vedendo dove lo stesso punto viene mappato; 3. leggere file di configurazione XML contenenti le informazioni sulle telecamere coinvolte, la mappa, le opzioni scelte ecc. (vedi Appendice 6.2); 4. avviare la riproduzione delle sequenze video, con individuazione dei blob, stima della posizione e delle dimensioni nel mondo reale, scelta della telecamera “dominante”, stima di velocità e direzione; 5. mettere in pausa il flusso video, in modo da permettere una migliore analisi del funzionamento dell'applicazione; 6. salvare i singoli fotogrammi; 7. produrre come output un file di testo in formato BVH da utilizzare in ambienti di grafica 3D; 8. usare un numero arbitrario di telecamere, compatibilmente con le capacità hardware (è necessaria però una semplice modifica del valore di una costante e la ricompilazione). Di alcuni aspetti non ci siamo curati per motivi di tempo. In particolare: 1. i controlli sul file di input in formato XML non sono accuratissimi; 2. il processo di calibrazione non portare alla predisposizione completa di un file di configurazione XML, considerando anche aspetti quali l'individuazione della soglia ottimale di binarizzazione dell'immagine (vedi paragrafo 4.2), la stima della lunghezza focale, la predisposizione delle mappe sfumate da utilizzare come maschere (vedi paragrafo 4.3) ecc., e quindi è necessario un po' di lavoro manuale da parte dell'utente (peraltro non particolarmente difficile) per una configurazione completa; 3. manca la documentazione sull'uso (se si eccettua questa relazione); 4. l'interfaccia utente non è particolarmente curata. 3 http://avires.dimi.uniud.it/ 4 http://opencvlibrary.sourceforge.net/ 5 http://www.codeproject.com/KB/recipes/FlexibleParser.aspx Pagina 6 3. La calibrazione La calibrazione è il processo con cui si stimano i parametri intrinseci (lunghezza focale, centro ottico, dimensione dei pixel, coefficienti di distorsione ecc.) ed estrinseci (angoli di rotazione, posizione rispetto ad un sistema di coordinate globale ecc.) di una telecamera che porta ad ottenere una relazione tra le coordinate di un punto sul piano fotogramma e quelle di un punto nel mondo reale. 3.1. Cenni teorici Per il nostro lavoro abbiamo effettuato la calibrazione delle telecamere calcolando una matrice, detta matrice omografica, che consente di effettuare la trasformazione proiettiva richiesta con un semplice prodotto tra matrici. Illustrazione 5: Omografia determinata dalla corrispondenza di quattro punti In questo genere di problemi, visto che servono otto parametri indipendenti per definire l'omografia e che ogni corrispondenza tra punti fornisce due equazioni, è sufficiente mappare su un fotogramma campione e sulla mappa del mondo reale le corrispondenze di quattro punti per ottenere la matrice omografica 6. Se le corrispondenze sono in numero maggiore, si può usare il metodo dei minimi quadrati per trovare la matrice che meglio approssima quella teoricamente corretta. 3.2. La funzione cvFindHomography Operativamente, per effettuare la calibrazione abbiamo utilizzato la funzione cvFindHomography fornita dalla libreria OpenCv. Ne illustriamo di seguito il funzionamento con un esempio non interattivo. CvPoint2D32f cvsrc[4]; CvPoint2D32f cvdst[4]; // array dei punti sul fotogramma // array dei punti sulla mappa // le coordinate vengono rapportate alle dimensioni delle immagini cvsrc[0].x=(float)233/(float)360; cvsrc[0].y=(float)59/(float)288; cvsrc[1].x=(float)304/(float)360; cvsrc[1].y=(float)271/(float)288; cvsrc[2].x=(float)36/(float)360; cvsrc[2].y=(float)154/(float)288; cvsrc[3].x=(float)175/(float)360; cvsrc[3].y=(float)106/(float)288; cvdst[0].x=(float)4/(float)584; cvdst[0].y=(float)32/(float)360; cvdst[1].x=(float)176/(float)584; cvdst[1].y=(float)278/(float)360; cvdst[2].x=(float)6/(float)584; cvdst[2].y=(float)294/(float)360; cvdst[3].x=(float)43/(float)584; cvdst[3].y=(float)198/(float)360; CvMat *hm = cvCreateMat(3,3,CV_32FC1); // matrice omografica CvMat *src_mat = cvCreateMat(4, 2, CV_32FC1); CvMat *dst_mat = cvCreateMat(4, 2, CV_32FC1); // matrice dei punti sul fotogramma // matrice dei punti sulla mappa // copiamo i punti dagli array alle due matrici cvSetData(src_mat, cvsrc, sizeof(CvPoint2D32f)); cvSetData(dst_mat, cvdst, sizeof(CvPoint2D32f)); // ricaviamo la matrice omografica cvFindHomography(src_mat, dst_mat, hm); 6 http://profs.sci.univr.it/~fusiello/teaching/visione/appunti_06_02.pdf Pagina 7 Progettazione di un sistema di tracking multicamera // visualizziamo i valori della matrice ottenuta: for (int r=0; r<3; r++) for (int c=0; c<3; c++) printf("Valore in %d, %d: %f\n", r, c, cvmGet(hm,r,c)); È importante notare che le coordinate dei punti del fotogramma e quelle dei punti della mappa vengono rapportate alle dimensione delle rispettive immagini, in modo da essere indipendenti dalla risoluzione delle stesse. Per poter mappare i punti, sarà quindi necessario: 1. rapportare le coordinate di un punto sul fotogramma alla dimensione (larghezza e altezza rispettivamente) del fotogramma stesso; 2. esprimere le stesse in coordinate omogenee, aggiungendo il valore 1 in terza posizione; 3. moltiplicare la matrice omografica inversa (3x3) per la matrice ottenuta al punto precedente (3x1), ottenendo così la matrice 3x1 dei coefficienti relativi alla mappa; 4. dividere il primo e il secondo coeefficiente ottenuti al punto precedente per il terzo; 5. rapportare i due coefficienti ottenuti alla dimensione della mappa in pixel (per plottare un punto) o alla dimensione nel mondo reale della stessa (per stimare distanze e altezze). 3.3. La calibrazione interattiva La nostra applicazione, ispirata dal programma CalibTool scritto dal dott. Claudio Piciarelli, consente di individuare in maniera interattiva, con dei clic del mouse su di un fotogramma e sulla mappa, la matrice omografica. Illustrazione 6: Calibrazione interattiva Dopo aver effettuato l'input (con un minimo di quattro coppie di punti) è possibile passare alla fase di test, basato sull'individuazione di punti sul fotogramma e verifica della corrispondenza sull'immagine della mappa. Pagina 8 Illustrazione 7: Test della calibrazione Il programma fornisce in output un file di testo riportante la matrice omografica ottenuta, da riportare in un file di configurazione XML generale (vedi paragrafo 6.2). All'apertura di un file di configurazione, inoltre, è possibile fare un controllo della matrice omografica per le telecamere impostate basato sulla mappatura di tutti i punti del contorno e delle diagonali dei fotogrammi sfruttando le matrici omografiche ottenute. Illustrazione 8: Controllo della calibrazione L'immagine ottenuta può essere sfruttata come base per impostare le maschere relative alle videocamere (vedi par. 4.3). Pagina 9 Progettazione di un sistema di tracking multicamera 4. Il tracking Risolto il problema della calibrazione, ci siamo concentrati sul nucleo fondamentale del lavoro, ossia sulla tracciatura dei percorsi delle persone in movimento nei nostri filmati d'esempio. 4.1. Generalità sul flusso di elaborazione La parte più rilevante ed interessante dell'applicazione è quella relativa alla gestione del flusso video delle due telecamere, con le conseguenti: 1. individuazione dei blob di oggetti in movimento; 2. determinazione del fatto se il blob debba o meno essere rappresentato; 3. stima della posizione della persona nel mondo reale. Presentiamo di seguito lo schema generale del flusso di elaborazione. while (frameNo < videoLength) { /* ciclo principale per la gestione della sequenza */ // inizializzazione mappa da visualizzare for (cameraNo=0;cameraNo<MAXCAMERAS;cameraNo++) { /* ciclo di gestione delle singole telecamere */ // cattura di un fotogramma per cam[cameraNo] // elaborazione del fotogramma // - sottrazione dello sfondo // - conversione in scala di grigi // - sogliatura // - dilatazione ed erosione // - individuazione dei blob for(blobNo=0 ; contour != 0; contour = contour->h_next, blobNo++) { /* ciclo di gestione dei blob rilevati */ // recupero del rettangolo di ingombro // - determinazione del blob da mappare // - determinazione coordinate nel mondo reale // - determinazione visibilità/priorità if (cam[cameraNo]->priority) { /* se si tratta di un blob visibile */ // stima delle informazioni sul mondo reale // - stima della distanza dalla telecamere // - stima dell'altezza della persona if (estimated_height>minimal_height) { /* se l'altezza stimata è superiore alla desiderata */ // gestione del blob mappato // - inizializzazione del CountDown // - evidenziazione del blob nel fotogramma // - plotting sulla mappa storica // - plotting sulla mappa da visualizzare if (cam[cameraNo]->priority>priority) { /* se in questo punto la telecamera ha priorità alta ce lo segniamo */ } } else { /* blob che non viene mappato */ // - evidenziazione minima del blob nel fotogramma } } Pagina 10 } // decremento della variabile per il CountDown // visualizzazione dell'immagine del fotogramma } /* abbiamo passato in rassegna i fotogrammi di tutte le telecamere */ // determiniamo il CountDown massimo if (maxPersonCountDown>0) { /* c'è una persona da rappresentare sulla mappa */ // determinazione delle coordinate stimate // - push delle coordinate nella coda per le medie mobili // - retrieve delle coordinate (media mobile ultimi valori) // - evidenziazione nelle mappe della posizione stimata // - stima della velocità e della direzione // - rappresentazione nella mappa di velocità e direzione } else // maxPersonCountDown < 0 { /* CountDown terminato, la persona non c'è più */ // azzeramento della coda per le medie mobili } // output per il file BVH // visualizzazione immagine della mappa frameNo++; } 4.2. Individuazione dei blob significativi Per l'individuazione dei blob si è fatto ampio uso delle funzioni fornite dalla libreria OpenCV. In particolare, si è proceduto come segue: 1. sottrazione dello sfondo (cvAbsDiff); 2. conversione della differenza in scala di grigi (cvCvtColor); 3. binarizzazione tramite sogliatura (cvThreshold); 4. dilatazione (cvDilate); 5. erosione (cvErode); 6. rilevamento blob (cvFindContours). Riportiamo a titolo di esempio le immagini relative all'elaborazione di un fotogramma. Pagina 11 Progettazione di un sistema di tracking multicamera Illustrazione 9: Fotogramma originale Illustrazione 10: Differenza rispetto allo sfondo Pagina 12 Illustrazione 11: Conversione in scala di grigi Illustrazione 12: Binarizzazione tramite sogliatura Pagina 13 Progettazione di un sistema di tracking multicamera Illustrazione 13: Dilatazione (una iterazione) Illustrazione 14: Erosione (una iterazione) Pagina 14 Illustrazione 15: Individuazione dei blob Naturalmente, i parametri critici risultano essere la soglia per la binarizzazione e il numero di iterazioni per le operazioni di dilatazione ed erosione. Questi parametri possono essere definiti, per ogni videocamera, nel file di configurazione dell'applicazione. Riportiamo a titolo di esempio le immagini relative agli ultimi tre passaggi con un numero di iterazioni per la dilatazione e l'erosione posto a 10. Come si vede, l'effetto delle operazioni di dilatazione ed erosione è di unire tra loro blob vicini e relativamente piccoli, per formarne uno più grande. Illustrazione 16: Dilatazione (dieci iterazioni) Pagina 15 Progettazione di un sistema di tracking multicamera Illustrazione 17: Erosione (dieci iterazioni) Illustrazione 18: Individuazione del blob 4.3. La mappatura Per ogni blob rilevato, si tratta di: 1. decidere quale punto del rettangolo di ingombro mappare; 2. determinare se il punto mappato va rappresentato o meno. Per quanto concerne il primo problema, abbiamo optato semplicemente per mappare un punto all'interno del rettangolo di ingombro (a metà nel senso della larghezza, e ad una certa percentuale, indicata nel file di configurazione, nel senso dell'altezza). Il punto mappato viene rappresentato con un cerchietto nell'immagine del fotogramma. Pagina 16 Il secondo problema pone invece due interrogativi: 1. sulla mappa il punto comparirebbe in una zona che fa parte del campo di visione della telecamera? Potrebbe infatti accadere che un riflesso o un'ombra sulla parete vengano mappati fuori dal campo di visione della telecamera; 2. il blob individuato corrisponde ad un oggetto reale di dimensioni tali da essere meritevole di rappresentazione? Abbiamo risolto il primo punto predisponendo delle maschere di visualizzazione per le telecamere, che sostanzialmente sono immagini a scale di grigi dove il nero rappresenta la zona fuori dal campo di visione delle telecamera, e i vari livelli di grigio la zona nel campo di visibilità (con il bianco che rappresenta la visibilità completa). Queste stesse mappe, come vedremo più avanti, determinano anche i livelli di priorità delle telecamere per le diverse zone della mappa. Illustrazione 19: Maschera per la prima telecamera Illustrazione 20: Maschera per la seconda telecamera Per il secondo punto, abbiamo calcolato la distanza del punto mappato dalla telecamera nel mondo reale e successivamente, basandoci sulla lunghezza focale della telecamera, abbiamo stimato l'altezza della persona in movimento. Solo i blob che corrispondono a oggetti in movimento oltre una certa misura (indicabile nel file di configurazione) vengono considerati degni di rappresentazione. La lunghezza focale è stata stimata con un procedimento indiretto (conoscendo l'altezza reale delle persone abbiamo ricostruito la lunghezza focale, che poi abbiamo utilizzato per l'elaborazione). Pagina 17 Progettazione di un sistema di tracking multicamera 4.4. La gestione delle priorità Un problema significativo che ci si è posto è stato l'individuazione di un metodo per determinare cosa fare quando la stessa persona in movimento viene vista contemporaneamente da due telecamere, e magari solo parzialmente da una di esse. Si veda ad esempio il caso illustrato qui di seguito. Come si può osservare, la stessa persona è ripresa interamente dalla prima telecamera e parzialmente dalla seconda. Le coordinate mappate sono diverse per le due telecamere principalmente a causa della ripresa parziale di quest'ultima (potrebbero esserlo comunque, considerando le ombre, i riflessi, le diverse soglie di binarizzazione, le calibrazioni non precisissime ecc.). Illustrazione 21: Gestione delle priorità Ci vengono però in aiuto le immagini delle maschere relative alle due telecamere, in cui per la seconda telecamera è stata rappresentata in grigio la fascia in cui la visione è solo parziale. Ne deriva automaticamente un livello di priorità più basso per la seconda telecamera, le cui informazioni spaziali non saranno quindi prese in considerazione. 4.5. Lo smoothing del percorso tramite medie mobili Una volta individuate le coordinate nel mondo reale della persona in movimento, si tratta di eliminare, per quanto possibile, il rumore introdotto dal procedimento di individuazione dei blob, impreciso per il fatto di avere a che fare con ombre, riflessi ecc. Un semplice procedimento per eliminare il rumore ed ottenere un percorso smussato è di calcolare la media mobile (semplice o ponderata) delle ultime posizioni. Ad esempio, stabilendo di volere una coda di osservazioni di 25 fotogrammi (un secondo), la posizione reale di una persona in movimento verrà calcolata come media delle ultime 25 posizioni rilevate. Utilizzando il procedimento della media mobile ponderata, si dà più peso all'ultima rilevazione e via via meno peso alle precedenti. In pratica, con una coda di N elementi, si moltiplica l'ultimo valore osservato per N, il penultimo per N-1 ecc., dividendo poi la somma dei prodotti per la somma dei pesi N*(N+1)/2. Naturalmente esiste un trade-off tra uno smoothing sufficientemente corretto, che richiede una coda di dimensione relativamente elevata (di almeno 50 elementi) e una velocità adeguata di rappresentazione della posizione della persona sulla mappa. Utilizzando le medie mobili si “rimane indietro” per un tempo corrispondente alla dimensione della coda. Si confrontino ad esempio i percorsi delle immagini seguenti, ottenuti con medie mobili delle ultime 75 e delle ultime 12 posizioni. Pagina 18 Illustrazione 22: Percorso con media mobile di 75 valori Illustrazione 23: Percorso con media mobile di 12 valori Un piccolo problema sorge per la rappresentazione delle ultime posizioni. Se si usa una coda di 75 elementi, che comporta un ritardo di quasi tre secondi, non si riesce a rappresentare le ultime posizioni della persona in movimento, a meno che non le si voglia rappresentare quando la persona non è più visibile. Il file di configurazione permette di impostare questo parametro. Si osservi come viene tracciato il percorso se si decide di tralasciare i valori quando la persona esce dalla zona visibile. Pagina 19 Progettazione di un sistema di tracking multicamera Illustrazione 24: Percorso senza valori finali 4.6. La determinazione di velocità e direzione Per poter effettuare delle elaborazioni di alto livello può essere utile stimare la velocità e la direzione della persona in movimento. Per avere risultati maggiormente attendibili in quanto meno soggetti al rumore, ci siamo basati sui dati derivanti dalle operazioni di smoothing. 4.7. La classe MovingObject Al fine di agevolare le operazioni di gestione della persona in movimento di cui dobbiamo fare il tracking, abbiamo scritto una classe generica MovingObject in grado di gestire: 1. la coda di valori da tenere in considerazione per il calcolo della media mobile; 2. il calcolo della distanza percorsa dall'ultima rilevazione; 3. il calcolo della velocità stimata; 4. il calcolo della direzione stimata. Riportiamo di seguito l'elenco delle funzioni membro pubbliche della classe. class MovingObject { public: int pushCoordinates(float X, float Y); int removeCoordinates(); int setMethod(char m); int setFrameRate(int frameRate); int status(); unsigned long getCount(); int resetCount(); double getCurrentMA_X(); double getCurrentMA_Y(); double getPreviousMA_X(); double getPreviousMA_Y(); double coveredDistance(); double speed(); double direction(); MovingObject(); MovingObject(int queueSize); ~MovingObject(); }; Un esempio d'uso potrebbe essere il seguente: Pagina 20 MovingObject *person = new MovingObject(3); double px, py; person->pushCoordinates(1, 1); person->pushCoordinates(1, 1.10); person->pushCoordinates(1.20, 1.25); px = person->getCurrentMA_X(); py = person->getCurrentMA_Y(); printf("Posizione attuale: %3.2f, %3.2f\n", px, py); px = person->getPreviousMA_X(); py = person->getPreviousMA_Y(); printf("Posizione precedente: %3.2f, %3.2f\n", px, py); printf("Velocità: %3.2fm/s\n", person->speed()); printf("Direzione: %3.2f rad\n", person->direction()); printf("Valori inseriti: %d\n", person->getCount()); person->resetCount(); printf("Valori inseriti: %d\n", person->getCount()); delete person; ... che restituirebbe un output come quello riportato qui sotto: Posizione attuale: 1.07, 1.12 Posizione precedente: 1.00, 1.05 Velocità: 2.36m/s Direzione: 0.79 rad Valori inseriti: 3 Valori inseriti: 0 Pagina 21 Progettazione di un sistema di tracking multicamera 5. La produzione del file BVH e la riproduzione in 3D delle riprese Tra gli obiettivi che ci siamo posti vi è quello di produrre un file BVH a partire dai movimenti rilevati, in modo tale da poter riprodurre i movimenti della persona reale in maniera digitale in un ambiente di grafica 3D. 5.1. Il file BVH Per tracciare il movimento della persona abbiamo deciso di utilizzare il formato di file noto come BVH (Biovision Hierarchical data)7, originariamente sviluppato dalla Biovision e adesso utilizzato in vari programmi di grafica 3D (tra cui 3ds Max, Blender, Maya). Un file BVH è composto di due parti, un'intestazione che descrive la gerarchia (hierarchy) e la posa iniziale dello scheletro e una parte successiva che ne descrive il movimento, con una riga per ciascun fotogramma e l'indicazione delle coordinate, in pollici, degli elementi presenti nella struttura definita e collegati tra loro tramite nodi (joints). La gerarchia è una struttura ad albero, dove ogni diramazione corrisponde ad un nodo. Ad ogni nodo possono essere attribuite funzioni di rotazione, che permetteranno di muovere le diverse articolazioni del soggetto rappresentato. Nel file BVH le funzioni attribuite ai nodi vengono dichiarate con i canali (channels). Essendo le rotazioni pensate in uno spazio tridimensionale, i canali dichiarati sono tre (Z rotation; X rotation; Y rotation). Solo nel caso del nodo principale (il primo) i canali dichiarati sono sei, perché a questo nodo sono vincolati i dati spaziali oltre a quelli rotativi. L’Offset rappresenta lo scostamento dei vari nodi rispetto al nodo principale. Illustrazione 25: Intestazione del file BVH 7 http://www.cs.wisc.edu/graphics/Courses/cs-838-1999/Jeff/BVH.html Pagina 22 Per quanto riguarda la parte Motion, per prima cosa viene scritta la durata del motion capture in forma di frame e la durata di un frame (0,0333... secondi = 30 frame al secondo). Ogni riga corrisponde ad un frame e ogni colonna ad un canale di un nodo. Illustrazione 26: Sezione Motion di un file BVH Per il nostro progetto abbiamo utilizzato esclusivamente i canali di posizione e rotazione del nodo principale (chest). Il programma genera tutto il file BVH, ma copia la parte di intestazione da un file di testo indicato nel file di configurazione. 5.2. Il progetto 3D La ricostruzione dell’ambiente 3D è stata fatta basandosi sulla piantina dell’Università, che è stata importata in 3ds Max e posizionata lungo le assi X e Y dello spazio, facendo coincidere l’angolo superiore sinistro con l’origine. Gli elementi architettonici principali sono stati realizzati usando le funzioni apposite (es. AEC Extended Wall per i muri, Doors-Pivot per le porte, AEC Extended Railing per le scale). Le luci sono composte da cinque riflettori direzionali e tre luci omnidirezionali per creare la luce d’ambiente. Illustrazione 27: Ricostruzione ambiente in 3D Illustrazione 28: Posizionamento riflettori Pagina 23 Progettazione di un sistema di tracking multicamera Oltre alle due telecamere corrispondenti a quelle dell’università, ne abbiamo creata una virtuale che si trova in fondo al corridoio che porta all’aula di Meccatronica. Illustrazione 29: Posizionamento telecamere virtuali La figura 3D in movimento è un oggetto bipede, che rappresenta lo scheletro umano. Su di essa, linkata per posizione e rotazione, è stata posizionata una quarta telecamera. Illustrazione 30: Figura in movimento con telecamera Quando non ci sono informazioni sulla posizione del soggetto, cioè quando non ci sono blob, il soggetto 3D viene collocato in una posizione esterna al locale. In questo punto la telecamera inquadra un oggetto “piano” con una texture testo con la scritta “blob non presente”. Illustrazione 31: Immagine inquadrata in caso di assenza di blob Pagina 24 Riportiamo a titolo di esempio un fotogramma ripreso da una telecamera virtuale ed un fotogramma in soggettiva. Illustrazione 32: Fotogramma da telecamera virtuale Illustrazione 33: Fotogramma da soggettiva virtuale Nel DVD allegato alla relazione sono presenti tutti i filmati ottenuti con le riprese virtuali. Pagina 25 Progettazione di un sistema di tracking multicamera 6. 6.1. Appendici Appendice 1. Suddivisione dei compiti Attività Loris Tissino Martin Debernardi Slavic Riprese video di esempio e transcodifiche x x Definizione del problema e delle specifiche x x Calibrazione delle telecamere x x Elaborazione teorica in merito alla mappatura x x Elaborazione teorica in merito al tracking tramite medie mobili x Definizione delle aree di priorità per le telecamere x Programmazione C++ x x Predisposizione modello 3D x Realizzazione video di ricostruzione digitale della scena x Stesura relazione x Proof-reading relazione x 6.2. Appendice 2. I file di configurazione dell'applicazione Per la configurazione dell'applicazione abbiamo scelto di porre tutte le informazioni rilevanti (calibrazione delle telecamere, sorgenti video, mappe, scelte dell'utente) in file XML, in modo tale da poter predisporre degli scenari da mostrare (con diverse configurazioni già pronte) e di non doverci preoccupare troppo dell'interfaccia utente. Un file di configurazione tipo ha la struttura riportata di seguito. <?xml version="1.0" encoding="UTF-8" standalone="yes" ?> <vss> <camera id="camera 0" mask="maps/map_maskcam0.png" source="videosources/martin_1.avi" hm="0.60084 1.1921 -0.62461 -1.1027 3.6999 0.064835 -0.43476 3.2091 0.70404" pos_h="2.53" pos_x="5.66" pos_y="11.16" focal_length="1.23482" pathcolor="255 127 0" threshold="35" frombottom="15" dilate="10" erode="10" /> <camera id="camera 1" mask="maps/map_maskcam1.png" source="videosources/martin_2.avi" hm="0.003948 -0.01784 0.08179 0.07686 0.02323 -0.004147 0.005405 0.2312 0.01083" pos_h="2.4" pos_x="0.34" Pagina 26 pos_y="1.19" focal_length="2.4369" pathcolor="0 127 255" threshold="80" frombottom="2" dilate="10" erode="10" /> <map id="map1" source="maps/map_videocameras.png" real_size_x="19.06" real_size_y="11.48" pathcolor="255 255 0" info_x="420" info_y="200" /> <config ma_window="75" ma_method="w" ma_follow_to_the_end="n" minimal_height="1.50" /> <bvh headerfile="bvh/bvh_header.txt" outputfile="bvh/martin.bvh" columns=”57” /> </vss> Per ogni videocamera si devono indicare: 1. un identificativo (id); 2. un file video sorgente (source); 3. un file immagine a livelli di grigio da utilizzare come maschera (mask); 4. la matrice omografica da utilizzare (hm); 5. la posizione della telecamera nel mondo reale (in metri), a partire dall'angolo in alto a sinistra della mappa (pos_h, pos_x, pos_y); 6. la lunghezza focale (focal_length); 7. il colore da utilizzare per la rappresentazione dei punti, in formato RGB (path_color); 8. il livello di soglia da utilizzare per la binarizzazione (threshold); 9. la percentuale dell'altezza del rettangolo di ingombro, a partire dal basso, di cui fare il mapping (frombottom); 10. il numero di iterazioni per i processi di dilatazione (dilate) e di erosione (erode). Per la mappa si deve indicare: 1. un identificativo (id); 2. un file immagine sorgente (source); 3. la dimensione corrispondente nel mondo reale (real_size_x e real_size_y); 4. il colore da usare per la rappresentazione del percorso smussato (pathcolor); 5. le coordinate, in pixel, per il box informativo all'interno della mappa (info_x e info_y). Nella sezione di configurazione generale si deve indicare: 1. la dimensione della coda da usare per le medie mobili (ma_window); Pagina 27 Progettazione di un sistema di tracking multicamera 2. il metodo di calcolo delle medie mobili, 'w' per medie mobili ponderate e 's' per medie mobili semplici (ma_method); 3. se si vuole o meno che il percorso venga approssimato fino alla fine, anche per i fotogrammi in cui la persona non è più visibile (ma_follow_to_the_end, che può valere 'y' o 'n'); 4. l'altezza minima, in metri, degli oggetti in movimento che si vogliono rappresentare (minimal_height). Nella sezione relativa al file BVH si deve indicare: 1. il file modello da usare per l'intestazione (headerfile); 2. il percorso del file da produrre (outputfile); 3. il numero di campi per ogni riga di descrizione del movimento (columns). Teniamo a precisare che l'applicazione non effettua grandi controlli sulla validità delle informazioni presenti nel file XML. I risultati che si potrebbero ottenere con dati assenti o non coerenti sono imprevedibili. Tutti i nostri test si sono basati su file XML validi e coerenti. 6.3. Appendice 3. Contenuto del DVD Il DVD-ROM allegato a questo documento contiene quanto descritto qui di seguito. ├───3ds_max │ ├───output (file video generati) │ └───sources (file di progetto) ├───data │ ├───bvh (intestazione standard e esempi di file bvh prodotti) │ ├───images (immagini di esempio) │ ├───maps (mappe dell'ambiente) │ ├───video3ds (file video utilizzati per la comparazione) │ └───videosources (file video utilizzati per l'elaborazione) ├───paper (questa relazione) └───software ├───setup (programma di installazione dell'applicazione) └───sources (progetto, con codice sorgente completo) 6.4. Ringraziamenti Doverosi ringraziamenti per l'aiuto e l'incoraggiamento vanno al dott. Andrea Zanni, al dott. Giovanni Ferrin, al dott. Claudio Piciarelli e, soprattutto, alla dott.ssa Ingrid Visentini, senza la cui preziosa collaborazione iniziale non avremmo saputo come affrontare il lavoro. Pagina 28 Indice generale 1. Introduzione..............................................................................................................................................................2 1.1. Le riprese di esempio.......................................................................................................................................2 1.2. Obiettivi e vincoli per l'esercitazione..............................................................................................................4 1.3. Le riprese..........................................................................................................................................................5 2. Lo sviluppo dell'applicazione...................................................................................................................................6 2.1. Strumenti di sviluppo impiegati.......................................................................................................................6 2.2. Funzionalità e limiti dell'applicazione............................................................................................................6 3. La calibrazione..........................................................................................................................................................7 3.1. Cenni teorici.....................................................................................................................................................7 3.2. La funzione cvFindHomography.....................................................................................................................7 3.3. La calibrazione interattiva...............................................................................................................................8 4. Il tracking................................................................................................................................................................10 4.1. Generalità sul flusso di elaborazione............................................................................................................10 4.2. Individuazione dei blob significativi..............................................................................................................11 4.3. La mappatura.................................................................................................................................................16 4.4. La gestione delle priorità...............................................................................................................................18 4.5. Lo smoothing del percorso tramite medie mobili..........................................................................................18 4.6. La determinazione di velocità e direzione.....................................................................................................20 4.7. La classe MovingObject.................................................................................................................................20 5. La produzione del file BVH e la riproduzione in 3D delle riprese........................................................................22 5.1. Il file BVH......................................................................................................................................................22 5.2. Il progetto 3D.................................................................................................................................................23 6. Appendici................................................................................................................................................................26 6.1. Appendice 1. Suddivisione dei compiti..........................................................................................................26 6.2. Appendice 2. I file di configurazione dell'applicazione................................................................................26 6.3. Appendice 3. Contenuto del DVD..................................................................................................................28 6.4. Ringraziamenti...............................................................................................................................................28 Pagina 29 Progettazione di un sistema di tracking multicamera Indice delle illustrazioni Illustrazione 1: Telecamera PIH0542...........................................................................................................................2 Illustrazione 2: Mappa con posizione telecamere........................................................................................................3 Illustrazione 3: Fotogramma dalla prima telecamera...................................................................................................3 Illustrazione 4: Fotogramma dalla seconda telecamera...............................................................................................4 Illustrazione 5: Omografia determinata dalla corrispondenza di quattro punti...........................................................7 Illustrazione 6: Calibrazione interattiva.......................................................................................................................8 Illustrazione 7: Test della calibrazione.........................................................................................................................9 Illustrazione 8: Controllo della calibrazione................................................................................................................9 Illustrazione 9: Fotogramma originale.......................................................................................................................12 Illustrazione 10: Differenza rispetto allo sfondo........................................................................................................12 Illustrazione 11: Conversione in scala di grigi...........................................................................................................13 Illustrazione 12: Binarizzazione tramite sogliatura....................................................................................................13 Illustrazione 13: Dilatazione (una iterazione)............................................................................................................14 Illustrazione 14: Erosione (una iterazione).................................................................................................................14 Illustrazione 15: Individuazione dei blob...................................................................................................................15 Illustrazione 16: Dilatazione (dieci iterazioni)...........................................................................................................15 Illustrazione 17: Erosione (dieci iterazioni)...............................................................................................................16 Illustrazione 18: Individuazione del blob...................................................................................................................16 Illustrazione 19: Maschera per la prima telecamera...................................................................................................17 Illustrazione 20: Maschera per la seconda telecamera...............................................................................................17 Illustrazione 21: Gestione delle priorità.....................................................................................................................18 Illustrazione 22: Percorso con media mobile di 75 valori..........................................................................................19 Illustrazione 23: Percorso con media mobile di 12 valori..........................................................................................19 Illustrazione 24: Percorso senza valori finali.............................................................................................................20 Illustrazione 25: Intestazione del file BVH................................................................................................................22 Illustrazione 26: Sezione Motion di un file BVH.......................................................................................................23 Illustrazione 27: Ricostruzione ambiente in 3D.........................................................................................................23 Illustrazione 28: Posizionamento riflettori.................................................................................................................23 Illustrazione 29: Posizionamento telecamere virtuali................................................................................................24 Illustrazione 30: Figura in movimento con telecamera..............................................................................................24 Illustrazione 31: Immagine inquadrata in caso di assenza di blob.............................................................................24 Illustrazione 32: Fotogramma da telecamera virtuale................................................................................................25 Illustrazione 33: Fotogramma da soggettiva virtuale.................................................................................................25 Pagina 30