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).