Baabelin torni oli Raamatun myyttisen tarinan mukaan ihmisen ensimmäinen tekninen katastrofi. Projektissa oli kaikki loistavat ominaisuudet: selkeä tehtävä, paljon työvoimaa, ei aikarajoituksia ja riittävä teknologia ( tiilet ja laasti ). Silti se epäonnistui näyttävästi, koska Jumala sekoitti ihmistyöntekijöiden kielen, eivätkä he enää kyenneet kommunikoimaan keskenään.
Termit kuten ”homografia” muistuttavat minua usein siitä, miten kamppailemme edelleen kommunikaation kanssa. Homografia on yksinkertainen käsite, jolla on outo nimi!
Mitä on homografia?
Tarkastellaan kahta kuvaa tasosta (kirjan yläosa), jotka on esitetty kuvassa 1. Punainen piste edustaa samaa fyysistä pistettä kahdessa kuvassa. Tietokonenäköjargonissa kutsumme näitä vastaavia pisteitä. Kuvassa 1. on neljä vastaavaa pistettä neljällä eri värillä – punainen, vihreä, keltainen ja oranssi. Homografia on muunnos ( 3×3 matriisi ), joka kuvaa yhden kuvan pisteet toisen kuvan vastaaviin pisteisiin.
Nyt koska homografia on 3×3 matriisi, voimme kirjoittaa sen seuraavasti
Tarkastellaan ensimmäistä vastaavien pisteiden joukkoa – ensimmäisessä kuvassa ja toisessa kuvassa. Silloin homografia kartoittaa ne seuraavalla tavalla
Kuvien kohdistaminen homografian avulla
Yllä oleva yhtälö pätee KAIKILLE vastaavien pisteiden joukoille, kunhan ne sijaitsevat samassa tasossa reaalimaailmassa. Toisin sanoen voit soveltaa homografiaa ensimmäiseen kuvaan ja ensimmäisessä kuvassa oleva kirja kohdistuu toisessa kuvassa olevaan kirjaan! Katso kuva 2.
Mutta entä pisteet, jotka eivät ole tasolla ? No, niitä EI kohdisteta homografialla, kuten kuvasta 2 näkyy. Mutta hetkinen, entä jos kuvassa on kaksi tasoa ? No, silloin sinulla on kaksi homografiaa – yksi kummallekin tasolle.
Panorama : Homografian sovellus
Edellisessä kappaleessa opimme, että jos tunnemme kahden kuvan välisen homografian, voimme vääristää toisen kuvan toisen kuvan päälle. Siinä oli kuitenkin yksi suuri varoitus. Kuvien piti sisältää taso ( kirjan yläosa ), ja vain tasomainen osa oli kohdistettu oikein. Kävi ilmi, että jos otat kuvan mistä tahansa kohtauksesta ( et vain tasosta ) ja otat sitten toisen kuvan kääntämällä kameraa, nämä kaksi kuvaa liittyvät toisiinsa homografian avulla! Toisin sanoen voit asentaa kameran jalustalle ja ottaa kuvan. Seuraavaksi käännä sitä pystyakselin ympäri ja ota toinen kuva. Kaksi juuri ottamaasi kuvaa täysin mielivaltaisesta 3D-kuvasta liittyvät toisiinsa homografian avulla. Näillä kahdella kuvalla on joitakin yhteisiä alueita, jotka voidaan kohdistaa ja yhdistää, ja bingo, sinulla on kahden kuvan panoraama. Onko se todella niin helppoa? Ei! (Anteeksi, että tuotan pettymyksen) Hyvän panoraamakuvan luomiseen liittyy paljon muutakin, mutta perusperiaatteena on kohdistaa kuvat homografian avulla ja ommella ne älykkäästi niin, että saumat eivät näy. Panoraamojen luominen on varmasti osa tulevaa postausta.
Miten lasketaan homografia?
Kahden kuvan välisen homografian laskemiseksi sinun on tiedettävä vähintään 4 pisteen vastaavuudet kahden kuvan välillä. Jos sinulla on enemmän kuin 4 vastaavaa pistettä, se on vielä parempi. OpenCV arvioi robustisti homografian, joka sopii parhaiten kaikkiin vastaaviin pisteisiin. Yleensä nämä pisteiden vastaavuudet löydetään automaattisesti sovittamalla kuvien välille SIFTin tai SURFin kaltaisia piirteitä, mutta tässä postauksessa klikkaamme pisteitä yksinkertaisesti käsin.
Katsotaan ensin käyttöä.
C++
Python
Katsotaan kattavampi esimerkki sekä C++:lla että Pythonilla.
OpenCV C++ homografiaesimerkki
Kuvan 2. kuvat voidaan tuottaa seuraavalla C++-koodilla. Alla oleva koodi näyttää, miten kahdesta kuvasta otetaan neljä vastaavaa pistettä ja loimennetaan kuva toisen kuvan päälle.
OpenCV Python Homography Example
Kuvan 2. kuvat voidaan tuottaa myös käyttämällä seuraavaa Python-koodia. Alla oleva koodi näyttää, miten kahdesta kuvasta otetaan neljä vastaavaa pistettä ja loimitaan kuva toisen kuvan päälle.
Homografian sovelluksia
Homografian mielenkiintoisin sovellus on epäilemättä panoraamojen tekeminen ( eli kuvien mosaiikointi ja kuvien ompelu ). Panoraamat ovat myöhemmän postauksen aiheena. Katsotaanpa muutamia muita mielenkiintoisia sovelluksia.
Perspektiivin korjaus homografian avulla
Asettakaamme, että meillä on kuvassa 1 esitetty valokuva. Eikö olisi hienoa, jos voisit napsauttaa kirjan neljää kulmaa ja saada nopeasti kuvan, joka näyttää kuvan 3 kaltaiselta. Saat tämän esimerkin koodin alla olevasta latausosiosta. Tässä ovat vaiheet:
- Kirjoita käyttöliittymä kirjan neljän kulman keräämistä varten. Kutsutaan näitä pisteitä pts_src
- Meidän on tiedettävä kirjan kuvasuhde. Tämän kirjan kuvasuhde ( leveys / korkeus ) on 3/4. Voimme siis valita lähtökuvan kooksi 300×400 ja kohdepisteiksemme ( pts_dst ) (0,0), (299,0), (299,399) ja (0,399)
- Saatamme homografian käyttämällä pts_src ja pts_dst .
- Sovellamme homografiaa lähdekuvaan, jolloin saamme kuvan 3 mukaisen kuvan.
Virtuaalinen mainostaulu
Monissa televisiossa televisioiduissa urheilutapahtumissa mainoksia lisätään virtuaalisesti suoraan videosyöttöön. Esimerkiksi jalkapallossa ja pesäpallossa pieniin mainostauluihin sijoitetut mainokset aivan kentän rajojen ulkopuolella voidaan virtuaalisesti vaihtaa. Sen sijaan, että kaikille näytettäisiin sama mainos, mainostajat voivat valita näytettävät mainokset henkilön demografisten tietojen, sijainnin jne. perusteella. Näissä sovelluksissa videossa havaitaan mainostaulun neljä kulmaa, jotka toimivat kohdepisteinä. Mainoksen neljä kulmaa toimivat lähdepisteinä. Näiden neljän vastaavan pisteen perusteella lasketaan homografia, jota käytetään mainoksen vääristämiseen videokuvaan.
Lukemalla tämän viestin sinulla on luultavasti käsitys siitä, miten kuva laitetaan virtuaaliseen mainostauluun. Kuvassa 4. näkyy ensimmäinen kuva, joka on ladattu internetiin.
Ja kuvassa 5. näkyy The Times Square.
Voidaan korvata yksi The Times Squaren mainostauluista haluamallamme kuvalla. Tässä ovat vaiheet.
- Kirjoita käyttöliittymä, joka kerää kuvassa olevan mainostaulun neljä kulmaa. Kutsutaan näitä pisteitä pts_dst
- Tulkoon virtuaaliseen mainostauluun kiinnitettävän kuvan koko w x h. Kuvan ( pts_src ) kulmat ( pts_src ) ovat siis (0,0), (w-1,0), (w-1,h-1) ja (0,h-1)
- Saatetaan homografia käyttäen pts_src ja pts_dst .
- Sovelletaan homografiaa lähdekuvaan ja sekoitetaan se kohdekuvaan, jolloin saadaan kuvan 6 mukainen kuva.
Huomaa, että kuvassa 6. olemme lisänneet kuvassa 4. esitetyn kuvan Times Square -kuvaan.
Tilaa & Lataa koodi
Jos pidit tästä artikkelista ja haluat ladata koodia (C++ ja Python) ja esimerkkikuvia, joita tässä postauksessa on käytetty, tilaa uutiskirjeemme. Saat myös ilmaisen Computer Vision Resource -oppaan. Uutiskirjeessämme jaamme C++/Python-kielellä kirjoitettuja OpenCV-oppaita ja -esimerkkejä sekä tietokonenäön ja koneoppimisen algoritmeja ja uutisia.
Tilaa nyt
Kuvan krediitit
- Kuvassa 4. oleva kuva oli ensimmäinen valokuvakuva, joka ladattiin internetiin. Se täyttää oikeudenmukaisen käytön edellytykset.
- Kuvassa 5 käytetty kuva. ( The Time Square ) on GFDL-lisensoitu.