Objektiv Entzerrung - passende Funktion gesucht



  • Wir müssen demnächst eine Entzerrung von Punkten in einem Kamerabild machen (EDIT: wir brauchen nur die Koordinaten einzelner Punkte, nicht eine ganze Bitmap).
    Das eingesetzte Objektiv ist ziemlich winzig (schätze max. 3 Linsen), und macht ne hübsche Kissen-Verzerrung tonnenförmige Verzeichnung (Fischauge halt).

    Ich denke die Entzerrung wird so laufen dass wir die Koordinaten im Kamerabild in Polarkoordinaten umrechnen, dann den Abstand zum Zentrum durch die Korrekturfunktion jagen ( r' = f(r) ), und dann mit dem neuen Abstand wieder auf X, Y zurückrechnen.

    (Wir werden auch bevor wir losstarten nochmal prüfen ob Kreise auf dem Papier auch wirklich zu kreisen im Kamerabild werden, und ob Geraden die durch das Zentrum gehen auch gerade bleiben. Also verifizieren dass die Verzerrung des Objektivs wirklich nur die Entfernung zum Zentrum ändert, nicht aber den Winkel.)

    Jetzt müssen wir nur noch die Korrekturfunktion ermitteln. Ich denke mir dazu werden wir einfach einen Raster abfilmen, und dann die Positionen der Rasterpunkte im Kamerabild rausschreiben, und natürlich die Positionen wo sie wirklich sein sollten.

    Dann haben wir ne Liste mit der Distanz zum Zentrum im Kamerabild ( x ) vs. Distanz zum Zentrum auf dem originalen Raster ( f(x) ).

    TL;DR:

    D.h. wir kennen ein paar Stellen der Funktion f . Und an diese "fitten" wir irgend eine geeignete Funktion.

    Was ich jetzt von Euch wissen will:

    1. Erscheint euch das sinnvoll, oder sollte man das anders angehen?

    2. Welche Arten von Funktionen würdet ihr als erste probieren? Polynome? B-Splines? Fourierreihen? ...?

    3. Wie fittet man die Funktionen dann? (Also idealerweise nen Link auf ne Beschreibung und/oder passende Suchbegriffe zum selber suchen; ich erwarte mir nicht dass mir hier jmd. Privatunterricht gibt.)
      (Meine Mathekenntnisse beschränken sich im Prinzip auf Schulmathematik, und irgendwelche Kurven fitten haben wir da nie durchgemacht. Ist ausser dem schon halbwegs lange her ;))



  • Schon das hier probiert?

    Edit: Die von dir vorgeschlagende Methode verstehe ich auch nicht ganz. Bei kissenförmiger Verzeichnung hast du außen mehr Bildpunkte als innen. Wenn du einfach ihren Abstand zur Verzeichnungsmitte korrigieren willst, musst du ja irgendwann ein paar Bildpunkte weglassen. Wo wird das hierbei berücksichtigt? Bzw. wenn zwei Bildpunkte die gleichen korrigierten Koordinaten haben: Welcher hat Priorität?



  • Ach, das hab ich vermutlich nicht klar genug formuliert...

    Ich will keine Bitmap entzerren, sondern nur Koordinaten. Punkte. Vektoren. Wie auch immer man sagen will 😉

    Konkret geht es darum die Position von LEDs im Kamerabild zu ermitteln.
    Die LEDs verursachen einen kleinen, ziemlich gut kreisförmigen hellen Fleck im Kamerabild.

    D.h. wir können jetzt entweder:

    1. Den Mittelpunkt des Flecks im verzerrten Bild ermitteln, und dann die Koordinaten des Mittelpunktes entzerren.
      ...oder...
    2. Alle Pixel-Positionen der am Fleck beteiligten Pixel entzerren, und dann die entzerrten Positionen mitteln.

    Wobei bei (2) sich auch wieder das Problem ergeben würde, dass nicht jede entzerrte Position der gleichen entzerrten Fläche entspricht.

    Ich erwarte mir allerdings dass selbst mit (1) bereits ausreichend genaue Ergebnisse rauskommen werden.



  • Jodocus schrieb:

    Schon das hier probiert?

    Nö, noch gar nix probiert 🙂
    Sieht interessant aus, danke!

    Ich hab nur keinen Plan wie ich die Funktion jetzt fitten soll (ich hoffe man nennt das so).
    Also anders gesagt: wie ich die Koeffizienten Kn und Pn ermitteln soll.

    Ich hab' kurz in das verlinkte Paper reingesehen, aber ... pfuh. Also bevor ich versuche das alles nachzuvollziehen hack' ich ne einfache bilineare Interpolation rein und gut is.



  • 1.) Ja.
    2.) Quadratisch. Kommt aber auf die Art und Staerke der Verzerrung an. Hast du Beispielbilder?
    3.) Sollte in jeder Dimension gut funktionieren: http://en.wikipedia.org/wiki/Least_squares

    Meine Mathekenntnisse beschränken sich im Prinzip auf Schulmathematik, und irgendwelche Kurven fitten haben wir da nie durchgemacht

    Das ist schade.

    Ich erwarte mir allerdings dass selbst mit (1) bereits ausreichend genaue Ergebnisse rauskommen werden.

    Hier stellt sich die Frage in welchem Zusammenhang du das brauchst. Wenn Reflektionen von LEDs auf der Hornhaut und Linse des Auges zur Vermessung genommen werden, reicht es vielleicht nicht.

    Als Alternative bietet sich an, die Verzerrung zu berechnen. Aber ich glaube kaum, dass ihr das Optiksystem mit ihren Werten kennt.



  • Das Modell, das jodocus vorschlägt, ist ja zum Glück linear in den Parametern, dann ist das fitten ziemlich leicht. Dafür gibt es jede Menge Standardsoftware. Zum beispiel R kann sowas. Da schreibste nur deine gemessenen daten und das modell rein und es spuckt dir die parameter aus.

    Generell verspricht der ansatz, sich ein modell, das die realität abbildet zu erstellen, und dessen parameter zu schätzen meist deutlich besser funktioniert als eine beliebige funktion an daten zu fitten. Einfach weil so ein modell meist viel weniger parameter hat und man daher robustere schätzungen erhält -- und natürlich weil der ansatz idealerweise genau zur problemstellung passt und nicht völlig generisch ist.



  • @knivil
    OK, ne quadratische Gleichung fitten bekomm ich vermutlich noch selbst hin, ohne weitere Hilfe.
    Vor allem wenn im Endeffekt nur ein Parameter übrig bleibt, nämlich der Koeffizient für x² 😃
    (In der Formel da kommen ja nur gerade Potenzen > 0 vor, d.h. im Falle einer quadratischen Gleichung bleibt dann nur x².)

    Ansonsten... gibt's da was für Dumme wo man einfach nur seine Messwerte eintragen muss + welche Potenzen im zu fittenden Polynom "erlaubt" sein sollen, und dann auf "mach mal" drücken?

    knivil schrieb:

    Ich erwarte mir allerdings dass selbst mit (1) bereits ausreichend genaue Ergebnisse rauskommen werden.

    Hier stellt sich die Frage in welchem Zusammenhang du das brauchst. Wenn Reflektionen von LEDs auf der Hornhaut und Linse des Auges zur Vermessung genommen werden, reicht es vielleicht nicht.

    Nönö, viel einfacher. Keine Reflexionen, alles direkt. Denk Wiimote oder House of the Dead (Arcade) 😉

    Als Alternative bietet sich an, die Verzerrung zu berechnen. Aber ich glaube kaum, dass ihr das Optiksystem mit ihren Werten kennt.

    Hmmmmmm...
    Naja ... jetzt wo du's sagst. Wir könnten schonmal beim Hersteller nachfragen. Für den Prototypen sehe ich da sogar eine (kleine) Chance, da wir da ein Objektiv haben das nicht aus dem Kaugummiautomaten stammt.
    (Allerdings weiss ich nicht wie motiviert der Hersteller durch die Aussicht uns 2-3 weitere Objektive zu verkaufen sein wird 🤡 )

    Für's Serienmodell müssen wir dann zwar auf jeden Fall die Korrektur selbst rausmessen/errechnen, aber das könnten wir dann aufschieben bis dahin. Was auch nicht doof wäre.



  • @Jester
    Das da?
    http://www.r-project.org/

    Und damit kann ich Klicki-Bunit-Style weighted linear least squares fitting machen?
    (Ich denke mal dass eine Gewichtung mit dem Abstand zum "distortial center" - also der Bildmitte - sinnvoll sein wird.)

    Das wäre ja sehr cool!



  • @hustbaer: Nun, wenn es nicht vertraglich vereinbart wurde, wird eurer Zulieferer die Daten nicht herausgeben, aber Fragen kostet nichts. Normalerweise existiert bei denen ein Modell schon in einer Modellierungssoftware, wobei auch die Verzerrung sicher enthalten ist. Diese Funktion bzw. deren Inverses fuer die Entzerrung sollte einfacher zu erfragen sein.



  • knivil schrieb:

    Diese Funktion bzw. deren Inverses fuer die Entzerrung sollte einfacher zu erfragen sein.

    Jo, wenn dann sowieso gleich die fertige Funktion.

    Mit den Daten des Objektivs (Aufbau) würde ich ja erst wieder nix direkt anfangen können. Müsste ich wieder rumrechnen, und dazu fehlt mir dann wieder die Mathematik/Übung/...
    Und wir brauchen die auch net. Wir wollen das Ding ja eh net nachbauen.



  • Warum nicht einfach opencv dafür benützen? dazu gibts fertige beispiele



  • hustbaer schrieb:

    @Jester
    Das da?
    http://www.r-project.org/

    Und damit kann ich Klicki-Bunit-Style weighted linear least squares fitting machen?
    (Ich denke mal dass eine Gewichtung mit dem Abstand zum "distortial center" - also der Bildmitte - sinnvoll sein wird.)

    Das wäre ja sehr cool!

    ja genau das. Allerdings ist es nicht klicki-bunti. Aber für least squares gibts fertige pakete, sodass du wahrscheinlcih, wenn du deine daten in csv hast, mit ca. 5-10 Zeilen hinkommst. Tutorials findest du im netz jede menge.



  • Üblich für Photoentzerrung ist die Methode nach Prof. Dersch.

    http://www.panotools.org/dersch/barrel/barrel.html

    Arbeitet radial. Mittenverstz ist da mit etwas umstellen auch möglich.

    Für einfache Verzeichnung (nur Parameter b) kann auch einfach an Refrenzbild mit Gerade der Wert "berechnet" werden.

    Gruss
    Frank



  • @DerAltenburger
    Danke für diesen weiteren Link!


Log in to reply