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
Scarica

relazione