5.22. Linssin ja perspektiivin korjaus

Kaksi geometrisen korjauksen luokkaa vääristää kuvaa tavoilla, joihin suorakaiteesta-suorakaiteeksi -kuvaus ei kykene. Linssikorjaus poistaa säteittäisen vääristymän, jonka todellinen laajakulmalinssi tuottaa – kalansilmäpullistuman, joka taivuttaa näkymän suorat viivat näkyviksi kaariksi lähellä kehyksen kulmia. Perspektiivikorjaus poistaa keystone-ilmiön, joka syntyy kun linssi ei osoita kohtisuoraan näkymään – puolisuunnikkaan muotoisen vääristymän, joka muuttaa maailman tunnetun suorakaiteen kuvassa ei-suorakaiteiseksi blobiksi. Molemmat korjaukset kumoavat kaappauksen jälkeen vaikutuksia, jotka ovat alkuperältään optisia.

5.22.1. Säteittäinen linssivääristymä

Todellisten linssiefektien aineisto kuvaa tynnyrivääristymää, jonka edulliset laajakulmalinssit tuottavat. Lähellä kehyksen keskustaa olevat pikselit ovat suunnilleen siellä, missä neulanreikämalli ennustaa; lähellä reunoja olevat pikselit ovat taipuneet ulospäin määrällä, joka kasvaa optisesta akselista mitatun säteittäisen etäisyyden neliön mukana. Näkymän suora viiva, joka kulkee lähellä kehyksen reunaa, kaartuu näkyvästi kaapatussa kuvassa, ja mikä tahansa klassinen konenäköalgoritmi, joka olettaa suorien viivojen pysyvän suorina – AprilTag-kulmantunnistus, reunan seuraaminen, viivaa seuraava navigointi – antaa väärän vastauksen lähellä kulmia.

lens_corr() kumoaa vääristymän. Metodi suorittaa käänteiskuvauksen: jokainen ulostulopikseli näytteistetään siitä syötteen sijainnista, josta linssi olisi taivuttanut sen ulospäin, ja tuloksena on geometrisesti suora kuva.

img.lens_corr(strength=1.8)

strength-parametri on korjauksen ydin. Se on yksittäinen luku, joka kuvaa kuinka voimakkaasti linssi taivuttaa; arvo lähellä lukua 1.0 on lievä korjaus kohtalaisen laajalle linssille, ja arvot noin lukuun 2.0 asti ovat järkeviä voimakkaalle kalansilmälle. Oletusarvo 1.8 on järkevä lähtökohta vakio-OpenMV Cam -linsseille; oikea arvo millekään tietylle linssille selviää kokeilemalla muutamaa ja katsomalla kuvaa.

Kaksi sivuparametria ovat yleensä oletusarvoissaan kunnossa. zoom (oletus 1.0) skaalaa ulostuloa – ykköstä suurempi arvo rajaa ulospäin kompensoidakseen sitä, miten linssikorjaus työntää kulmia kauemmas ulos; pienemmät arvot jättävät enemmän korjatusta näkymästä näkyviin sillä hinnalla, että kuvan reunoille tulee tyhjiä pikseleitä. x_corr ja y_corr siirtävät korjauksen keskipistettä pois kuvan geometrisesta keskustasta, mikä on hyödyllistä kun linssi ei ole optisesti keskitetty sensorin päälle (epätavallinen tapaus, mutta hyvä tietää).

Tyypillinen putki: kaappaa, suorita lens_corr() kerran suoristaaksesi geometrian ja suorita sitten mitä sovellus tuloksella oikeasti tekeekin.

5.22.2. 3D-kierron korjaus

Toinen geometrisen vääristymän luokka on perspektiivivääristymä, joka syntyy kun sensoritaso ei ole yhdensuuntainen näkymätason kanssa. Klassinen tapaus on alhaalta katsottu kyltti tai rekisterikilpi: kyltin yläosa on kauempana linssistä kuin alaosa, joten se projisoituu pienempänä, ja kaapattu kuva näyttää suorakaiteen puolisuunnikkaana, jonka yläreuna on lyhyempi kuin alareuna.

