• Non ci sono risultati.

5.2 Moduli software sviluppati

5.2.1 Modulo di acquisizione

Esistono già programmi open source disponibili per l’acquisizione con il sensore Kinect V2. L’implementazione di uno specifico modulo è motivata dalla necessità di introdurre caratteristiche specifiche per le due applicazioni di ricostruzione sviluppate durante la tesi: minimizzare i tempi di acquisizione e possibilità di avere un riscontro visivo della regione di scena in acquisizione.

Nell’ambito della ricostruzione di una scena del crimine elementi fondamentali sono infatti il tempo impiegato per l’acquisizione delle nuvole e la semplicità di

utilizzo del sistema. É necessario infatti che questo tipo di operazione sia fatta nel minor tempo possibile, in modo da non intralciare gli altri operatori coinvolti nel rilievo. Nello specifico, la maggior parte dei software disponibili non ha la possibilità di acquisire in modo continuo le nuvole di punti rilevate dal Kinect, ma viene eseguita una singola acquisizione cliccando con il mouse un particolare pulsante. In questo modo, l’acquisizione di un dataset di nuvole che comprende l’intera stanza risulta dispendioso in termini di tempo e oltre che di non semplice esecuzione.

Il secondo requisito necessario per un buon programma di acquisizione è la possibilità di avere un riscontro sull’area di scena che si sta acquisendo in quel momento. Questo offre la possibilità di verificare immediatamente che tutta la scena che si intende acquisire venga effettivamente e correttamente scandita.

Il software di acquisizione, dunque, è stato sviluppato con lo scopo di mi- nimizzare i tempi dovuti all’acquisizione, potendo avere un riscontro visivo della regione di scena che si sta acquisendo.

Come già discusso il software è sviluppato per un sistema operativo Ubuntu. Mentre in Windows esistono programmi che restituiscono una nuvola di punti colorata, in Ubuntu è unicamente possibile ricavare dal Kinect V2 singolarmente le immagini a colori, le immagini IR e le immagini di profondità. Per ricavare queste informazioni sono state utilizzate delle librerie open source chiamate "libfreenect2". Per lo sviluppo del software è stato necessario convertire l’immagine di profon- dità in nuvola di punti e proiettare su di essa il colore acquisito dalla telecamera RGB, ottenendo così una nuvola di punti colorata. La proiezione è stata effettuata basandosi sulla matrice di proiezione del modello di camera pinhole definita nel paragrafo 1.3.1.

Dopo aver giustificato la necessità di implementare un nuovo software, si passa alla descrizione dell’interfaccia e delle funzionalità.

L’interfaccia utente è strutturata in due finestre. La prima consiste in un visualizzatore di nuvole di punti disponibile nelle librerie PCL che ha lo scopo di permettere all’utente di rendersi conto di cosa sta acquisendo. Nella parte bassa del visualizzatore, in modo da non interferire con la visualizzazione della scena, sono stati inseriti il numero di nuvole acquisite nella sessione corrente ed il numero di frame al secondo a cui sta funzionando il sistema. Questi due informazioni sono utili all’utente in quanto è possibile stimare la memoria utilizzata per la sessione, sapendo che ogni nuvola di punti acquisita con il Kinect V2 e in formato Point Cloud Data (PCD), utilizzato dalle librerie PCL, pesa circa 7 MB.

La seconda finestra, visibile in figura 5.2 consiste in una serie di pulsanti utilizzati per gestire il visualizzatore ed il salvataggio delle nuvole di punti.

Nella schermata sono identificabili tre aree. La prima area è composta da quat- tro pulsanti. Inizialmente il visualizzatore è spento. Con il tasto "play" il software

Figura 5.2: Schermata principale del software di acquisizione.

cerca la presenza di un Kinect V2 collegato al computer, ricava i parametri della matrice di proiezione e incomincia una visualizzazione continuamente aggiornata delle nuvole di punti acquisite. A questo punto premendo il pulsante "Rec", il programma crea, nel percorso identificato dalla seconda area, una sottocartella, il cui nome è composto dalla data e ora corrente, e salva in essa le nuvole che il sensore acquisisce, alla velocità impostata. Il tasto "pause" permette di fermare unicamente il salvataggio mentre il tasto "stop" ferma anche la visualizzazione. Cliccando il tasto "rec" dopo il tasto "stop" si crea una nuova sottocartella, inizian- do così una nuova sessione di acquisizione. Pur avendo una interfaccia semplice, l’implementazione di questo codice ha richiesto un importante lavoro.

Innanzitutto è necessario rilevare il Kinect V2, creare due canali listener che ricevono i dati di colore e profondità e ricavare i parametri di proiezione che iden- tificano la telecamera, immagazzinati nella telecamera stessa. Una volta recuperati i parametri, tramite le formule descritte nel paragrafo 1.3.1, vengono proiettate le informazioni di colore sull’informazione profondità ricavando così una nuvola di punti colorata.

Il problema che ha richiesto un maggiore studio però non è risultato l’estra- zione di nuvole di punti dal sensore. Analizzando la struttura di un visualizzatore che si aggiorna continuamente all’arrivo di una nuova nuvola, è possibile intuire come questo sia necessariamente una funzione iterativa che aspetta l’acquisizione, la riceve, la salva e di conseguenza si aggiorna. Una volta entrato in questo loop è necessario controllare, tramite i comandi descritti, l’uscita da questa funzione. Questi, però, non risultano essere più selezionabile poiché il processo è impegnato. Il problema è stato risolto utilizzando quello che in informatica è definito come

multithreading. Un thread è una sequenza di istruzioni di un programma in corso

di esecuzione. Nelle architetture a processore singolo, quando la CPU esegue al- ternativamente istruzioni di thread differenti, si parla di multithreading a divisione di tempo: la commutazione fra i thread avviene di solito tanto frequentemente da dare all’utente l’impressione che tutti i task siano eseguiti contemporaneamen- te. Nelle architetture multi-processore i thread vengono invece realmente eseguiti

contemporaneamente cioè in parallelo, ciascuno su un distinto core. Si è spostata tutta la parte di codice che riguarda la visualizzazione e il salvataggio di nuvole in un thread appositamente creato con alta priorità. In questo modo le funzioni chiamate dai pulsanti di comando si trovano in un diverso sottoprocesso rispetto al visualizzatore, e risultano quindi selezionabili. Le funzioni "play", "stop" e "pause" cambiano delle variabili globali del software utilizzate da entrambi i sottoprocessi e grazie ad esse è possibile determinare la visualizzazione e il salvataggio delle nuvole.

Documenti correlati