LAURI VIRTANEN TASAISEN PINNAN TUNNISTUS ETÄISYYSKUVASTA Kandidaatintyö Tarkastaja: Yliopistonlehtori Heikki Huttunen
i TIIVISTELMÄ TAMPEREEN TEKNILLINEN YLIOPISTO Tietotekniikan koulutusohjelma VIRTANEN, LAURI: Tasaisen pinnan tunnistus etäisyyskuvasta Kandidaatintyö, 18 sivua, 4 liitesivua Maaliskuu 2015 Pääaine: Signaalinkäsittely ja multimedia Tarkastaja: Yliopistonlehtori Heikki Huttunen Avainsanat: RANSAC, etäisyyskuva, pistepilvi, 3D-skanneri, Kinect Autonomisten lennokkien, liikkuvien työkoneiden ynnä muiden on havaittava ympäristöään tehokkaasti ja reaaliaikaisesti törmäysten estämiseksi. Ympäristön havainnointi harmaasävy- tai värikameroilla ei yleensä ole riittävän tarkkaa, vaan tilaa on tutkittava etäisyyksiä havainnoivalla 3D-skannerilla. Tässä työssä käydään läpi tekniikat, jotka tarvitaan yksittäisen tasaisen pinnan löytämiseen 3D-skannatusta tilasta niin, että pinta voidaan esittää matemaattisena yhtälönä. 3D-skannaukseen käytetään Microsoft Kinectiä, jossa on 3D-skannaukseen soveltuva etäisyyskamera. Etäisyyskamera perustuu rakenteisen valon tekniikkaan, jonka teoria esitellään työssä. 3D-skannauksen tulos on etäisyyskuva, josta voidaan luoda pistepilvi. Tason löytämiseksi työssä käytetään Random Sample Consensus (RANSAC) menetelmää. Vaikka skannatun tilan pistepilviesitys on yleiskäyttöinen, niin tason löytäminen siitä on hidasta. Nopeampi tapa on käyttää suoraan etäisyyskuvaa, ilman pistepilvimuunnosta. Työssä esitellään toteutukset tason löytämiseksi sekä kaksiulotteisesta pistepilvidatasta että etäisyyskuvasta.
ii ALKUSANAT Kandidaatintyöni on ollut pitkänpuoleinen projekti, joka saatiin viimein valmiiksi signaalinkäsittelyn kandidaattiseminaarissa keväällä 2015. Tahdon osoittaa kiitokset Heikki Huttuselle työni hyvästä ohjaamisesta. Kiitokset saa myös perheeni, eli vaimoni Henna ja poikani Into, jotka motivoivat saamaan työni valmiiksi. Tampereella 20. maaliskuuta 2015 Lauri Virtanen
iii SISÄLLYS 1 Johdanto...................................... 1 2 Etäisyyskuvan ja pistepilven muodostaminen................... 2 2.1 Skanneritekniikat............................... 2 2.2 Rakenteinen valo............................... 2 2.3 Etäisyyskuvasta pistepilvi.......................... 4 3 Menetelmät tasopinnan löytämiseksi........................ 7 3.1 Pienimmän neliösumman menetelmä.................... 8 3.2 Random Sample Consensus......................... 10 3.2.1 Virhetoleranssi............................. 11 3.2.2 Iteraatiomaksimi............................. 11 3.2.3 Kynnysarvo............................... 11 3.3 Suoran tunnistus pistepilvestä........................ 12 3.4 Pinnan tunnistus etäisyyskuvasta....................... 13 4 Yhteenveto..................................... 16 Lähteet......................................... 17 Liite 1: RANSAC kaksiulotteiselle pistepilvelle................... 19 Liite 2: RANSAC etäisyyskuvalle.......................... 21
iv TERMIT JA LYHENTEET 3D-skanneri Etäisyyskuva Konsensusjoukko Pistepilvi PNS Poikkeava havainto RANSAC Regressioanalyysi RGB-kamera Sovitekuva Sovite Kolmiulotteisia, eli avaruudellisia muotoja havainnoiva laite. Kuva, jossa pikselin harmaasävyarvo kertoo kohteen etäisyyden kameraan. Pistejoukko, joka on lähellä sovitetta. Joukko pisteitä kolmiulotteisessa koordinaatistossa. Pienimmän neliösumman menetelmä (least squares). Mittauksessa selkeästi erilainen tulos (outlier), karkea virhe (gross error). Random Sample Consensus -menetelmä. Tilastollinen menetelmä, jolla mitatut datapisteet yleistetään kaavaksi. Värikuvakamera. Etäisyyskuvan sovite. Mitatuille datapisteille regressioanalyysissä sovitettu malli. e Virhetoleranssi. M n Malli (taso) RANSAC-iteraatiolla n. N P S n RANSAC-kierrosten lukumäärä. Pistepilvi. Pistejoukko RANSAC-iteraatiolla n, jonka pisteistä voidaan ratkaista malli M n. S n Konsensusjoukko RANSAC-iteraatiolla n. τ Kynnysarvo.
1 1 JOHDANTO Konenäkösovelluksissa tavalliselta harmaasävy- tai värikameralta saatava kuva voi useissa tapauksissa olla riittävä, sillä kuvasta voidaan perinteisillä kuvankäsittelyn menetelmillä erottaa piirteet ja tehdä luokitusta sekä muuta analyysiä. Kuitenkin, monissa sovelluksissa pelkästään värikameran kuva ei ole paras vaihtoehto, johtuen kuvattavan kohteen vaihtelevasta tai riittämättömästä valaistuksesta, jolloin kohteesta tarvitaan enemmän tietoa väri-informaation lisäksi. Useissa sovelluksissa tieto kohteiden etäisyyksistä eli etäisyyskuva (range image, myös syvyyskuva, depth map) tuo tarvittavan lisäinformaation. Esimerkiksi autonomiset liikkuvat työkoneet tarvitsevat etäisyystietoja ja pintojen analyysiä törmäysten estymiseksi. Reaaliaikaisen ja tehokkaan analyysin tarve korostuu, kun kyseessä on esimerkiksi autonomiset lennokit, jotka tarvitsevat nopeita päätöksiä törmäysten estämiseksi. Etäisyyskuva saadaan kolmiulotteista tilaa havaitsevalta skannerilta (3Dskanneri), jollaisia ovat esimerkiksi laserkeilaimet, tai peliohjaimena tunnettu Microsoft Kinect. Tässä työssä käydään läpi tekniikoita, joita tarvitaan, kun fyysinen tila skannataan etäisyyskuvaksi, ja joilla etäisyyskuvasta saadaan tunnistettua tasopinta. 3D-skannereista tutustutaan tarkemmin Microsoft Kinectiin ja sen käyttämään structured light -tekniikkaan etäisyyskuvan muodostamisessa. Saadusta etäisyyskuvasta voidaan muodostaa vastaava kolmiulotteinen pistepilvi, josta taso voidaan löytää. Tasaisen pinnan löytämiseksi käytetään kahta Random Sample Consensus menetelmään (RANSAC) [1] perustuvaa toteutusta, josta ensimmäinen löytää pinnan pistepilvestä ja toinen suoraan etäisyyskuvasta. Molemmat toteutukset tunnistavat vain yhden, yleensä suurimman, tasaisen pinnan. Etäisyyskuvan ja pistepilven muodostamisesta sekä 3D-skannereista on kerrottu luvussa 2. Luvussa 3 kerrotaan miten etäisyyskuvasta saa tason erotettua RANSACin avulla. Viimeisessä luvussa 4 on yhteenveto tämän tutkimuksen oleellisesta sisällöstä.
2 2 ETÄISYYSKUVAN JA PISTEPILVEN MUODOSTAMINEN Ensimmäinen vaihe pintojen löytämisessä on saada pinnasta fyysinen havainto 3D-skannerilla. Tässä luvussa tutkitaan, miten 3D-skannerilla havaitaan pintaa ja miten siitä muodostetaan pistepilvi. Tekniikoita, joilla kolmiulotteista pintaa voidaan havaita, on useita, mutta keskitytään rakenteisen valon tekniikkaan, sillä siihen perustuu useat edulliset 3Dskannerit. 2.1 Skanneritekniikat 3D-skanneri on laaja käsite, ja tekniikoita on monia erilaisia, mutta ne jakautuvat kahteen pääluokkaan sen mukaan, kosketetaanko sillä havaittavaa pintaa fyysisesti vai ei. Esimerkkinä koskevasta skannerista mainittakoon koordinaattimittauslaiteet (coordinate measuring machine). Koskevat 3D-skannerit ovat hyvä valinta sovelluksissa, joissa vaaditaan tarkkuutta, mutta niiden haittapuolena ovat fyysinen rajallisuus ja hitaus verrattuna ei-koskeviin skannereihin. Ei-koskevaa 3D-skanneria voidaan pitää kameramaisena laitteena se saa rajalliselta näkökentältä (field of view) havaintoja, mutta valon sijaan yksittäinen havaintopiste (pikseli) kuvaakin etäisyyttä. Pistepilvelle tehtävät operaatiot riippuvat sovelluskohteesta, mutta usein pisteitä yhdistetään pinnoiksi. Ei-koskettavien skannereiden yleisiä tekniikoita ovat muiden muassa rakenteiseen valoon (structured light) ja valon lentoaikamenetelmään (time-of-flight, TOF) perustuvat tekniikat. Näistä rakenteista valoa tarkastellaan tarkemmin seuraavassa aliluvussa. 2.2 Rakenteinen valo Rakenteiseen valoon perustuvat 3D-skannerit ovat yksinkertaisia ja suhteellisen edullisia. Rakenteinen valo ei ole tarkkaan määritelty tekniikka, vaan toimintaperiaate, jota
2. Etäisyyskuvan ja pistepilven muodostaminen 3 on havainnollistettu kuvassa 2.1. Kuvan tekniikassa käytetään yksinkertaista pystyjuovakuviota. Kuvassa vasemmalla puolella oleva projektori heijastaa tiheän valojuovakuvion kappaleen pinnalle. Kuvassa oikealla puolella oleva kamera havaitsee kuvattavalle pinnalle heijastetut juovat. Yksittäisen juovan vaakasuuntaisista poikkeamista sekä leveydestä päätellään pisteen etäisyys skannerista, eli mitä enemmän juova poikkeaa oikealle, sitä kauempana se on. Projektorin ja kameran suunnat sekä etäisyys toisitaan on tiedettävä täsmällisesti, jotta poikkeamista voidaan laskea etäisyys. Heijastettavat valokuvio voi olla näkymätöntä infrapuna- tai ultraviolettivaloa, mutta ne voivat myös olla ihmiselle näkyvän aallonpituuden valoa. kappaleen pinta valojuova piste kappaleella juova kameran kenno pystyjuovakuvioprojektori v u piste kennolla ζ kolmion kanta Kuva 2.1. Tyypillinen rakenteisen valon 3D-skannerin tekniikka havainnollistettuna. Muokattu lähteestä [2]. Kuluttajille myytäviä 3D-skannereita, joiden toiminta perustuu rakenteiseen valoon, ovat muun muassa Microsoft Kinect, Asus XTion, ja PrimeSense Carmine. Näistä ensimmäistä tarkastellaan seuraavaksi tarkemmin. Microsoft Kinect on alkujaan Xbox 360 -pelikonsolin ohjainlaite, jolla käyttäjä voi ohjata pelikonsolia ilman käsissä pidettävää ohjainta. Ohjaus tapahtuu käyttämällä liikeeleitä ja äänikomentoja. Kinectissä on rakenteisen valon 3D-skanneri, sillä skannerin tuottamasta etäisyyskuvasta voidaan luotettavammin tunnistaa pelaajan liikkeet, riippumatta valaistuksesta. Edullisena 3D-skannerina Kinect on julkistamisestaan lähtien herättänyt
2. Etäisyyskuvan ja pistepilven muodostaminen 4 Infrapunalaserprojektori RGB-kamera Infrapunakamera Motorisoitu jalusta 4 mikrofonia Kuva 2.2. Microsoft Kinect -laitteen oleellisimmat osat nimettyinä. Kameroiden lisäksi Kinectissä on 4 mikrofonia äänikomentoja varten sekä motorisoitu jalusta. Muokattu lähteestä [3]. mielenkiintoa myös peliteollisuuden ulkopuolella. Kinectin tekniikan taustalla on israelilaisen PrimeSensen patentoima [4] light coding tekniikka, joka on myös rakenteisen valon tyyppinen tekniikka [5]. Kinectissä on kaksi kameraa, joista toinen on värikuvaa tallentava kamera ja toinen on infrapunakamera. Infrapunakameraa käytetään infrapunalaserprojektorin kanssa yhdessä etäisyyskuvan muodostamiseen. Kuvassa 2.2 on esitetty osien sijainnit laitteessa. Toisin kuin tyypillisessä rakenteisen valon projektorissa, Kinect käyttää pystyjuovakuvion sijaan näennäissatunnaista pistekuviota [4], mutta muuten menetelmä on aliluvussa 2.2 kuvatun mukainen. Kuvassa 2.3 on Kinectillä kuvatut etäisyyskuva ja sen vastaava värikuva. Etäisyyskuvassa vaaleat pikselit ovat lähellä olevia etäisyyspisteitä ja tummat kauempana. Täysin mustat pikselit kuvaavat tuntematonta etäisyyttä, joka on ollut joko liian lähellä, liian kaukana, jäänyt jonkin kohteen varjoon, tai on epäselvä muusta syystä. 2.3 Etäisyyskuvasta pistepilvi Etäisyyskuva on harmaasävyinen kaksiulotteinen matriisi, josta voidaan muodostaa kolmiulotteinen pistepilvi. Olkoon etäisyyskuva matriisi D, jossa elementtien arvot kuvaavat etäisyyttä millimetreinä. Yksittäisistä matriisin elementistä d vu (eli pikselistä kuvan koordinaatissa (u, v)) voidaan laskea pisteen p = [p x, p y, p z ] T koordinaatit kaavoilla p x = (u c d,u)d vu f d,u, (2.1)
2. Etäisyyskuvan ja pistepilven muodostaminen (a) 5 (b) Kuva 2.3. Etäisyyskuva (a) ja vastaava värikuva (b). py = (v cd,v )dvu, fd,v (2.2) pz = dvu. (2.3) ja Edellisissä kaavoissa fd,u ja fd,v ovat infrapunakameran polttoväli pikseleinä vaaka- ja pystysuunnassa ja cd,u ja cd,v ovat kennon äärimmäiset pisteet sekä vaaka- että pystysuunnassa. [6] Etäisyyskuvan pikseleistä, joiden arvo dvu = 0 ei ole mielekästä tallentaa pistettä pilveen, sillä ne kaikki sijoittuisivat origoon (skannerin koordinaattiin). Kuvassa 2.4(a) aiemmin esitetyn etäisyyskuvan pistepilvi katsottuna oikealta etäisyyskuvaan nähden. (a) (b) Kuva 2.4. (a) Etäisyyskuvasta luotu pistepilvi. (b) Sama pistepilvi, mutta pisteiden värit on saatu kuvasta 2.3(b).
2. Etäisyyskuvan ja pistepilven muodostaminen 6 Skannerilta saadusta etäisyyskuvasta luodun pistepilven pisteiden koordinaatit ovat skannerin koordinaatistossa, kun käytetään kaavoja (2.1), (2.2) ja (2.3). Itse pistepilvi on teoriassa vain joukko koordinaattipisteitä. Yksittäisen pisteen on tärkeintä sisältää tieto sijainnistaan, mutta se voi sisältää myös muuta tietoa, kuten pisteen värin RGBavaruudessa. Pistepilvi on yleiskäyttöinen ja joustava esitystapa skannatulle tilalle. Pistepilvi voidaan myös yhdistää usean skannerin tuloksesta yhdeksi pistepilveksi käyttämällä esimerkiksi ICP-menetelmää (Iterative closest point) [7], mutta tässä työssä ei esitellä sitä menetelmää.
7 3 MENETELMÄT TASOPINNAN LÖYTÄMISEKSI Pistepilven data sisältää pelkästään pisteitä ilman, että niillä on yhteyksiä toisiinsa. Yksittäiset pisteet on jollain menetelmällä yhdistettävä pinnaksi niin, että se vastaa skannattua pintaa. Se olisi mahdollista muiden muassa siten, että riittävän lähellä toisiaan olevia pisteitä yhdistetään kolmioverkoiksi. Tällaisista menetelmistä on kooste lähdeartikkelissa [8], ja vastaavilla tavoilla toimitaan silloin, kun skannatusta pistepilvestä tehdään tarkka kolmiulotteinen malli, kuten 3D-tulostusta varten. Kuitenkin, pisteistä rakennettu malli pysyy hyvin monimutkaisena suuret, yksinkertaisetkin pinnat, kuten seinät, sisältävät tarpeettoman paljon dataa. Pisteitä voidaankin yleistää matemaattisiksi malleiksi tekemällä pisteille sovitteita. Sovite voi olla esimerkiksi jokin geometrinen muoto, kuten suora, taso tai sylinteri. Ratkaisuna on estimoida pistepilvestä mallin parametrit käyttämällä jotain regressioanalyysiä, kuten pienimmän neliösumman menetelmää, johon palataan tarkemmin luvussa 3.1. 3D-skannerilta, kuten miltä tahansa mittalaitteelta, tuleva data sisältää aina epätarkkuutta, jossa on tyypillisesti kohinaa sekä poikkeavia havaintoja (outliers). Symmetrisesti jakautunut kohina ei tyypillisesti haittaa regressioanalyysissä, mutta poikkeavat havainnot voivat saada sovitteen vääristymään liikaa. Jos pistepilvestä etsitään suuria pintoja, kuten seiniä tai lattiaa, voidaan muut pisteet ajatella poikkeaviksi havainnoiksi. Kuvassa 3.1 on kuvan 2.4(a) pistepilvestä otettu vaakasuunnassa ohut kaistale, jossa taustalla oleva seinän pisteet näkyvät epätasaisena, katkonaisena viivana. Seinää on yritetty etsiä tekemällä pisteille suoran sovite (sininen viiva) käyttäen pienimmän neliösumman menetelmää, mutta suora on huomattavasti väärässä paikassa, sillä laskuissa olivat mukana poikkeavat havainnot (esineiden pisteet). Ihminen osaa mittauksia tarkastellessaan sivuuttaa poikkeavat havainnot ja tunnistaa missä seinän kuuluisi olla, mutta ohjelmallisesti niiden automaattinen sivuuttaminen ei ole triviaali ongelma. Tarkastellaan ensin pienimmän neliösumman menetelmää, joka on yleinen regressioanalyysin menetelmä. Sen jälkeen tarkastellaan RANSACia, jolla voidaan sivuuttaa poikkeavat havainnot automaattisesti.
3. Menetelmät tasopinnan löytämiseksi 8 2 Z-akseli 1.5 1 1 0.8 0.6 0.4 0.2 0 0.2 0.4 0.6 0.8 X-akseli Kuva 3.1. Aiemmin esitetyn kuvan 2.4(a) pistepilvestä otettu poikittainen leikkaus, jolle on tehty suoran sovite käyttäen PNS:ää. Kuvassa seinä on pisteet sovitesuoran yläpuolella, ja esineet sen alapuolella. Sovite on tehty ilman pisteiden karsintaa, ja voidaan sanoa, että suora on huomattavasti väärässä kohdassa. 3.1 Pienimmän neliösumman menetelmä Pienimmän neliösumman menetelmä (least squares) eli PNS on tilastollinen menetelmä sovittaa malli mittauspisteille. Malli sovitetaan näytteille niin, että näytteiden ja mallin välisten etäisyyksien neliö on mahdollisimman pieni. 3D-skannerilta saatavan pistepilven pisteet ovat kolmessa ulottuvuudessa, mutta yksinkertaistamisen vuoksi tässä aliluvussa esitellään PNS kaksiulotteiselle datalle. Kaksiulotteinen suora voidaan helposti yleistää kolmiulotteiseen tasoon lisäämällä kaavoihin yksi uusi koordinaattimuuttuja. Kun sovitettava malli on lineaarinen, kuten taso tai suora, on ratkaisu helppo löytää, sillä malli voidaan esittää matriisimuodossa. Tarkastellaan kaksiulotteisen avaruuden pistejoukkoa {(x 0, y 0 ),..., (x N 1, y N 1 )}. Optimaalinen suora y = ax + b on se suora, jonka kertoimet a ja b minimoivat lausekkeen N 1 (y n (a x n + b)) 2, (3.1) n=0
3. Menetelmät tasopinnan löytämiseksi 9 jossa N on pisteiden kokonaismäärä. Suoran tapauksessa ongelma on lineaarinen, ja voidaan esittää matriisiyhtälönä [9, s. 90] y 0 y 1. y N 1 = x 0 1 x 1 1.. x N 1 1 a b + ɛ. (3.2) Vastaavasti kuten kaksiulotteisessa tapauksessa suora, PNS:llä voidaan ratkaista kolmessa ulottuvuudessa tason, jonka yhtälö on muotoa z = ax+by+c, jolloin matriisiyhtälö on z 0 z 1. z N 1 = x 0 y 0 1 x 1 y 1 1... x N 1 y N 1 1 a b c + ɛ. (3.3) Molemmat mallit kaavoissa (3.2) ja (3.3) ovat yleisesti muotoa y = Hc + ɛ. (3.4) Mallin kertoimet c, eli suoran tapauksessa kulmakerroin ja y-akselin leikkauspiste, ratkaistaan laskemalla [10, s. 11 12] [9, s. 90] c = (H T H) 1 H T y. (3.5) Kertoimet vektorissa c ovat optimit, ja sovittavat suoran pisteilleen mahdollisimman tarkasti. Kuitenkin, kuten kuvassa 3.1 havainnollistettiin, karkeat virheet tai poikkeavat havainnot vaikuttavat edelleen kertoimiin, joten ne tulisi jättää huomiotta, eli niitä ei oteta mukaan riveiksi matriisiin H kaavassa (3.4). Seuraavaksi tutkitaan menetelmää, jolla voidaan automaattisesti poistaa poikkeavia havaintoja tarkastelusta.
3. Menetelmät tasopinnan löytämiseksi 10 3.2 Random Sample Consensus Random Sample Consensus eli RANSAC on menetelmä, jolla voidaan tehokkaasti sivuuttaa poikkeavia havaintoja lähestymällä mallinnusta satunnaisuuden avulla. Pääjulkaisun RANSACista ovat kirjoittaneet Fischler ja Bolles vuonna 1981. [1] RANSAC on robusti menetelmä, eli se toimii myös tilanteissa, joissa poikkeavia havaintoja on paljon. Menetelmä on on yleistettävissä moniulotteiseen dataan ja monimutkaisiinkin malleihin, ja siksi on hyvin käyttökelpoinen pistepilvidatan käsittelyssä. [1] RANSAC-menetelmä ei ole varsinaisesti algoritmi, vaikka sitä joissain lähteissä kutsutaankin algoritmiksi, vaan korkeamman tason lähestymistapa (paradigma) jota käytetään varsinaisen algoritmin suunnittelussa. Yleisellä tasolla RANSAC-menetelmä voidaan kuvata nelikohtaisella silmukalla [1, s. 383][11] Käyttäjän määrittämät parametrit: Pistepilvi P Virhetoleranssi e Kynnysarvo τ Iteraatiomaksimi N Alkuarvot: n 0 1. Arvo satunnaiset pisteet S n joukosta P, yhteensä niin monta kuin tarvitaan mallin parametriseen esitykseen. 2. Ratkaise mallin M n parametrit S n :n pisteistä. 3. Määritä kuinka monta pistettä on korkeintaan virhetoleranssin e etäisyydellä mallista. Nämä pisteet ovat konsensusjoukko Sn. 4. Jos konsensusjoukon koon suhde kaikkiin pisteisiin ylittää jonkin määritetyn kynnysarvon τ, niin laske sovite Mn käyttäen konsensusjoukkoa Sn. Muuten n n + 1 ja toista kohdasta 1 kohtaan 4 (korkeintaan N kertaa).
3. Menetelmät tasopinnan löytämiseksi 11 Tason tapauksessa kohdassa 1. arvotaan 3 pistettä, joista kohdassa 2. ratkaistaan tason yhtälö. Kaksiulotteisen avaruuden suoran tapauksessa arvotaan 2 pistettä ja ratkaistaan suoran yhtälö. Kohdassa 4. ei ole välttämätöntä laskea sovitetta M käyttäen konsensusjoukon S pisteitä, vaan sovitteeksi voidaan valita M. Mallin laskeminen kaikista konsensusjoukon pisteistä voi olla hidasta, joten vaiheen pois jättäminen nopeuttaa laskentaa. 3.2.1 Virhetoleranssi Virhetoleranssilla e määritetään miten kaukana esitetystä mallista M olevat pisteet lasketaan kuuluvaksi konsensusjoukkoon S n. Kun malli M on taso, jonka yhtälö on Ax+By+ Cz + D = 0, niin piste (x 0, y 0, z 0 ) kuuluu konsensusjoukkoon S n, jos e Ax 0 + By 0 + Cz 0 + D A2 + B 2 + C 2 (3.6) pätee. Ongelmana on datan heterogeenisyys. Jokainen mittaus on eri pistejoukko, ja siten sillä on eri lailla hajautuneet poikkeavat havainnot. Siitä syystä virhetoleranssin pitäisi olla eri joka mittauksella. Kuitenkin optimeissa virhetoleransseissa on suhteellisen pieni hajonta verrattuna pistejoukkojen karkeiden virheiden hajontaan, ja siksi vakio virhetoleranssi on yleensä riittävä. [1, s. 383-384] 3.2.2 Iteraatiomaksimi RANSAC löytää sitä suuremman konsensusjoukon mitä useamman iteraation käy läpi. Iteraatioiden hintana on kuitenkin aika, sillä suurten pistejoukkojen käsittely voi olla hidasta. [1, s. 384] 3.2.3 Kynnysarvo Kynnysarvo τ on konsensusjoukon koon suhde kaikkiin pisteisiin, ja on reaalilukuarvo väliltä [0, 1]. Pienempi kynnysarvo päättää konsensusjoukon etsinnän herkemmin, mutta voi antaa huonon konsensusjoukon. [1, s. 384] Kynnysarvoa ei ole välttämätöntä käyttää ollenkaan, vaan voidaan käyttää aina vakiomäärä iteraatioita, ja niistä valitaan se konsensusjoukko, jossa on eniten alkioita.
3. Menetelmät tasopinnan löytämiseksi 12 3.3 Suoran tunnistus pistepilvestä Havainnollistetaan RANSACin toimintaa esimerkillä kaksiulotteiselle kuvan 3.1 datalle. Pisteille yritetään sovittaa suoraa, eli yritetään löytää seinää. Esimerkkiajon tulokset on esitetty kuvassa 3.2. 0.00036848x + 0.00053144y + 0.00074467 = 0 Osumia: 85, 14.8601% 1.8 1.6 1.4 1.2 1) 2) 1.6 1.4 1.2 0.00056732x + 0.00276y + 0.004241 = 0 Osumia: 262, 45.8042% 1 0.5 0 0.5 1 0.5 0 0.5 1 1.6 1.4 1.2 0.0011559x + 0.0021962y + 0.0025245 = 0 Osumia: 100, 17.4825% 3) 4) 1 0.5 0 0.5 1.8 1.6 1.4 1.2 0.00059593x + 0.00276y + 0.0042504 = 0 Osumia: 352, 61.5385% 1 0.5 0 0.5 1 0.00059187x + 0.00276y + 0.004249 = 0 Osumia: 341, 59.6154% 5) 6) 0.0010628x + 0.0024686y + 0.0029304 = 0 Osumia: 67, 11.7133% 1.6 1.4 1.2 1 0.5 0 0.5 1 1.6 1.4 1.2 1 0.5 0 0.5 1.6 1.4 2.9802e 06x + 0.0012705y + 0.0015397 = 0 Osumia: 86, 15.035% 7) 8) 1.6 1.4 0.0016097x + 0.0028933y + 0.0042954 = 0 Osumia: 51, 8.9161% 1.2 1 0.5 0 0.5 1 1.2 Valittu satunnainen piste Virhetoleranssin rajat Käytetty soviteen laskentaan Tulkittu poikkeavaksi havainnoksi Suoran sovite 1 0.5 0 0.5 Kuva 3.2. Kaksiulotteiselle testidatalle ajettu RANSAC. N = 8, e = 0.03. Pisteiden kokonaislukumäärä on 572. Kynnysarvoa τ ei ole käytetty vaan iteraatioita on joka tapauksessa N kappaletta. Iteraatio 4) on saanut eniten osumia, joten sen antamat suoran kertoimet sen kertoimet ovat lopullinen tulos.
3. Menetelmät tasopinnan löytämiseksi 13 Valitaan N = 8 ja e = 0, 03 (metriä). Yksinkertaistuksen vuoksi kynnysarvoa τ ei määritetä ollenkaan, vaan tehdään aina N iteraatiota. Jokaisella iteraatiolla arvotaan kaikista pisteistä kaksi satunnaista pistettä, ja lasketaan näiden pisteiden läpi kulkevan suoran yhtälö. Lasketaan, mitkä pisteet ovat korkeintaan etäisyydellä e suorasta. Tallennetaan muistiin kuinka monta pisteitä on, ja käytetään niitä pisteitä PNS:ää suoran kertoimien laskentaan käyttäen vain näitä läheisiä pisteitä. Tätä toistetaan 8 kertaa, ja valitaan se iteraatio, jossa tuli eniten osumia. Tämän toteutuksen MATLAB-koodi on liitteessä 1. Esimerkkiajossa iteraatiot 2), 4) ja 5) ovat saanet satunnaiset pisteensä etsitylle seinälle, mutta näistä 4):llä on eniten osumia pisteille, joten sen pisteitä käytetään suoran mallin laskentaan PNS:llä. 3.4 Pinnan tunnistus etäisyyskuvasta Tason sovite voidaan löytää myös ilman, että etäisyyskuvaa muutetaan välillä pistepilveksi. Samoin kuin taso voidaan määrittää kolmiulotteisessa avaruudessa kolmella mielivaltaisella pisteellä, voidaan etäisyyskuvasta valita mitkä tahansa kolme pikseliä, jolla on jokin nollasta poikkeava etäisyysarvo, ja niiden perusteella määrittää sovitekuva. Sovitekuva siis vastaa tasoa. Kuvassa 3.3(a) on valittu kolme pikseliä. Pikseleille sovelletaan kaavaa (3.3) niin, että pikselien rivi on x n, sarake on y n ja arvo on z n, n ollessa 0 2. Kertoimet c= [a, b, c] T ratkaistaan kaavalla (3.5). Täten saadaan sovitekuvalle arvot z yx = ax + by + c (3.7) jokaiselle pikselille. Kuvassa 3.3(b) on esitetty sovitekuva. Tason sovitekuva muistuttaa liukuvärikuvaa. Konsensusjoukon löytämiseksi etäisyyskuvan ja sovitekuvan vastaavat pikselit vähennetään toisistaan, ja jos tulos on itseisarvoltaan vähemmän kuin virhetoleranssi, on se pikseli osa konsensusjoukkoa. Eli jos pätee e d vu d vu (3.8) on pikseli osa konsensusjoukkoa. Kaavassa on e virhetoleranssi, d vu on etäisyyskuvan pikseli ja d vu sovitekuvan pikseli kuvan koordinaatissa (u, v). Kuvassa 3.3(c) on esitetty
3. Menetelmät tasopinnan löytämiseksi 14 (a) (b) (c) Kuva 3.3. (a) Etäisyyskuva, johon on merkitty valitut 3 pikseliä, joista tehdään sovitekuva. (b) Sovitekuva samat pikselit merkittynä kuin a:ssa. (c) Konsensusjoukko, joka on laskettu kaavan (3.8) mukaisesti, kun virhetoleranssi e = 2. konsensusjoukko (valkoiset pikselit), kun virhetoleranssi on e = 2. Kuvan (a)-kohdassa valitut pikselit ovat kaikki osuneet seinälle, joten (c)-kohdassa lähes koko seinän alue on valkoinen. Tällaisen RANSAC-toteutuksen koodi on liitteessä 2. Esimerkkiajo on kuvassa 3.4. Iteraatioissa 3) ja 4) on satunnaiset pisteet selvästi osuneet kaikki seinälle, mutta näistä 3):ssa enemmän. Sen konsensusjoukosta lasketaan tason sovite. Toteutuksella, jossa ei etäisyyskuvaa muunneta pistepilveksi välillä, on joitain etuja verrattuna pistepilveä käyttävään toteutukseen. Ensinnäkin pelkällä kuvadatalla laskeminen on nopeaa. Pistepilven käsittely on hidasta, kun konsensusjoukkoa etsiessä on laskettava pisteen etäisyys suorasta jokaiselle pisteelle. Kuvissa etäisyyden laskeminen, sillä tavalla kuin se on liitteessä 2 toteutettu, kestää noin 1/100 ajasta laskea sovite verrattuna liitteen 1 toteutukseen. Toteutuksessa on myös ongelmia. Pisteiden etäisyys mallista mitataan kamerasta katsoen pituussuunnassa, eikä pisteen ja tason välisen normaalin suunnassa. Ero ei kuitenkaan ole merkityksellinen, jos etäisyyskuvan pinta on lähes kohtisuorassa kameraan, kuten esimerkkikuvan tapauksessa. Myös niissä tapauksissa, kun pistepilvi on koottu useammasta etäisyyskuvasta, ei voida tätä menetelmää käyttää siten, että kaikki etäisyyskuvat olisivat mukana laskennassa, vaan on käytettävä pistepilvitoteutusta.
3. Menetelmät tasopinnan löytämiseksi 15 z:x,y%=== 0.62975*x=+=1.189*y=+= 119.2908 Osumia:=2093,=0.69136=+ 1% 2% z:x,y%===0.017108*x=+= 0.076414*y=+=62.0716 Osumia:=43701,=14.4353=+ z:x,y%=== 0.017873*x=+=0.013628*y=+=52.7232 Osumia:=150600,=49.7463=+ 3% z:x,y%=== 0.021768*x=+=0.01544*y=+=53.2321 Osumia:=145721,=48.1347=+ 4% z:x,y%=== 0.041262*x=+= 0.019039*y=+=64.7963 Osumia:=65540,=21.6492=+ 5% 6% z:x,y%=== 0.010396*x=+= 0.10981*y=+=88.1917 Osumia:=45431,=15.0068=+ z:x,y%===0.083442*x=+=0.11012*y=+= 33.0016 Osumia:=15260,=5.0407=+ 7% 8% z:x,y%=== 0.0086269*x=+= 0.094177*y=+=80.6966 Osumia:=47960,=15.8422=+ Käytetty=sovitteen=laskentaan Tulkittu=poikkeavaksi=havainnoksi Kuva 3.4. Kaksiulotteiselle testidatalle ajettu RANSAC. N = 8, e = 2. Pikseleiden kokonaislukumäärä on 302736. Iteraatio 3) on saanut eniten osumia, joten sen antamat tason kertoimet ovat lopullinen tulos.
16 4 YHTEENVETO Tässä työssä esiteltiin vaiheet, joita tarvitaan kun estitään tasaista pintaa etäisyyskuvasta. Etäisyyskuva saadaan muun muassa Microsoft Kinect -peliohjaimelta, joka käyttää infrapunalaserprojektoria ja infrapunakameraa etäisyyskuvan muodostamiseen. Etäisyyskuvasta voidaan luoda pistepilvi, joka tekee etäisyyskuvasta aidosti kolmiulotteisen esityksen. Käyttämällä jotain regressioanalyysiä, kuten pienimmän neliösumman menetelmää (PNS) pistepilvidatalle, voidaan seinä, lattia ja muut tasainen pinta muuttaa matemaattiseksi tasoksi, eli laskea sille sovite. Pisteitä on tyypillisesti kuitenkin muualtakin kuin pinnalta, jolloin regressioanalyysi antaa vääristyneen tuloksen. Jotta muista kuin tasopintaan kuulumattomista pisteistä päästään eroon, esiteltiin työssä Random Sample Consensus -menetelmä (RANSAC), jolla voidaan jättää huomiotta pistepilven karkeat virheet ennen regressioanalyysiä. Työssä esiteltiin tapa käyttää RAN- SACia pinnan etsimiseen ilman, että etäisyyskuvaa muunetaan pistepilveksi. Ilman pistepilvimuunnosta menetelmä nopeutuu huomattavasti. Testitapauksessa olleesta kuvasta löytyy helposti suurin taso, eli taustalla oleva seinä. Työn toteutukselle ei suoraan löydy käyttökelpoista sovellusta, vaan toteutusta täytyy jatkokehittää. Nyt menetelmä ei löydä kuin korkeintaan yhden tason, vaikka tosiasiassa etäisyyskuvassa voi olla useampia selkeitä pintoja, joista mikään ei ole pääosassa. Jatkokehityskohteita olisi useamman pinnan löytäminen samasta etäisyyskuvasta, ja epätasaisten pintojen tunnistaminen, kuten kaarevat pinnat tai pallopinnat. Menetelmiä tulisi myös testata useammalla kuin yhdellä etäisyyskuvalla.
17 LÄHTEET [1] Martin A. Fischler and Robert C. Bolles. Random sample consensus: a paradigm for model fitting with applications to image analysis and automated cartography. Commun. ACM, 24(6):381 395, June 1981. [2] Lightfarmer & Pbrocks13. File:1-stripesx7.svg - Wikimedia Commons [WWW]. [viitattu 25.3.2012]. Saatavissa: http://commons.wikimedia.org/wiki/file: 1-stripesx7.svg. [3] Evan-Amos. File:Xbox-360-Kinect-Standalone.png - Wikimedia Commons [WWW]. [viitattu 25.3.2012]. Saatavissa: http://commons.wikimedia.org/wiki/file: Xbox-360-Kinect-Standalone.png. [4] Pat. WO 2008/120217. Depth mapping using projected patterns. Prime Sense Ltd., Tel Aviv (IL). (Barak Freedman, Alexander Shpunt, Meir Machline, Yoel Arieli). Hak.nro IL 2008/000458, 2.4.2008 (9.10.2008). 28 s. [5] PrimeSense Ltd. FAQ - PrimeSense [WWW]. [viitattu 21.4.2013]. Saatavissa: http: //www.primesense.com/solutions/faq/. [6] Nicolas Burrus. Nicolas Burrus Homepage - Kinect Calibration [WWW]. [viitattu 22.6.2013]. Saatavissa: http://nicolas.burrus.name/index.php/research/ KinectCalibration. [7] P.J. Besl and Neil D. McKay. A method for registration of 3-d shapes. Pattern Analysis and Machine Intelligence, 14(2):239 256, February 1992. [8] R. Mencl and H. Muller. Interpolation and approximation of surfaces from threedimensional scattered data points. In Scientific Visualization Conference, pages 223 233, Dagstuhl, Germany, June 1997. [9] Heikki Huttunen. Signaalinkäsittelyn sovellukset. Tampereen teknillinen yliopisto. Signaalinkäsittelyn laitos. Opetusmoniste vol. 2011:1, Tampere, 1 134. [10] Trevor Hastie, Robert Tibshirani, and Jerome Friedman. The Elements of Statistical Learing. Springer Series in Statistics, Stanford, California USA, 2nd edition, 2009.
18 [11] Konstantinos G. Derpanis. Overview of the ransac algorithm. Technical report, University http://www.cse.yorku.ca/~kosta/compvis_notes/ransac.pdf, May 2010.
19 LIITE 1: RANSAC KAKSIULOTTEISELLE PISTEPILVELLE 1 function [ lineparameters, matchingpointnums ]... 2 = ransacline(pointcloud, tolerancedistance, cyclecount) 3 % Parametri pointcloud on Nx2-matriisi, jossa on yksi rivi kuvaa 4 % pistettä. Pisteen koordinaatit ovat sarakkeissa. 5 6 % Selvitetään pilven pisteiden lukumäärä 7 pointcount = size( pointcloud, 1 ); 8 9 % Paluuarvoon taulukoidaan suorat siten että yksi rivi on suoran 10 % kertoimet [a b c] funktiossa ax + bx + c = 0. 11 lineparameters = zeros(cyclecount, 3); 12 13 % lineparametersin vastaavan rivin pisteet, jotka ovat 14 % toleranssin sisällä kertoimien määräämästä suorasta. 15 matchingpointnums = zeros(cyclecount, 1); 16 17 for cycle = 1:cycleCount 18 19 % Valitse satunnaiset kaksi pistettä (jotka eivät ole samat). 20 randpointindices = randperm( pointcount, 2 ); 21 chosenpoints = pointcloud( randpointindices, : ); 22 23 % Määritä pisteiden läpi kulkevan suoran yhtälö 24 a_rans = -chosenpoints(2,2) + chosenpoints(1,2); 25 b_rans = chosenpoints(2,1) - chosenpoints(1,1); 26 c_rans = chosenpoints(1,1)*chosenpoints(2,2)... 27 - chosenpoints(2,1)*chosenpoints(1,2); 28 29 30 % Määritetään pisteiden etäisyydet suoraan ja tallennetaan 31 % riittävän läheiset pisteet muistiin. 32 distances = zeros(pointcount, 1);
20 33 matches = []; 34 for n = 1:pointCount 35 % Laske etäisyys tähän pisteeseen ja tallenna tieto 36 % jos se on vähemmän kuin virhetoleranssi. 37 distances(n) = abs( a_rans*pointcloud(n,1)... 38 + b_rans*pointcloud(n,2) + c_rans )... 39 / norm([a_rans b_rans]); 40 41 if distances(n) < tolerancedistance 42 matchingpointnums(cycle) = matchingpointnums(cycle)+1; 43 matches = [matches ; pointcloud(n,:)]; 44 end 45 end 46 47 % Estimoidaan suora käyttäen PNS:ää 48 H = [matches(:,1) ones(length(matches),1)]; 49 c = inv(h'*h) * H'*matches(:,2); 50 y_est = H*c; 51 52 % Määritä estimoidun suoran funktio ax + bx + c = 0 53 a = -y_est(2) + y_est(1); 54 b = matches(2) - matches(1); 55 c = matches(1)*y_est(2) - matches(2)*y_est(1); 56 57 % Tallennetaan kertoimet paluuarvon taulukkoon 58 lineparameters(cycle, :) = [a b c]; 59 60 end % for 61 62 end % function
21 LIITE 2: RANSAC ETÄISYYSKUVALLE 1 function [ planeparameters, matchingpointnums ]... 2 = ransacrangeimage(rangeimage, tolerancedistance, cyclecount) 3 % 'rangeimage' Harmaasävyinen etäisyyskuva 4 % 'tolerancedistance' Etäisyysparametri 5 % 'cyclecount' RANSAC-iteraatioiden määrä. 6 7 planeparameters = []; 8 matchingpointnums = []; 9 10 for cycle = 1:cycleCount 11 12 % Valitaan satunnaiset 3 pistettä, joiden arvo ei ole 0. 13 randomcoords = zeros(3,2); 14 for n = 1:3 15 while (exist('x', 'var') && exist('y','var'))... rangeimage(y,x) == 0 16 x = randi(size(rangeimage,2)); 17 y = randi(size(rangeimage,1)); 18 end 19 randomcoords(n,:) = [x y]; 20 clear x; 21 clear y; 22 end 23 24 % Tallennetaan randomcoords pisteiden arvot. 25 distances = [rangeimage(randomcoords(1,2), randomcoords(1,1));... 26 rangeimage(randomcoords(2,2), randomcoords(2,1));... 27 rangeimage(randomcoords(3,2), randomcoords(3,1))]; 28 % Ratkaistaan tason z(x,y) = c1*x + c2*y + c3 kertoimet... käyttäen PNS:ää 29 H = double([randomcoords ones(3,1)]); 30 c = inv(h'*h) * H' * double(distances); 31 32 % Generoidaan tason funktion mukainen matriisi z.
22 33 z = zeros(size(rangeimage)); 34 for x = 1:size(rangeImage,2) 35 for y = 1:size(rangeImage, 1) 36 z(y,x) = c(1)*x + c(2)*y + c(3); 37 end 38 end 39 40 % Haetaan mitkä pisteet ovat lähellä tasoa. 41 onplane = abs((double(rangeimage)-z)) < tolerancedistance; 42 43 % Tallennetaan tason parametrit ja konsensusjoukon pikseleiden... lukumäärä. 44 planeparameters = [planeparameters; c'] 45 matchingpointnums = [matchingpointnums; nnz(onplane)]; 46 47 end % for 48 49 end % function