Na úvod definice: Rekonstrukce je 3D model objektu vytvořený na základě zpracování dálkových dat. Rekonstrukci lze provádět na nejrůznějších principech: stereometrickém, stereofotometrickém, odstraňování objemu nebo pohybových dat.

Tato práce je návodem, který vysvětluje, jak vyvinout jednoduchou aplikaci pro rekonstrukci tvaru objektu pomocí GPU, tj. grafické karty.

Z výše uvedených principů jsme vybrali algoritmus odstraňování objemu, který navrhli Brian Cureless a Mark Levoy ve svém článku s názvem „A Volumetric Method for Building Complex Models from Range Images“.

Následující obrázek objasňuje základní princip algoritmu. Objekt, který má být rekonstruován ze sady snímků, je zobrazen vlevo. Při zpracování snímku algoritmus odstraní 3D-body umístěné v přední části objektu (autoři použili techniku strukturovaného světla pro mapování hloubky) a mimo něj. Výsledek prvního zpracování snímku je zobrazen uprostřed. Na základě dat získaných z druhého fotoaparátu program odstraní další 3D-body. Čím více úhlů je použito, tím více 3D-bodů navíc je odstraněno; nakonec zůstanou pouze body patřící objektu.

V aplikaci je implementována zjednodušená verze algoritmu, která na snímcích odstraňuje pouze body nacházející se za obrysem objektu. Podle původního článku rozdělíme celý prostor na množinu krychlových prvků (voxelů).

Pro určení, zda voxel patří k 3D-objektu, použijeme vykreslování pomocí GPU a porovnáme získanou projekci se siluetou objektu.

Pro získání projekce se používá následující funkce:

Pro podrobnější vysvětlení,

pixelBuffer->makeCurrent () – přepne obsah kreslení do bufferu QGLPixelBuffer mimo obrazovku.

Při inicializaci výstupní vyrovnávací paměti je zakázáno ořezávání, testování hloubky a míchání, protože jediným cílem je určit prostorovou polohu voxelu vzhledem k objektu.

Po přepnutí obsahu v HComparator::render se výstupní buffer vymaže a nastaví se parametry projekce.

Pro vykreslení voxelu se zavolá funkce glCallList(voxelList), která provede předem vytvořený seznam příkazů. Inicializační funkce je:

Po vykreslení se určí prostorová poloha voxelu vzhledem k objektu pomocí funkce HComparator::compareData.

Funkce compareData zkopíruje obsah bufferu a porovná jej se siluetou objektu na základě tří možných variant (viz obrázek níže):

a) voxel se celý nachází uvnitř objektu (kód 1);

b) voxel patří k okraji (kód 2);

c) voxel se celý nachází mimo objekt (kód 0).

Soubor úhlů použitých k vytvoření 3D-modelu je postupně zpracován funkcí HReconstruction::process. Vycházíme z předpokladu, že každý z voxelů patří k objektu. Pokud je pro některý z úhlů určeno umístění voxelu mimo objekt, jeho zpracování se zastaví a je z modelu odstraněn. Celé zpracování probíhá, dokud nejsou zohledněny všechny úhly. Nakonec zůstanou pouze voxely náležející k modelu objektu.

Pro porovnání voxelu a siluety objektu by měly být známy parametry projekce. Ty jsou definovány maticemi GL_PROJECTION a GL_MODELVIEW (viz funkce setGL).

Matrice GL_PROJECTION je definována parametry kamery, konkrétně ohniskovou vzdáleností a velikostí obrazu (funkce HFrame::loadIntrisicParameters).

Polohu 3D kamery můžeme určit pomocí značky rozšířené reality, bereme ji z knihovny aruco. Marker je speciální obrázek, který se vytiskne na kus papíru (viz obrázek níže).

Při snímání objektu musí být marker nehybný a dostat se do zorného pole kamery při každém snímání objektu.

Knihovna detekuje kontrolní body značky a poté pomocí ohniskové vzdálenosti fotoaparátu vypočítá 3D-pozici značky (rvec a tvec).

Parametry rvec a tvec určují matici GL_MODELVIEW (viz funkce HFrame::loadExtrisicParameters).

Tak jsme se naučili promítat voxely na rovinu obrazu, určit polohu voxelu vzhledem k obrazu objektu, vypočítat parametry projekce a určit, zda voxel patří do objemu objektu, prostřednictvím zpracování dat z několika kamer; to je zjednodušená, ale úplná technika rekonstrukce 3D-objektů.

Leave a comment

Vaše e-mailová adresa nebude zveřejněna.