For at starte med definitionen er rekonstruktion en 3D-model af et objekt, der er udviklet på grundlag af langdistancedatabehandling. Rekonstruktion kan udføres ved hjælp af en lang række forskellige principper: stereometrisk, stereofotometrisk, volumenfjernelse eller bevægelsesdata.

Dette arbejde er en vejledning, der forklarer, hvordan man udvikler en simpel applikation til rekonstruktion af en objektform ved hjælp af GPU, dvs. et grafikkort.

Men blandt de principper, der er nævnt ovenfor, har vi valgt algoritmen til fjernelse af volumen, som Brian Cureless og Mark Levoy foreslår i deres artikel med titlen “A Volumetric Method for Building Complex Models from Range Images”.

Figuren nedenfor tydeliggør det grundlæggende princip for algoritmen. Det objekt, der skal rekonstrueres ud fra et sæt billeder, er vist til venstre. Ved behandling af et billede fjerner algoritmen de 3D-punkter, der er placeret foran objektet (forfatterne anvendte den strukturerede lysteknik til dybdekortlægningen), og uden for det. Resultatet af den første billedbehandling er vist i midten. Ved hjælp af de data, der er opnået fra det andet kamera, sletter programmet yderligere 3D-punkter. Jo flere vinkler der anvendes, jo flere ekstra 3D-punkter fjernes; til sidst er der kun de punkter tilbage, der hører til objektet.

I programmet implementerer vi en forenklet version af algoritmen, der kun sletter de punkter, der ligger uden for objektets kontur i billederne. I overensstemmelse med den oprindelige artikel opdeler vi hele rummet i et sæt kubiske elementer (voxels).

For at afgøre, om et voxel tilhører 3D-objektet, anvender vi GPU-rendering og matcher den opnåede projektion med objektsilhuetten.

For at få projektionen anvendes følgende funktion:

For at forklare nærmere,

pixelBuffer->makeCurrent () – skifter tegningsindholdet ind i off-screen QGLPixelBuffer-bufferen QGLPixelBuffer.

Når outputbufferen initialiseres, er clipping, dybdeafprøvning og blanding deaktiveret, da det eneste mål er at bestemme voxelens rumlige position i forhold til objektet.

Efter skift af indholdet i HComparator::render ryddes outputbufferen, og projektionsparametrene indstilles.

For at rendere en voxel kaldes funktionen glCallList(voxelList) for at udføre en på forhånd opstillet liste af kommandoer. Initialiseringsfunktionen er:

Efter tegning bestemmes voxelens rumlige position i forhold til objektet ved hjælp af funktionen HComparator::compareData.

Funktionen compareData kopierer bufferindholdet og sammenligner det med objektsilhuetten baseret på de tre mulige muligheder (se figuren nedenfor):

a) voxelen er helt placeret inden for objektet (kode 1);

b) voxelen hører til ved grænsen (kode 2);

c) voxelen er helt placeret uden for objektet (kode 0).

Sættet af vinkler, der anvendes til udvikling af 3D-modellen, behandles sekventielt af funktionen HReconstruction::process. Vi tager udgangspunkt i den antagelse, at hver enkelt voxel hører til objektet. Hvis en voxelplacering bestemmes uden for objektet for en af vinklerne, stopper behandlingen af den, og den fjernes fra modellen. Hele behandlingen udføres, indtil alle vinkler er taget i betragtning. Til sidst er kun de voxler, der hører til objektmodellen, tilbage.

For at matche voxelen og objektsilhuetten skal projektionsparametrene være kendt. De defineres af matricerne GL_PROJECTION og GL_MODELVIEW (se funktionen setGL).

Matricen GL_PROJECTION defineres af kameraets parametre, nærmere bestemt brændvidden og billedstørrelsen (funktionen HFrame::loadIntrisicParameters).

Kameraets 3D-position kan bestemmes ved hjælp af augmented reality-markøren, vi tager den fra aruco-biblioteket. Marker er et specielt billede, der skal udskrives på et stykke papir (se billedet nedenfor).

Når der optages et objekt, skal markøren holdes ubevægelig og komme ind i kameraets synsfelt i hvert af objektbillederne.

Biblioteket registrerer markørens kontrolpunkter og beregner derefter ved hjælp af kameraets brændvidde markørens 3D-position (rvec og tvec).

Parametrene rvec og tvec bestemmer GL_MODELVIEW-matricen (se funktionen HFrame::loadExtrisicParameters).

Så har vi lært at projicere voxeler på billedplanet, bestemme voxelpositionen i forhold til objektbilledet, beregne projektionsparametrene og bestemme, om voxelen tilhører objektvolumenet, ved at behandle data fra flere kameraer; det er en forenklet, men komplet teknik til rekonstruktion af 3D-objekter.

Leave a comment

Din e-mailadresse vil ikke blive publiceret.