5.22. Corecția lentilei și a perspectivei¶
Două clase de corecție geometrică deformează imaginea în moduri pe care o mapare dreptunghi-la-dreptunghi nu le poate realiza. Corecția lentilei anulează distorsiunea radială pe care o introduce o lentilă reală cu unghi larg – bombarea de tip ochi de pește care îndoaie liniile drepte din scenă în curbe vizibile lângă colțurile cadrului. Corecția perspectivei anulează efectul de trapez care apare atunci când lentila nu este orientată perpendicular pe scenă – deformarea trapezoidală care transformă un dreptunghi cunoscut din lume într-un blob neregulat în imagine. Ambele corecții anulează, după ce captura este finalizată, efecte de origine optică.
5.22.1. Distorsiunea radială a lentilei¶
Materialul despre efectele reale ale lentilei descrie distorsiunea de tip butoi pe care o introduc lentilele ieftine cu unghi larg. Pixelii din apropierea centrului cadrului se află aproximativ acolo unde prezice modelul de cameră obscură (pinhole); pixelii din apropierea marginilor sunt curbați spre exterior cu o cantitate care crește cu pătratul distanței radiale față de axa optică. O linie dreaptă din scenă care trece pe lângă marginea cadrului se curbează vizibil în imaginea capturată, iar orice algoritm clasic de viziune artificială care presupune că liniile drepte rămân drepte – detectarea colțurilor AprilTag, urmărirea muchiilor, navigarea prin urmărirea liniilor – dă răspunsuri greșite lângă colțuri.
lens_corr() anulează distorsiunea. Metoda execută maparea inversă: fiecare pixel de ieșire este eșantionat din poziția din intrare din care lentila l-ar fi curbat spre exterior, iar rezultatul este o imagine corectă din punct de vedere geometric.
img.lens_corr(strength=1.8)
Parametrul strength este nucleul corecției. Este un singur număr care descrie cât de puternic curbează lentila; o valoare apropiată de 1.0 reprezintă o corecție ușoară pentru o lentilă moderat de largă, iar valorile de până la aproximativ 2.0 sunt rezonabile pentru un efect puternic de ochi de pește. Valoarea implicită 1.8 este un punct de plecare rezonabil pentru lentilele standard ale OpenMV Cam; valoarea corectă pentru o lentilă anume se găsește încercând câteva și observând imaginea.
Cei doi parametri secundari sunt de obicei potriviți la valorile lor implicite. zoom (implicit 1.0) scalează ieșirea – o valoare mai mare decât unu decupează spre exterior pentru a compensa modul în care corecția lentilei împinge colțurile mai departe; valorile mai mici lasă vizibilă mai mult din scena corectată, cu prețul includerii unor pixeli goi la marginile imaginii. x_corr și y_corr deplasează centrul corecției față de centrul geometric al imaginii, ceea ce este util atunci când lentila nu este centrată optic deasupra senzorului (un caz neobișnuit, dar care merită cunoscut).
Un flux tipic: capturare, executarea o singură dată a lens_corr() pentru a îndrepta geometria, apoi executarea a ceea ce face de fapt aplicația cu rezultatul.
5.22.2. Corecția rotației 3D¶
Cealaltă clasă de distorsiune geometrică este deformarea de perspectivă care apare atunci când planul senzorului nu este paralel cu planul scenei. Cazul clasic este un indicator sau o plăcuță de înmatriculare privite de jos: partea de sus a indicatorului este mai departe de lentilă decât partea de jos, deci se proiectează mai mică, iar imaginea capturată arată dreptunghiul ca pe un trapez cu muchia de sus mai scurtă decât cea de jos.
Soluția este aplicarea unei rotații 3D asupra cadrului capturat, care reorientează virtual planul senzorului pentru a fi paralel cu planul scenei. Calculul este aceeași mapare de perspectivă pe care o folosește detectarea AprilTag pentru a recupera poziția unei etichete din cele patru colțuri ale ei, executată în sens invers: dată fiind o rotație, operația mapează fiecare pixel de ieșire înapoi la poziția de intrare din care ar fi provenit rotația.
rotation_corr() execută acea corecție:
img.rotation_corr(x_rotation=10.0, y_rotation=0.0, z_rotation=0.0)
Cei trei parametri de rotație sunt exprimați în grade și descriu rotații în jurul axelor x, y și z ale unei camere virtuale centrate pe imagine. x_rotation înclină camera în sus sau în jos (corecția naturală pentru o fotografie a unui perete făcută de la nivelul solului); y_rotation rotește camera la stânga sau la dreapta; z_rotation rotește camera în jurul axei sale optice (corecția naturală pentru o montare neorizontală).
x_translation și y_translation deplasează camera virtuală lateral fără a o roti. zoom (implicit 1.0) scalează ieșirea. fov (implicit 60.0) descrie câmpul vizual vertical al camerei, folosit pentru a calcula proiecția – valoarea trebuie să corespundă lentilei reale pentru a menține geometria consistentă.
Pentru o combinație arbitrară de înclinare și panoramare, mai multe rotații nenule se compun într-un singur apel. Ordinea operațiilor este fixată în interiorul implementării; aplicația furnizează doar unghiurile, iar rezultatul iese.
5.22.3. Rectificarea unui dreptunghi cunoscut¶
Forma cea mai frecvent utilă a rotation_corr() este cuvântul-cheie corners=, care primește o listă de patru tupluri (x, y) ce descriu colțurile unui dreptunghi cunoscut din imaginea de intrare. Metoda calculează ce rotație 3D ar fi mapat un dreptunghi adevărat la acele patru puncte anume, aplică inversa acelei rotații întregii imagini și returnează un rezultat în care dreptunghiul cunoscut este din nou dreptunghiular:
plate_corners = [(45, 80), (300, 60), (310, 180), (40, 200)]
img.rotation_corr(corners=plate_corners)
Utilizarea clasică este exact ceea ce sugerează numele: o plăcuță de înmatriculare (sau orice altă caracteristică dreptunghiulară) fotografiată dintr-un unghi oblic. O etapă din amonte detectează plăcuța și raportează cele patru poziții ale colțurilor sale în imaginea capturată; transmiterea acelor colțuri către rotation_corr() produce o imagine în care plăcuța apare ca un dreptunghi adevărat, gata pentru orice etapă de recunoaștere a caracterelor sau de potrivire de șabloane care urmează.
Atunci când forma cu patru colțuri rezolvă problema pe care încearcă să o rezolve o aplicație, este dramatic mai utilă decât forma cu șase parametri. Aplicația nu trebuie să estimeze niciun unghi de rotație; transmite pur și simplu metodei patru puncte și lasă metoda să afle restul. Forma cu șase parametri este utilă atunci când în scenă nu este vizibil niciun dreptunghi identificabil, iar rotația trebuie ajustată manual pe baza unor cunoștințe externe (un unghi de montare calibrat, de exemplu).