5.22. Lens- en perspectiefcorrectie¶
Twee soorten geometrische correctie vervormen de afbeelding op manieren die een rechthoek-naar-rechthoek-afbeelding niet kan. Lenscorrectie maakt de radiale vervorming ongedaan die een echte groothoeklens introduceert – de fisheye-bolling die rechte lijnen in de scène buigt tot zichtbare krommen nabij de hoeken van het frame. Perspectiefcorrectie maakt het keystone-effect ongedaan dat optreedt wanneer de lens niet loodrecht op de scène is gericht – de trapeziumvormige vervorming die een bekende rechthoek in de wereld verandert in een niet-rechthoekige blob in de afbeelding. Beide correcties maken, nadat de opname is gedaan, effecten ongedaan die optisch van oorsprong zijn.
5.22.1. Radiale lensvervorming¶
Het materiaal over echte lenseffecten beschrijft de tonvormige vervorming die goedkope groothoeklenzen introduceren. Pixels nabij het midden van het frame bevinden zich ongeveer waar het pinhole-model voorspelt; pixels nabij de randen worden naar buiten gebogen met een mate die groeit met het kwadraat van de radiale afstand tot de optische as. Een rechte lijn in de scène die nabij de rand van het frame loopt, kromt zichtbaar in de opgenomen afbeelding, en elk klassiek machine vision-algoritme dat ervan uitgaat dat rechte lijnen recht blijven – AprilTag-hoekdetectie, randvolging, lijnvolgnavigatie – krijgt nabij de hoeken het verkeerde antwoord.
lens_corr() maakt de vervorming ongedaan. De methode voert de inverse afbeelding uit: elke uitvoerpixel wordt bemonsterd vanuit de positie in de invoer waaruit de lens hem naar buiten zou hebben gebogen, en het resultaat is een geometrisch rechte afbeelding.
img.lens_corr(strength=1.8)
De parameter strength is de kern van de correctie. Het is een enkel getal dat beschrijft hoe sterk de lens buigt; een waarde nabij 1.0 is een milde correctie voor een matig brede lens, en waarden tot ongeveer 2.0 zijn redelijk voor een sterke fisheye. De standaardwaarde van 1.8 is een redelijk startpunt voor de standaard OpenMV Cam-lenzen; de juiste waarde voor een specifieke lens is een kwestie van enkele waarden proberen en de afbeelding bekijken.
De twee zijparameters zijn gewoonlijk prima op hun standaardwaarden. zoom (standaard 1.0) schaalt de uitvoer – een waarde groter dan één snijdt naar buiten bij om te compenseren voor de manier waarop lenscorrectie de hoeken verder naar buiten duwt; kleinere waarden laten meer van de gecorrigeerde scène zichtbaar ten koste van het opnemen van lege pixels aan de afbeeldingsranden. x_corr en y_corr verschuiven het midden van de correctie weg van het geometrische midden van de afbeelding, wat nuttig is wanneer de lens niet optisch gecentreerd is boven de sensor (een ongebruikelijk geval maar de moeite waard om te weten).
Een typische pijplijn: opnemen, eenmaal lens_corr() uitvoeren om de geometrie recht te trekken, en vervolgens uitvoeren wat de applicatie daadwerkelijk met het resultaat doet.
5.22.2. 3D-rotatiecorrectie¶
De andere soort geometrische vervorming is de perspectief-vervorming die optreedt wanneer het sensorvlak niet evenwijdig is aan het scènevlak. Het klassieke geval is een bord of een kentekenplaat die van onderaf wordt bekeken: de bovenkant van het bord is verder van de lens verwijderd dan de onderkant, dus projecteert het kleiner, en de opgenomen afbeelding toont de rechthoek als een trapezium met de bovenrand korter dan de onderrand.
De oplossing is om een 3D-rotatie toe te passen op het opgenomen frame die het sensorvlak virtueel heroriënteert zodat het evenwijdig is aan het scènevlak. De wiskunde is dezelfde perspectiefafbeelding die AprilTag-detectie gebruikt om de pose van een tag uit zijn vier hoeken te herstellen, maar dan omgekeerd uitgevoerd: gegeven een rotatie, brengt de bewerking elke uitvoerpixel terug naar de invoerpositie waar de rotatie vandaan zou zijn gekomen.
rotation_corr() voert die correctie uit:
img.rotation_corr(x_rotation=10.0, y_rotation=0.0, z_rotation=0.0)
De drie rotatieparameters zijn in graden en beschrijven rotaties rond de x-, y- en z-as van een virtuele camera die op de afbeelding is gecentreerd. x_rotation kantelt de camera omhoog of omlaag (de natuurlijke correctie voor een opname van een muur op grondniveau); y_rotation pant de camera naar links of rechts; z_rotation roteert de camera rond zijn optische as (de natuurlijke correctie voor een niet-waterpas montage).
x_translation en y_translation verplaatsen de virtuele camera zijwaarts zonder hem te roteren. zoom (standaard 1.0) schaalt de uitvoer. fov (standaard 60.0) beschrijft het verticale gezichtsveld van de camera, gebruikt om de projectie te berekenen – de waarde moet overeenkomen met de werkelijke lens om de geometrie consistent te houden.
Voor een willekeurige combinatie van kantelen en pannen worden meerdere rotaties die niet nul zijn in één aanroep samengesteld. De volgorde van bewerkingen ligt vast binnen de implementatie; de applicatie levert alleen de hoeken en het resultaat komt eruit.
5.22.3. Een bekende rechthoek rechttrekken¶
De meest bruikbare vorm van rotation_corr() is het sleutelwoord corners=, dat een lijst van vier (x, y)-tuples aanneemt die de hoeken van een bekende rechthoek in de invoerafbeelding beschrijven. De methode berekent welke 3D-rotatie een echte rechthoek naar die specifieke vier punten zou hebben afgebeeld, past de inverse van die rotatie toe op de hele afbeelding, en geeft een resultaat terug waarin de bekende rechthoek weer rechthoekig is:
plate_corners = [(45, 80), (300, 60), (310, 180), (40, 200)]
img.rotation_corr(corners=plate_corners)
Het klassieke gebruik is precies wat de naam suggereert: een kentekenplaat (of een ander rechthoekig kenmerk) die vanuit een schuine hoek is gefotografeerd. Een voorafgaande fase detecteert de plaat en rapporteert de posities van de vier hoeken in de opgenomen afbeelding; door die hoeken door te geven aan rotation_corr() ontstaat een afbeelding waarin de plaat als een echte rechthoek zit, klaar voor welke tekenherkennings- of template-matchingfase ook volgt.
Wanneer de vierhoekvorm het probleem oplost dat een applicatie probeert op te lossen, is deze aanzienlijk nuttiger dan de vorm met zes parameters. De applicatie hoeft geen rotatiehoeken te schatten; ze geeft de methode gewoon vier punten en laat de methode de rest uitzoeken. De vorm met zes parameters is nuttig wanneer er geen herkenbare rechthoek zichtbaar is in de scène en de rotatie handmatig moet worden afgesteld op basis van externe kennis (bijvoorbeeld een gekalibreerde montagehoek).