A definícióval kezdjük, a rekonstrukció egy objektum 3D modellje, amelyet hosszú távú adatfeldolgozás alapján alakítunk ki. A rekonstrukció sokféle elv alapján végezhető: sztereometriai, sztereofotometriai, térfogateltávolítás vagy mozgásadatok felhasználásával.

Ez a munka egy útmutató, amely bemutatja, hogyan lehet egy egyszerű alkalmazást fejleszteni egy tárgy alakjának rekonstrukciójára GPU, azaz videokártya segítségével.

A fent említett elvek közül a Brian Cureless és Mark Levoy által az “A Volumetric Method for Building Complex Models from Range Images” című cikkben javasolt térfogateltávolító algoritmust választottuk.

Az alábbi ábra az algoritmus alapelvét világítja meg. Balra látható a képsorozatból rekonstruálandó objektum. A kép feldolgozása során az algoritmus eltávolítja a tárgy előtt (a szerzők strukturált fénytechnikát alkalmaztak a mélységtérképezéshez) és azon túl található 3D-pontokat. Az első képfeldolgozás eredménye középen látható. A 2. kamerából nyert adatok felhasználásával a program további 3D-pontokat töröl. Minél több szöget használunk, annál több extra 3D-pontot távolítunk el; végül csak a tárgyhoz tartozó pontok maradnak meg.

Az alkalmazásban az algoritmus egy egyszerűsített változatát valósítjuk meg, amely csak a tárgy kontúrján túl elhelyezkedő pontokat törli a képeken. Az eredeti cikket követve a teljes teret kockaelemek (voxelek) halmazára osztjuk.

Hogy megállapítsuk, hogy egy voxel a 3D-tárgyhoz tartozik-e, a GPU renderelést alkalmazzuk, és a kapott vetületet összevetjük a tárgy sziluettjével.

A vetület kinyeréséhez a következő függvényt használjuk:

A részletesebb magyarázat érdekében,

pixelBuffer->makeCurrent () – a rajzolás tartalmát a képernyőn kívüli QGLPixelBuffer pufferbe kapcsolja.

A kimeneti puffer inicializálásakor a vágás, a mélységvizsgálat és a keverés ki van kapcsolva, mivel az egyetlen cél a voxel térbeli pozíciójának meghatározása az objektumhoz képest.

A HComparator::render-ben történő tartalomváltás után a kimeneti puffer törlődik, és a vetítési paraméterek beállítása megtörténik.

A voxel rendereléséhez a glCallList(voxelList) függvényt hívjuk meg egy előre elkészített parancslista végrehajtásához. Az inicializáló függvény:

A rajzolás után a HComparator::compareData függvény segítségével meghatározzuk a voxel térbeli helyzetét az objektumhoz képest.

A compareData függvény lemásolja a puffer tartalmát és összehasonlítja azt az objektum sziluettjével a három lehetséges opció alapján (lásd az alábbi ábrát):

a) a voxel teljes egészében az objektumon belül helyezkedik el (1. kód);

b) a voxel a határhoz tartozik (2. kód);

c) a voxel teljes egészében az objektumon kívül helyezkedik el (0. kód).

A 3D-modell kialakításához használt szögek halmazát a HReconstruction::process függvény szekvenciálisan dolgozza fel. Abból a feltételezésből indulunk ki, hogy minden egyes voxel az objektumhoz tartozik. Ha egy voxel helyét az egyik szög esetében az objektumon kívül határozzuk meg, a feldolgozása leáll, és eltávolítjuk a modellből. Az egész feldolgozást addig folytatjuk, amíg az összes szöget figyelembe nem vesszük. Végül csak a tárgymodellhez tartozó voxelek maradnak meg.

A voxel és a tárgy sziluettjének egyezéséhez ismerni kell a vetítési paramétereket. Ezeket a GL_PROJECTION és a GL_MODELVIEW mátrixok határozzák meg (lásd a setGL függvényt).

A GL_PROJECTION mátrixot a kamera paraméterei határozzák meg, pontosabban a fókusztávolság és a képméret (a HFrame::loadIntrisicParameters függvény).

A kamera 3D-pozícióját a kiterjesztett valóság jelölő segítségével határozhatjuk meg, ezt az aruco könyvtárból vesszük. A marker egy speciális, papírra nyomtatandó kép (lásd az alábbi képet).

A tárgy felvételekor a markert mozdulatlanul kell tartani, és minden egyes tárgyfotónál a kamera látómezejébe kell kerülnie.

A könyvtár érzékeli a marker vezérlési pontjait, majd a kamera fókusztávolságának segítségével kiszámítja a marker 3D-pozícióját (rvec és tvec).

Az rvec és tvec paraméterek meghatározzák a GL_MODELVIEW mátrixot (lásd a HFrame::loadExtrisicParameters függvényt).

Ezzel megtanultuk, hogyan vetíthetjük a voxeleket a képsíkra, hogyan határozhatjuk meg a voxel helyzetét a tárgyképhez képest, hogyan számolhatjuk ki a vetítési paramétereket, és hogyan határozhatjuk meg, hogy a voxel a tárgy térfogatához tartozik-e, több kamera adatainak feldolgozásával; ez egy egyszerűsített, de teljes technika a 3D-tárgyak rekonstruálására.

Leave a comment

Az e-mail-címet nem tesszük közzé.