Om met de definitie te beginnen, reconstructie is een 3D-model van een object ontwikkeld op basis van lange-afstandsgegevensverwerking. Reconstructie kan worden uitgevoerd met behulp van een groot aantal verschillende principes: stereometrisch, stereofotometrisch, volumeverwijdering, of bewegingsgegevens.

Dit werk is een gids die uitlegt hoe een eenvoudige toepassing kan worden ontwikkeld om de vorm van een object te reconstrueren met behulp van GPU, d.w.z. een videokaart.

Van de hierboven genoemde principes hebben we gekozen voor het algoritme voor het verwijderen van volumes, voorgesteld door Brian Cureless en Mark Levoy in hun artikel getiteld “A Volumetric Method for Building Complex Models from Range Images”.

De onderstaande figuur verduidelijkt het basisprincipe van het algoritme. Het object dat moet worden gereconstrueerd uit een reeks beelden is links afgebeeld. Bij de verwerking van een beeld verwijdert het algoritme de 3D-punten die zich aan de voorzijde van het object bevinden (de auteurs pasten de gestructureerde lichttechniek toe voor de dieptemapping), en daarachter. Het resultaat van de eerste fotobewerking is te zien in het midden. Met de gegevens van de tweede camera verwijdert het programma extra 3D-punten. Hoe meer hoeken worden gebruikt, hoe meer extra 3D-punten worden verwijderd; uiteindelijk blijven alleen de punten over die bij het object horen.

In de toepassing implementeren we een vereenvoudigde versie van het algoritme dat alleen de punten verwijdert die zich buiten de objectcontour in de beelden bevinden. Volgens het oorspronkelijke artikel verdelen we de gehele ruimte in een verzameling kubische elementen (voxels).

Om te bepalen of een voxel tot het 3D-object behoort, passen we de GPU-rendering toe en matchen we de verkregen projectie met het object-silhouet.

Om de projectie te krijgen, wordt de volgende functie gebruikt:

Om meer in detail te treden,

pixelBuffer->makeCurrent () – schakelt de tekeninhoud in de off-screen QGLPixelBuffer buffer.

Bij het initialiseren van de uitvoerbuffer zijn clipping, dieptetesten en mixing uitgeschakeld, omdat het enige doel is om de ruimtelijke positie van de voxel ten opzichte van het object te bepalen.

Na het wisselen van de inhoud in HComparator::render, wordt de uitvoerbuffer leeggemaakt en worden de projectieparameters ingesteld.

Om een voxel te renderen, wordt de functie glCallList(voxelList) aangeroepen om een vooraf opgestelde lijst met commando’s uit te voeren. De initialisatiefunctie is:

Na het tekenen wordt de ruimtelijke positie van de voxel ten opzichte van het object bepaald met behulp van de HComparator::compareData-functie.

De functie compareData kopieert de inhoud van de buffer en vergelijkt deze met het silhouet van het object op basis van de drie mogelijke opties (zie de onderstaande figuur):

a) de voxel bevindt zich volledig binnen het object (code 1);

b) de voxel behoort tot de rand (code 2);

c) de voxel bevindt zich volledig buiten het object (code 0).

De verzameling hoeken die wordt gebruikt om het 3D-model te ontwikkelen, wordt sequentieel verwerkt door de HReconstruction::process-functie. We gaan uit van de veronderstelling dat elk van de voxels tot het object behoort. Als de locatie van een voxel buiten het object wordt bepaald voor één van de hoeken, stopt de verwerking ervan en wordt het verwijderd uit het model. De hele bewerking wordt uitgevoerd totdat alle hoeken zijn beschouwd. Uiteindelijk blijven alleen de voxels over die behoren tot het objectmodel.

Om de voxel en het objectsilhouet met elkaar in overeenstemming te brengen, moeten de projectieparameters bekend zijn. Deze worden gedefinieerd door de GL_PROJECTION en GL_MODELVIEW matrices (zie de setGL functie).

De GL_PROJECTION matrix wordt gedefinieerd door de camera parameters, specifiek, de brandpuntsafstand en de beeldgrootte (de HFrame::loadIntrisicParameters functie).

De camera 3D-positie kan worden bepaald met behulp van de augmented reality marker, we nemen deze uit de aruco bibliotheek. Marker is een speciale afbeelding die wordt afgedrukt op een stuk papier (zie de afbeelding hieronder).

Bij het fotograferen van een object, moet de marker onbeweeglijk worden gehouden en in het gezichtsveld van de camera komen in elk van de object foto’s.

De bibliotheek detecteert de marker controlepunten, en vervolgens, met behulp van de camera brandpuntsafstand, berekent de marker 3D-positie (rvec en tvec).

De parameters rvec en tvec bepalen de GL_MODELVIEW-matrix (zie de functie HFrame::loadExtrisicParameters).

Dus hebben we geleerd hoe we voxels op het beeldvlak kunnen projecteren, de voxelpositie ten opzichte van het objectbeeld kunnen bepalen, de projectieparameters kunnen berekenen, en kunnen bepalen of de voxel tot het objectvolume behoort, door de gegevens van meerdere camera’s te verwerken; dat is een vereenvoudigde maar complete techniek voor het reconstrueren van 3D-objecten.

Reageren

Het e-mailadres wordt niet gepubliceerd.