Categories
Älykästä tuotantoa Pulssi

Syvyys­kuvan visua­li­soin­nista: trigo­no­metriaa pistepilvipöllyssä

Tässä artik­ke­lissa kuvataan Base Camp –hankkeen etätek­no­lo­gia­ko­keilun vaatimaa jatko­ke­hi­tystä virtu­aa­li­ho­lo­grammien visua­li­soin­ti­rat­kaisuun. Edelli­sessä artik­ke­lissa käsiteltiin, miten piste­pil­velle luodaan staat­tinen 3D-malli proji­sointia varten.  Tässä artik­ke­lissa johdetaan projek­tio­al­go­ritmin toteutus matemaattisesti.

Mistä projek­tiossa on kyse?

2D-kuvapisteen projek­tioon tarvitaan kuvan koko vaaka- ja pysty­suun­nassa. Tämän lisäksi on tiedettävä kameran polttoväli. Polttoväli esitetään kulmayk­si­köinä; tässä artik­ke­lissa sitä käsitellään asteina. Kameran ajatellaan tällöin olevan kuvan keskipisteessä.

Asioiden yksin­ker­tais­ta­mi­seksi käsit­te­lemme aluksi vain yhtä leveys­suun­taista projek­tiota, mutta vastaava toimin­nal­lisuus on toki laajen­net­ta­vissa myös pysty­suuntaan. Kuvapisteen leveys­suun­tainen koordi­naatti kuvataan etäisyytenä kuvan keski­pis­teestä suhteel­li­sella arvovä­lillä [1,-1]. Kuten kuvasta 1 havaitaan, projek­tiosta löytyy suora­kul­mainen kolmio, jolloin sivun z pituus on lasket­ta­vissa trigo­no­met­rista kaavaa hyödyntämällä.

Kolmio johon liitetty matemaattisia merkintöjä.
Kuva 1. Projek­tiossa hyödyn­netään trigonometriaa. 

Miten yksit­täisen pisteen proji­sointi toimii?

Yksit­täisen pisteen proji­sointia varten kuvasta on valittava mieli­val­tainen piste, jonka suhteel­linen etäisyys keski­pis­teestä esitetään symbo­lilla x’. Pisteen ja z-sivun muodos­taman suora­kul­maisen toista kolmion kulma esitetään symbo­lilla β. Tällöin voimme muodostaa kuvassa 2 näkyvät yhtälöt.

Matemaattinen laskukaava.
Kuva 2. Kulman tangentti säilyy samana, jos sivujen pituudet muuttuvat samassa suhteessa.

Jos syvyys­suuntaa z kasva­tetaan mieli­val­tai­sella arvolla d, myös arvon x’ täytyy kasvaa samassa suhteessa, jotta kolmion kulma pysyy samana. Tästä voimme päätellä, että jos sivun z pituus on yksi, saamme laskettua syvyy­sarvon perus­teella leveys­suun­taisen etäisyyden keski­pis­teestä kerto­malla suhteel­lisen etäisyyden arvolla d. Näppärää!

Koska kuvassa 1 näkyvä arvo z ei ole aina pituu­deltaan välttä­mättä yksi, meidän on muokattava se sellai­seksi. Olkoon olemassa S, joka kerrottuna sivun z pituu­della antaa arvon yksi. Koska jo aiemmin esitettiin z:n arvo riippu­vaksi kulmasta α, voimme ratkaista S:n yhtälöstä kuvassa 3 esite­tyllä tavalla.

Matemaattinen kaava.
Kuva 3. Sivun z pituutta skaalaavan muuttujan S ratkaisu. 

Tämän avulla saamme uudet suhteel­liset etäisyydet keski­pis­teestä vaaka­suun­tai­sille kuvapis­teille, kuten kuvassa 4 on havain­nol­lis­tettu. Sivun z pituu­deksi muodostuu aina yksi. Koska vaaka­suun­taiset minimi- ja maksi­miarvot kuvassa 1 olivat välillä [1, 1], voimme sijoittaa S:n suoraan reuna­pis­teisiin. Pysty­suun­tainen etäisyys saadaan laskettua täysin samalla menetel­mällä, mutta α:n paikalla käytetään pysty­suun­taista kulmaa.

Kolmio ja matemaattisia merkintöjä.
Kuva 4. Kuvapis­teiden suhteel­liset maksi­mie­täi­syydet kuvan keski­pis­teestä sovitettuna norma­li­soituun syvyysarvoon. 

