Per iniziare la definizione, la ricostruzione è un modello 3D di un oggetto sviluppato sulla base dell’elaborazione di dati a lungo raggio. La ricostruzione può essere eseguita utilizzando una grande varietà di principi: stereometrico, stereofotometrico, rimozione del volume o dati di movimento.

Questo lavoro è una guida che spiega come sviluppare una semplice applicazione per ricostruire la forma di un oggetto utilizzando la GPU, cioè una scheda video.

Tra i principi sopra menzionati, abbiamo scelto l’algoritmo di rimozione del volume, suggerito da Brian Cureless e Mark Levoy nel loro articolo intitolato “A Volumetric Method for Building Complex Models from Range Images”.

La figura sottostante chiarisce il principio di base dell’algoritmo. L’oggetto da ricostruire da un insieme di immagini è mostrato sulla sinistra. Quando si elabora un’immagine, l’algoritmo rimuove i punti 3D situati nella parte anteriore dell’oggetto (gli autori hanno applicato la tecnica della luce strutturata per la mappatura della profondità), e oltre. Il risultato della prima elaborazione fotografica è mostrato al centro. Utilizzando i dati ottenuti dalla seconda fotocamera, il programma elimina ulteriori punti 3D. Più angoli vengono utilizzati, più punti 3D aggiuntivi vengono rimossi; alla fine, rimangono solo i punti appartenenti all’oggetto.

Nell’applicazione, implementiamo una versione semplificata dell’algoritmo che elimina solo i punti situati oltre il contorno dell’oggetto nelle immagini. Seguendo l’articolo originale, dividiamo l’intero spazio in un insieme di elementi cubici (voxel).

Per determinare se un voxel appartiene all’oggetto 3D, applichiamo il rendering GPU e abbiniamo la proiezione ottenuta alla silhouette dell’oggetto.

Per ottenere la proiezione, si usa la seguente funzione:

Per spiegare più in dettaglio,

pixelBuffer->makeCurrent () – passa il contenuto del disegno nel buffer QGLPixelBuffer fuori schermo.

Quando si inizializza il buffer di uscita, il clipping, il test di profondità e la miscelazione sono disabilitati, poiché l’unico obiettivo è determinare la posizione spaziale del voxel rispetto all’oggetto.

Dopo aver cambiato il contenuto in HComparator::render, il buffer di uscita viene cancellato e i parametri di proiezione vengono impostati.

Per renderizzare un voxel, viene chiamata la funzione glCallList(voxelList) per eseguire una lista preformata di comandi. La funzione di inizializzazione è:

Dopo il disegno, la posizione spaziale del voxel rispetto all’oggetto è determinata usando la funzione HComparator::compareData.

La funzione compareData copia il contenuto del buffer e lo confronta con la silhouette dell’oggetto in base alle tre possibili opzioni (vedi figura sotto):

a) il voxel è interamente situato all’interno dell’oggetto (codice 1);

b) il voxel appartiene al bordo (codice 2);

c) il voxel è interamente situato oltre l’oggetto (codice 0).

L’insieme degli angoli utilizzati per sviluppare il modello 3D viene elaborato in modo sequenziale dalla funzione HReconstruction::process. Si parte dal presupposto che ognuno dei voxel appartenga all’oggetto. Se la posizione di un voxel è determinata al di fuori dell’oggetto per uno degli angoli, la sua elaborazione si ferma ed esso viene rimosso dal modello. L’intera elaborazione viene effettuata fino a quando tutti gli angoli sono considerati. Alla fine, rimangono solo i voxel appartenenti al modello dell’oggetto.

Per far corrispondere il voxel e la silhouette dell’oggetto, i parametri di proiezione devono essere noti. Essi sono definiti dalle matrici GL_PROJECTION e GL_MODELVIEW (vedi la funzione setGL).

La matrice GL_PROJECTION è definita dai parametri della telecamera, in particolare, la lunghezza focale e la dimensione dell’immagine (la funzione HFrame::loadIntrisicParameters).

La posizione 3D della telecamera può essere determinata utilizzando il marker di realtà aumentata, lo prendiamo dalla libreria aruco. Il marker è un’immagine speciale da stampare su un pezzo di carta (vedi l’immagine qui sotto).

Quando si riprende un oggetto, il marker deve essere tenuto immobile ed entrare nel campo visivo della telecamera in ogni foto dell’oggetto.

La libreria rileva i punti di controllo del marcatore e poi, usando la lunghezza focale della fotocamera, calcola la posizione 3D del marcatore (rvec e tvec).

I parametri rvec e tvec determinano la matrice GL_MODELVIEW (vedi la funzione HFrame::loadExtrisicParameters).

Quindi, abbiamo imparato come proiettare i voxel sul piano dell’immagine, determinare la posizione del voxel rispetto all’immagine dell’oggetto, calcolare i parametri di proiezione, e determinare se il voxel appartiene al volume dell’oggetto, attraverso l’elaborazione dei dati di diverse telecamere; questa è una tecnica semplificata ma completa per ricostruire gli oggetti 3D.

Leave a comment

Il tuo indirizzo email non sarà pubblicato.