Korjaus on soveltaa kaapattuun kehykseen 3D-kiertoa, joka virtuaalisesti suuntaa sensoritason uudelleen yhdensuuntaiseksi näkymätason kanssa. Matematiikka on sama perspektiivikuvaus, jota AprilTag-tunnistus käyttää palauttaakseen tunnisteen asennon sen neljästä kulmasta, suoritettuna käänteisesti: annettuna kierto, operaatio kuvaa jokaisen ulostulopikselin takaisin siihen syötteen sijaintiin, josta kierto sen olisi tuonut.

rotation_corr() suorittaa tuon korjauksen:

img.rotation_corr(x_rotation=10.0, y_rotation=0.0, z_rotation=0.0)

Kolme kiertoparametria ovat asteissa ja kuvaavat kiertoja kuvaan keskitetyn virtuaalisen kameran x-, y- ja z-akselien ympäri. x_rotation kallistaa kameraa ylös tai alas (luonnollinen korjaus seinän maanpinnan tasolta otettuun kuvaan); y_rotation kääntää kameraa vasemmalle tai oikealle; z_rotation kiertää kameraa sen optisen akselin ympäri (luonnollinen korjaus epätasaiselle kiinnitykselle).

x_translation ja y_translation siirtävät virtuaalista kameraa sivusuunnassa kiertämättä sitä. zoom (oletus 1.0) skaalaa ulostuloa. fov (oletus 60.0) kuvaa kameran pystysuuntaista näkökenttää, jota käytetään projektion laskemiseen – arvon tulisi vastata todellista linssiä, jotta geometria pysyy yhtenäisenä.

Mielivaltaista kallistuksen ja käännön yhdistelmää varten useat nollasta poikkeavat kierrot yhdistyvät yhdessä kutsussa. Operaatioiden järjestys on kiinteä toteutuksen sisällä; sovellus vain antaa kulmat ja tulos tulee ulos.

5.22.3. Tunnetun suorakaiteen oikaisu

Yleisimmin hyödyllinen rotation_corr() -metodin muoto on corners=-avainsana, joka ottaa listan neljästä (x, y)-monikosta, jotka kuvaavat syötekuvassa olevan tunnetun suorakaiteen kulmat. Metodi laskee, mikä 3D-kierto olisi kuvannut todellisen suorakaiteen noihin tiettyihin neljään pisteeseen, soveltaa kyseisen kierron käänteismuotoa koko kuvaan ja palauttaa tuloksen, jossa tunnettu suorakaide on jälleen suorakaiteinen:

plate_corners = [(45, 80), (300, 60), (310, 180), (40, 200)]
img.rotation_corr(corners=plate_corners)

Klassinen käyttötapa on juuri se, mitä nimi vihjaa: vinosta kulmasta kuvattu rekisterikilpi (tai mikä tahansa muu suorakaiteinen piirre). Aiempi vaihe tunnistaa kilven ja ilmoittaa sen neljä kulmasijaintia kaapatussa kuvassa; noiden kulmien välittäminen metodille rotation_corr() tuottaa kuvan, jossa kilpi istuu todellisena suorakaiteena, valmiina mihin tahansa seuraavaan merkintunnistuksen tai mallin sovituksen vaiheeseen.

Kun neljän kulman muoto ratkaisee ongelman, jota sovellus yrittää ratkaista, se on dramaattisesti hyödyllisempi kuin kuuden parametrin muoto. Sovelluksen ei tarvitse arvioida mitään kiertokulmia; se vain antaa metodille neljä pistettä ja antaa metodin selvittää loput. Kuuden parametrin muoto on hyödyllinen, kun näkymässä ei ole näkyvissä mitään tunnistettavaa suorakaidetta ja kierto on viritettävä käsin ulkoisen tiedon perusteella (esimerkiksi kalibroidun kiinnityskulman).