För att börja med definitionen är rekonstruktion en 3D-modell av ett objekt som tas fram på grundval av databehandling på lång sikt. Rekonstruktionen kan utföras med hjälp av en mängd olika principer: stereometriska, stereofotometriska, volymborttagning eller rörelsedata.

Detta arbete är en guide som förklarar hur man utvecklar en enkel applikation för att rekonstruera ett objekts form med hjälp av GPU, det vill säga ett grafikkort.

Av de principer som nämns ovan har vi valt algoritmen för avlägsnande av volymer, som föreslås av Brian Cureless och Mark Levoy i deras artikel med titeln ”A Volumetric Method for Building Complex Models from Range Images”.

Figuren nedan förtydligar den grundläggande principen för algoritmen. Objektet som ska rekonstrueras från en uppsättning bilder visas till vänster. När en bild behandlas tar algoritmen bort de 3D-punkter som ligger framför objektet (författarna tillämpade tekniken med strukturerat ljus för djupkartläggningen), och bortom det. Resultatet av den första bildbehandlingen visas i mitten. Med hjälp av data från den andra kameran tar programmet bort ytterligare 3D-punkter. Ju fler vinklar som används, desto fler extra 3D-punkter tas bort; till slut återstår bara de punkter som hör till objektet.

I applikationen tillämpar vi en förenklad version av algoritmen som bara tar bort de punkter som är belägna utanför objektets kontur i bilderna. I enlighet med originalartikeln delar vi upp hela utrymmet i en uppsättning kubiska element (voxlar).

För att avgöra om en voxel tillhör 3D-objektet tillämpar vi GPU-rendering och matchar den erhållna projektionen med objektsilhuetten.

För att få fram projektionen används följande funktion:

För att förklara mer i detalj,

pixelBuffer->makeCurrent () – växlar ritningsinnehållet till bufferten QGLPixelBuffer utanför skärmen.

När utgångsbufferten initialiseras är klippning, djuptestning och blandning inaktiverade, eftersom det enda målet är att bestämma voxelns rumsliga position i förhållande till objektet.

Efter att ha bytt innehåll i HComparator::render rensas utgångsbufferten och projektionsparametrarna ställs in.

För att rendera en voxel anropas funktionen glCallList(voxelList) för att exekvera en i förväg utformad lista med kommandon. Initialiseringsfunktionen är:

Efter ritning bestäms voxelns rumsliga position i förhållande till objektet med hjälp av funktionen HComparator::compareData.

Funktionen compareData kopierar buffertinnehållet och jämför det med objektsiluetten utifrån de tre möjliga alternativen (se figuren nedan):

a) voxeln är helt och hållet belägen inom objektet (kod 1);

b) voxeln tillhör gränsen (kod 2);

c) voxeln är helt och hållet belägen utanför objektet (kod 0).

Den uppsättning vinklar som används för att utveckla 3D-modellen bearbetas sekventiellt av funktionen HReconstruction::process. Vi utgår från antagandet att varje voxel tillhör objektet. Om en voxelplats bestäms ligga utanför objektet för en av vinklarna, avbryts bearbetningen och den tas bort från modellen. Hela bearbetningen utförs tills alla vinklar har beaktats. I slutändan återstår endast de voxlar som tillhör objektmodellen.

För att matcha voxeln och objektsiluetten bör projektionsparametrarna vara kända. De definieras av matriserna GL_PROJECTION och GL_MODELVIEW (se funktionen setGL).

Matrisen GL_PROJECTION definieras av kamerans parametrar, närmare bestämt brännvidden och bildstorleken (funktionen HFrame::loadIntrisicParameters).

Kamerans 3D-position kan bestämmas med hjälp av markören för förstärkt verklighet, vi hämtar den från biblioteket aruco. Marker är en speciell bild som ska skrivas ut på ett papper (se bilden nedan).

När man fotograferar ett objekt måste markören hållas orörlig och komma in i kamerans synfält i varje objektsfoto.

Biblioteket upptäcker markörens kontrollpunkter och beräknar sedan, med hjälp av kamerans brännvidd, markörens 3D-position (rvec och tvec).

Parametrarna rvec och tvec bestämmer GL_MODELVIEW-matrisen (se funktionen HFrame::loadExtrisicParameters).

Därmed har vi lärt oss hur man projicerar voxlar på bildplanet, bestämmer voxelpositionen i förhållande till objektbilden, beräknar projektionsparametrarna och bestämmer om voxeln tillhör objektvolymen, genom att bearbeta data från flera kameror; det är en förenklad men komplett teknik för att rekonstruera 3D-objekt.

Lämna en kommentar

Din e-postadress kommer inte publiceras.