Opi OpenCV:tä

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.

Kuva 1 : Kaksi kuvaa 3D-tasosta ( kirjan yläosa ) liittyvät toisiinsa homografialla

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.

Kuva 2 : Yksi 3D-tason kuva voidaan yhdenmukaistaa toisen saman tason kuvan kanssa käyttämällä homografiaa

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

Kuva 3. Perspektiivikorjaus

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:

  1. Kirjoita käyttöliittymä kirjan neljän kulman keräämistä varten. Kutsutaan näitä pisteitä pts_src
  2. 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)
  3. Saatamme homografian käyttämällä pts_src ja pts_dst .
  4. Sovellamme homografiaa lähdekuvaan, jolloin saamme kuvan 3 mukaisen kuvan.
Voit ladata tässä postauksessa käytetyn koodin ja kuvat tilaamalla uutiskirjeemme täältä.

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.

Kuva 4. Ensimmäinen internetiin ladattu kuva.

Ja kuvassa 5. näkyy The Times Square.

Kuvassa 5. on The Times Square. The Times Square
Voit ladata koodin (C++ & Python) ja kuvat, joita käytettiin tässä esimerkissä ja muissa tässä postauksessa olevissa esimerkeissä, tilaamalla uutiskirjeemme täältä.

Voidaan korvata yksi The Times Squaren mainostauluista haluamallamme kuvalla. Tässä ovat vaiheet.

  1. Kirjoita käyttöliittymä, joka kerää kuvassa olevan mainostaulun neljä kulmaa. Kutsutaan näitä pisteitä pts_dst
  2. 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)
  3. Saatetaan homografia käyttäen pts_src ja pts_dst .
  4. 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.

Kuvan 6. Virtuaalinen mainostaulu. Yksi vasemmanpuoleisista mainostauluista on korvattu valitsemallamme kuvalla.

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

  1. Kuvassa 4. oleva kuva oli ensimmäinen valokuvakuva, joka ladattiin internetiin. Se täyttää oikeudenmukaisen käytön edellytykset.
  2. Kuvassa 5 käytetty kuva. ( The Time Square ) on GFDL-lisensoitu.

Vastaa

Sähköpostiosoitettasi ei julkaista.