5.22. Korekcija leće i perspektive

Dvije skupine geometrijske korekcije iskrivljuju sliku na način koji preslikavanje pravokutnika u pravokutnik ne može postići. Korekcija leće poništava radijalnu distorziju koju unosi stvarna širokokutna leća – ispupčenje tipa riblje oko koje ravne linije scene savija u vidljive krivulje blizu kutova sličice. Korekcija perspektive poništava trapezni efekt koji nastaje kada leća nije usmjerena okomito na scenu – trapezno izobličenje koje poznati pravokutnik u stvarnom svijetu pretvara u nepravokutnu mrlju na slici. Obje korekcije naknadno, nakon dovršenog snimanja, poništavaju efekte koji su optičkog porijekla.

5.22.1. Radijalna distorzija leće

Gradivo stvarni efekti leće opisuje bačvastu distorziju koju unose jeftine širokokutne leće. Pikseli blizu središta sličice otprilike su ondje gdje predviđa model rupice (pinhole); pikseli blizu rubova izbočeni su prema van za iznos koji raste s kvadratom radijalne udaljenosti od optičke osi. Ravna linija u sceni koja prolazi blizu ruba sličice vidljivo se zakrivljuje na snimljenoj slici, a svaki klasični algoritam strojnog vida koji pretpostavlja da ravne linije ostaju ravne – detekcija kutova AprilTag oznaka, praćenje rubova, navigacija praćenjem linije – daje pogrešan rezultat blizu kutova.

lens_corr() poništava distorziju. Metoda pokreće inverzno preslikavanje: svaki izlazni piksel uzorkuje se s položaja u ulazu iz kojeg bi ga leća izbočila prema van, a rezultat je geometrijski ispravljena slika.

img.lens_corr(strength=1.8)

Parametar strength srž je korekcije. To je jedan broj koji opisuje koliko snažno leća izbočuje sliku; vrijednost blizu 1.0 blaga je korekcija za umjereno širokokutnu leću, a vrijednosti do otprilike 2.0 razumne su za jako riblje oko. Zadana vrijednost 1.8 razumna je polazna točka za tvorničke leće OpenMV Cam uređaja; ispravna vrijednost za bilo koju konkretnu leću stvar je isprobavanja nekoliko vrijednosti i promatranja slike.

Dva pomoćna parametra obično su u redu sa svojim zadanim vrijednostima. zoom (zadano 1.0) skalira izlaz – vrijednost veća od jedan obrezuje prema van kako bi kompenzirala način na koji korekcija leće gura kutove dalje prema van; manje vrijednosti ostavljaju vidljivim više ispravljene scene uz cijenu uključivanja praznih piksela na rubovima slike. x_corr i y_corr pomiču središte korekcije od geometrijskog središta slike, što je korisno kada leća nije optički centrirana iznad senzora (neuobičajen slučaj, no vrijedan poznavanja).

Tipičan tijek obrade: snimi, jednom pokreni lens_corr() da se geometrija ispravi, a zatim pokreni što god aplikacija zapravo radi s rezultatom.

5.22.2. Korekcija 3D rotacije

Druga skupina geometrijske distorzije jest perspektivno izobličenje koje nastaje kada ravnina senzora nije paralelna s ravninom scene. Klasičan je slučaj znak ili registarska pločica gledana odozdo: vrh znaka udaljeniji je od leće od dna, pa se projicira manje, a snimljena slika prikazuje pravokutnik kao trapez s gornjim rubom kraćim od donjeg ruba.

Rješenje je primijeniti 3D rotaciju na snimljenu sličicu koja virtualno preorijentira ravninu senzora tako da bude paralelna s ravninom scene. Matematika je isto perspektivno preslikavanje koje detekcija AprilTag oznaka koristi za rekonstrukciju poze oznake iz njezina četiri kuta, samo pokrenuto obrnuto: zadanu rotaciju operacija preslikava svaki izlazni piksel natrag na ulazni položaj iz kojeg bi rotacija došla.

rotation_corr() pokreće tu korekciju:

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

Tri rotacijska parametra izražena su u stupnjevima i opisuju rotacije oko osi x, y i z virtualne kamere centrirane na slici. x_rotation naginje kameru gore ili dolje (prirodna korekcija za snimku zida iz razine tla); y_rotation zakreće kameru lijevo ili desno; z_rotation rotira kameru oko njezine optičke osi (prirodna korekcija za nakošeno postavljanje).

x_translation i y_translation pomiču virtualnu kameru bočno bez rotiranja. zoom (zadano 1.0) skalira izlaz. fov (zadano 60.0) opisuje okomito vidno polje kamere, koje se koristi za izračun projekcije – vrijednost bi trebala odgovarati stvarnoj leći kako bi geometrija ostala dosljedna.

Za proizvoljnu kombinaciju nagiba i zakretanja, više rotacija različitih od nule slaže se u jednom pozivu. Redoslijed operacija fiksiran je unutar implementacije; aplikacija samo daje kutove i rezultat izlazi.

5.22.3. Ispravljanje poznatog pravokutnika

Najčešće koristan oblik metode rotation_corr() jest ključna riječ corners=, koja prima popis od četiri (x, y) torke koje opisuju kutove poznatog pravokutnika na ulaznoj slici. Metoda izračunava koja bi 3D rotacija preslikala pravi pravokutnik u te konkretne četiri točke, primjenjuje inverz te rotacije na cijelu sliku i vraća rezultat u kojem je poznati pravokutnik ponovno pravokutan:

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

Klasična upotreba točno je ono što naziv sugerira: registarska pločica (ili bilo koja druga pravokutna značajka) fotografirana iz kosog kuta. Prethodna faza detektira pločicu i prijavljuje položaje njezina četiri kuta na snimljenoj slici; prosljeđivanje tih kutova metodi rotation_corr() proizvodi sliku u kojoj pločica stoji kao pravi pravokutnik, spremna za bilo koju sljedeću fazu prepoznavanja znakova ili podudaranja s predloškom.

Kada oblik s četiri kuta rješava problem koji aplikacija pokušava riješiti, dramatično je korisniji od oblika sa šest parametara. Aplikacija ne mora procjenjivati nikakve kutove rotacije; metodi samo preda četiri točke i prepusti joj da odredi ostalo. Oblik sa šest parametara koristan je kada u sceni nije vidljiv prepoznatljiv pravokutnik te se rotacija mora ručno podesiti iz vanjskog znanja (primjerice kalibriranog kuta postavljanja).