5.22. Lencse- és perspektíva-korrekció¶
A geometriai korrekciónak két olyan osztálya van, amely a képet úgy torzítja, ahogy egy téglalap-téglalap leképezés nem képes. A lencsekorrekció visszaállítja a radiális torzítást, amelyet egy valódi nagylátószögű lencse okoz – a halszem-domborulatot, amely a kép sarkai közelében a jelenet egyenes vonalait látható görbékké hajlítja. A perspektíva-korrekció visszaállítja a trapéztorzítást, amely akkor lép fel, amikor a lencse nem merőlegesen néz a jelenetre – a trapéz alakú torzulást, amely a világban lévő ismert téglalapot a képen nem téglalap alakú folttá alakítja. Mindkét korrekció a felvétel elkészülte után állít helyre olyan hatásokat, amelyek eredete optikai.
5.22.1. Radiális lencsetorzítás¶
A valós lencsehatások anyag a hordó alakú torzítást írja le, amelyet az olcsó nagylátószögű lencsék okoznak. A kép közepe közelében lévő képpontok nagyjából ott vannak, ahol a tűlyukkamera-modell előrejelzi; a szélek közelében lévő képpontok kifelé hajlanak egy olyan mértékben, amely az optikai tengelytől mért radiális távolság négyzetével arányosan nő. A jelenetben lévő, a kép széle közelében futó egyenes vonal a rögzített képen láthatóan görbül, és bármely klasszikus gépi látás algoritmus, amely feltételezi, hogy az egyenes vonalak egyenesek maradnak – AprilTag sarokészlelés, élkövetés, vonalkövető navigáció – rossz eredményt ad a sarkok közelében.
A lens_corr() visszaállítja a torzítást. A metódus az inverz leképezést futtatja: minden kimeneti képpontot a bemenetnek abból a pozíciójából mintáz, ahonnan a lencse kifelé hajlította volna, és az eredmény egy geometriailag egyenes kép.
img.lens_corr(strength=1.8)
A strength paraméter a korrekció lényege. Egyetlen szám, amely leírja, hogy a lencse mennyire erősen hajlít; az 1.0 körüli érték enyhe korrekció egy mérsékelten nagylátószögű lencséhez, az 2.0 körüli értékek pedig ésszerűek egy erős halszemlencséhez. Az alapértelmezett 1.8 ésszerű kiindulópont a gyári OpenMV Cam lencsékhez; az adott lencséhez tartozó megfelelő érték kérdése néhány próbálgatás és a kép figyelése.
A két oldalsó paraméter általában megfelelő az alapértelmezett értékénél. A zoom (alapértelmezés 1.0) skálázza a kimenetet – az egynél nagyobb érték kifelé vág, hogy kompenzálja azt, ahogy a lencsekorrekció a sarkokat tovább tolja kifelé; a kisebb értékek a korrigált jelenetből többet hagynak láthatóan, annak árán, hogy üres képpontokat tartalmaznak a kép szélein. Az x_corr és y_corr eltolja a korrekció középpontját a kép geometriai középpontjától, ami akkor hasznos, ha a lencse optikailag nincs az érzékelő fölé központosítva (szokatlan eset, de érdemes tudni róla).
Egy tipikus folyamat: rögzítés, a lens_corr() egyszeri futtatása a geometria kiegyenesítéséhez, majd annak futtatása, amit az alkalmazás valójában tesz az eredménnyel.
5.22.2. 3D forgáskorrekció¶
A geometriai torzítás másik osztálya a perspektíva-torzulás, amely akkor lép fel, amikor az érzékelő síkja nem párhuzamos a jelenet síkjával. A klasszikus eset egy alulról nézett tábla vagy rendszámtábla: a tábla teteje távolabb van a lencsétől, mint az alja, így kisebbnek vetül, és a rögzített kép a téglalapot trapézként mutatja, amelynek felső éle rövidebb, mint az alsó éle.
A megoldás az, hogy egy 3D forgatást alkalmazunk a rögzített képkockára, amely virtuálisan úgy átrendezi az érzékelő síkját, hogy az párhuzamos legyen a jelenet síkjával. A matematika ugyanaz a perspektíva-leképezés, amelyet az AprilTag észlelés használ a címke pózának visszaállítására a négy sarkából, csak fordítva futtatva: adott forgatás esetén a művelet minden kimeneti képpontot visszaképez arra a bemeneti pozícióra, ahonnan a forgatás után származott volna.
A rotation_corr() futtatja ezt a korrekciót:
img.rotation_corr(x_rotation=10.0, y_rotation=0.0, z_rotation=0.0)
A három forgatási paraméter fokokban van, és egy, a képre központosított virtuális kamera x, y és z tengelyei körüli forgatásokat ír le. Az x_rotation a kamerát fel vagy le dönti (a természetes korrekció egy fal talajszintű felvételéhez); az y_rotation a kamerát balra vagy jobbra pásztázza; a z_rotation a kamerát az optikai tengelye körül forgatja (a természetes korrekció egy nem vízszintes rögzítéshez).
Az x_translation és y_translation oldalirányban mozgatja a virtuális kamerát anélkül, hogy elforgatná. A zoom (alapértelmezés 1.0) skálázza a kimenetet. A fov (alapértelmezés 60.0) a kamera függőleges látómezőjét írja le, amelyet a vetítés kiszámításához használunk – az értéknek meg kell egyeznie a tényleges lencsével, hogy a geometria konzisztens maradjon.
Tetszőleges dőlés és pásztázás kombinációhoz több nem nulla forgatás komponálódik egyetlen hívásban. A műveletek sorrendje rögzített a megvalósításon belül; az alkalmazás csak megadja a szögeket, és az eredmény előáll.
5.22.3. Ismert téglalap helyreállítása¶
A rotation_corr() leggyakrabban hasznos formája a corners= kulcsszó, amely négy (x, y) tuple listáját veszi át, amelyek egy ismert téglalap sarkait írják le a bemeneti képen. A metódus kiszámítja, hogy melyik 3D forgatás képezte volna le a valódi téglalapot azokra a bizonyos négy pontra, alkalmazza ennek a forgatásnak az inverzét a teljes képre, és olyan eredményt ad vissza, amelyben az ismert téglalap ismét téglalap alakú:
plate_corners = [(45, 80), (300, 60), (310, 180), (40, 200)]
img.rotation_corr(corners=plate_corners)
A klasszikus felhasználás pontosan az, amit a név sugall: egy rendszámtábla (vagy bármely más téglalap alakú jellemző), amelyet ferde szögből fényképeztek. Egy korábbi szakasz észleli a táblát, és jelenti a négy sarkának pozícióját a rögzített képen; e sarkok átadása a rotation_corr() metódusnak olyan képet hoz létre, amelyen a tábla valódi téglalapként helyezkedik el, készen bármely karakterfelismerő vagy sablonegyeztető szakaszra, amely ezután következik.
Amikor a négysarkú forma megoldja az alkalmazás által megoldani próbált problémát, drámaian hasznosabb, mint a hatparaméteres forma. Az alkalmazásnak nem kell semmilyen forgatási szöget megbecsülnie; csak átad a metódusnak négy pontot, és hagyja, hogy a metódus kitalálja a többit. A hatparaméteres forma akkor hasznos, amikor nincs azonosítható téglalap látható a jelenetben, és a forgatást kézzel kell beállítani külső ismeretek alapján (például egy kalibrált rögzítési szögből).