5.22. Korekce objektivu a perspektivy

Dvě třídy geometrické korekce deformují obraz způsobem, který mapování obdélníku na obdélník nedokáže. Korekce objektivu odstraňuje radiální zkreslení, které vnáší skutečný širokoúhlý objektiv – vyboulení typu rybí oko, jež ohýbá rovné čáry scény do viditelných křivek poblíž rohů snímku. Korekce perspektivy odstraňuje lichoběžníkový efekt, který nastane, když objektiv nemíří kolmo na scénu – trapézovou deformaci, jež promění známý obdélník ve světě v nepravidelný blob v obraze. Obě korekce po dokončení snímání odstraňují efekty, které mají optický původ.

5.22.1. Radiální zkreslení objektivu

Materiál o skutečných efektech objektivu popisuje zkreslení typu soudek, které vnášejí levné širokoúhlé objektivy. Pixely poblíž středu snímku jsou zhruba tam, kde je předpovídá model dírkové komory; pixely poblíž okrajů jsou vyhnuté směrem ven o hodnotu, která roste s druhou mocninou radiální vzdálenosti od optické osy. Rovná čára ve scéně, která vede poblíž okraje snímku, se v zachyceném obraze viditelně zakřiví a jakýkoli klasický algoritmus strojového vidění, který předpokládá, že rovné čáry zůstanou rovné – detekce rohů AprilTag, sledování hran, navigace podle sledování čar – poblíž rohů dospěje ke špatnému výsledku.

lens_corr() zkreslení odstraňuje. Metoda spouští inverzní mapování: každý výstupní pixel se navzorkuje z pozice na vstupu, ze které by jej objektiv vyhnul ven, a výsledkem je geometricky rovný obraz.

img.lens_corr(strength=1.8)

Parametr strength je jádrem korekce. Je to jediné číslo, které popisuje, jak silně objektiv vyboulí; hodnota poblíž 1.0 je mírná korekce pro středně širokoúhlý objektiv a hodnoty zhruba do 2.0 jsou rozumné pro silné rybí oko. Výchozí hodnota 1.8 je rozumným výchozím bodem pro standardní objektivy OpenMV Cam; správná hodnota pro jakýkoli konkrétní objektiv je věcí vyzkoušení několika hodnot a pozorování obrazu.

Dva postranní parametry jsou obvykle v pořádku ve svých výchozích hodnotách. zoom (výchozí 1.0) škáluje výstup – hodnota větší než jedna ořezává směrem ven, aby kompenzovala způsob, jakým korekce objektivu posouvá rohy dále ven; menší hodnoty ponechávají viditelnou větší část opravené scény za cenu zahrnutí prázdných pixelů na okrajích obrazu. x_corr a y_corr posouvají střed korekce mimo geometrický střed obrazu, což je užitečné, když objektiv není opticky vystředěn nad senzorem (neobvyklý případ, který je však dobré znát).

Typický pipeline: zachycení, jednorázové spuštění lens_corr() pro narovnání geometrie a poté spuštění toho, co aplikace s výsledkem skutečně dělá.

5.22.2. Korekce 3D rotace

Druhou třídou geometrického zkreslení je deformace perspektivy, která nastane, když rovina senzoru není rovnoběžná s rovinou scény. Klasickým případem je značka nebo poznávací značka nahlížená zdola: horní část značky je dále od objektivu než spodní, takže se promítá menší, a zachycený obraz zobrazí obdélník jako lichoběžník s horní hranou kratší než spodní.

Řešením je aplikovat na zachycený snímek 3D rotaci, která virtuálně přeorientuje rovinu senzoru tak, aby byla rovnoběžná s rovinou scény. Matematika je totéž perspektivní mapování, které detekce AprilTag používá k obnovení pózy značky z jejích čtyř rohů, spuštěné obráceně: na základě rotace operace mapuje každý výstupní pixel zpět na vstupní pozici, ze které by rotace pocházela.

rotation_corr() tuto korekci spouští:

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

Tři parametry rotace jsou ve stupních a popisují rotace kolem os x, y a z virtuální kamery vystředěné na obraz. x_rotation naklání kameru nahoru nebo dolů (přirozená korekce pro záběr stěny z úrovně země); y_rotation natáčí kameru doleva nebo doprava; z_rotation otáčí kameru kolem její optické osy (přirozená korekce pro zešikmené uchycení).

x_translation a y_translation posouvají virtuální kameru do stran bez jejího otáčení. zoom (výchozí 1.0) škáluje výstup. fov (výchozí 60.0) popisuje vertikální zorné pole kamery, použité k výpočtu projekce – hodnota by měla odpovídat skutečnému objektivu, aby zůstala geometrie konzistentní.

Pro libovolnou kombinaci náklonu a natočení se v jednom volání skládá více nenulových rotací. Pořadí operací je uvnitř implementace pevně dané; aplikace pouze poskytne úhly a výsledek vyjde.

5.22.3. Narovnání známého obdélníku

Nejčastěji užitečnou formou rotation_corr() je klíčové slovo corners=, které přijímá seznam čtyř n-tic (x, y) popisujících rohy známého obdélníku ve vstupním obraze. Metoda vypočítá, jaká 3D rotace by namapovala skutečný obdélník na ty konkrétní čtyři body, aplikuje na celý obraz inverzi této rotace a vrátí výsledek, v němž je známý obdélník opět obdélníkový:

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

Klasické použití je přesně to, co název napovídá: poznávací značka (nebo jakýkoli jiný obdélníkový příznak) vyfotografovaná z šikmého úhlu. Předřazená fáze detekuje značku a nahlásí pozice jejích čtyř rohů v zachyceném obraze; předání těchto rohů metodě rotation_corr() vytvoří obraz, v němž značka leží jako skutečný obdélník, připravený pro jakoukoli následnou fázi rozpoznávání znaků nebo porovnávání se šablonou.

Když forma se čtyřmi rohy řeší problém, který se aplikace snaží vyřešit, je dramaticky užitečnější než forma se šesti parametry. Aplikace nemusí odhadovat žádné úhly rotace; metodě jen předá čtyři body a nechá ji vypočítat zbytek. Forma se šesti parametry je užitečná, když ve scéně není viditelný žádný identifikovatelný obdélník a rotaci je třeba ručně doladit z externích znalostí (například z kalibrovaného úhlu uchycení).