Miten tästä luodaan algoritmi?

Asioiden esittä­misen helpot­ta­mi­seksi koodista on jätettävä pois mahdol­liset kamera­vää­ris­tymien korjaukset. Edelli­sessä artik­ke­lissa kuvatun projek­tio­pis­te­mallin neliöiden proji­sointi tapahtuu seuraavasti.

Ensiksi laskemme kuvapisteen suhteel­lisen sijainnin kameran keski­pis­teestä. Syvyys­ka­meran toteu­tuk­sesta johtuen oikea keski­piste ei välttä­mättä ole kuvan keski­piste. Tämän vuoksi on tiedettävä vielä kameran linssin keski­pisteen sijainti kuvassa. Nämä tiedot saamme onneksi selville Intel Realsense SDK:n rajapin­ta­funk­tioiden avulla rs2_intrinsics-tieto­ra­ken­teesta.

Vektori kuvapis­teen­Si­jainti on pikselin (x,y)-koordinaatti kuvan vasem­masta yläkul­masta katsottuna. Syvyy­sarvo syvyys näytteis­tetään tallenteen video­teks­tuurin korkeus­kart­ta­ku­vasta. kameran­si­jain­ti­Ku­vassa toimii keski­pis­teenä. Vektori polttoVali sisäl­tää­suh­teel­liset etäisyys­ker­toimet x sekä y kerrottuna kuvan leveyden ja korkeuden puolik­kailla. Tällöin lopul­linen sijainti on lasket­ta­vissa suoraan kuvapis­te­koor­di­naattien avulla, eikä muunnosta suhteel­lisiin koordi­naat­teihin tarvitse välissä tehdä. Listauk­sessa 1 näkyvä pseudo­koodin C++-toteutus on tarkas­tel­ta­vissa Intel Realsense SDK:n funktiossa rs2_deproject_pixel_to_point.

float3 piste­pro­jektio(   float2 kuvapis­teen­Si­jainti, float syvyys,

float2 kameran­si­jain­ti­Ku­vassa, float2 polttoVali)

{

        float x = (kuvapisteenSijainti.x – kameransijaintiKuvassa.x) / polttoVali.x;

        float y = (kuvapisteenSijainti.y – kameransijaintiKuvassa.y) / polttoVali.y;

        return float3(syvyys* x, syvyys* y, syvyys);

}

Listaus 1. Piste­pilven projek­tio­al­go­ritmi pseudokoodina.

Virtu­aa­li­ho­lo­grammeja varten listauksen pseudo­koodi toteu­tettiin Unity-sovel­lus­ke­hit­timen GLSL-vertek­si­var­jos­ti­noh­jelmana, joka suori­tetaan kaikille projek­tio­pis­te­mallin neliöiden vertek­seille. Kameran sijain­ti­tieto sekä polttoväli oli helpoin välittää uniform-tyyppisinä vain-luku-muuttujina edito­rista käsin nelikom­po­nent­ti­vek­to­rissa. Kuvapis­te­koh­tainen syvyys­tieto on näytteis­tet­tä­vissä video­teks­tuurin korkeus­karttaa kuvaa­vasta osiosta.

Syvyys­kartan ja kameran värikuvan kokoe­rojen vuoksi varjos­ti­noh­jelmaan toteu­tettiin myös koordi­naattien sovitus kuvien kesken, jolloin samat suhteel­liset koordi­naatit toimivat molem­mille kuvatyy­peille. Toteu­tuksen tarkempi läpikäynti jätetään toistai­seksi väliin sen varsin teknisen luonteen vuoksi.

Yhteenveto

Tässä artik­ke­lissa on kuvattu piste­pil­vi­pro­jektion tekemisen sekä siitä algoritmin johta­misen matemaat­tinen tausta. Seuraa­vassa artik­ke­lissa käsitellään menetelmiä piste­pilven yhtenäis­tä­miseen sekä loppu­tu­losta selkeästi heiken­tävien kohtien poisrajaamiseen.


Kirjoittaja:

Anssi Gröhn, lehtori, Karelia-ammattikorkeakoulua

Base Camp -Opiske­li­jay­rit­tä­jyy­sa­lus­tojen kehit­tä­minen -hanke

Artik­ke­likuva: Richard Horvath on Unsplash