GLS mit 6 Unbekannten und 3x4 Bekannten lösen



  • Uff, ich hab mir beim Formulieren des Betreffs fast nen Ast abgebrochen,
    weil ich nicht wusste, wie ich es besser erklären soll.

    Ich habe folgende Gleichung:
    ( m_x ) = ( a_11 a_12 ) * ( v_x ) + ( m_x0 )
    ( m_y ) ( a_21 a_22 ) ( v_y ) + ( m_y0 )

    m_x m_y : 2-zeiliger Vektor
    a_ij : 2x2 Matrix mit 4 gesuchten Unbekannten
    v_x v_y : 2-zeiliger Vektor v
    m_x0 m_y0: 2-zeiliger Vektor mit 2 gesuchten Unbekannten

    Das ganze ist eine Kalibrierung für ein EyeTracking-System, das auf
    einem Vektor zwischen zwei bestimmten Punkten im Auge basiert. Dieser
    Vektor ist der Vektor v.

    In der Kalibrierung meines Systems werden jetzt 3 zusammengehörige Werte
    bestimmt, indem der Nutzer nacheinander auf 3 bekannte Punkte
    (Pixelkoordinaten) gucken soll. Ich bekomme also:
    1. bekannten Pixel m_1 (linke Seite der Gleichung) und dazugehöriger
    Vektor v_1.
    2. bekannten Pixel m_2 und dazugehöriger Vektor v_2.
    3. bekannten Pixel m_3 und v_3.

    Auf dem Papier ist mir ganz klar, wie ich das löse: Mit einem Wertepaar
    anfangen, einsetzen, umformen, nächstes Wertepaar einsetzen, und die
    Formeln "kreuz und quer" ineinander einsetzen 🙂 .
    Dann hätte ich am Ende alle 6 Unbekannten a_ij und m_x0 und m_y0. Danach
    würde ich dieselbe Formel anwenden, um auszurechnen, wo der User jetzt
    hinguckt, indem ich den Vektor v als Eingabe nehme, und m_x und m_y ist
    dann mein Ergebnis.

    ABER: Wie programmiere ich die Lösung dieses GLS?
    Ich schreibe in C++ mit OpenCV.


  • Mod

    Das ist ein lineares Gleichungssystem, wenn ich richtig rate (denn irgendwas stimmt bei deinen Formeln nicht, die zweite Zeile ist nicht einmal eine Gleichung). Das kannst du als Matrix schreiben und Gaußelemination machen. Oder ein anderes Verfahren für LGS aus deinem Lieblingsbuch zu Numerik.

    Oder, da die Gleichung schon vorher bekannt ist: Mit Stift und Papier die allgemeine Lösung ausrechnen und diese direkt einprogrammieren.



  • Sorry, die Schreibweise ist ein bißchen blöde. Die zwei Zeilen zusammen SIND eine Gleichung, das soll eine zwei-zeilige Gleichung sein mit Vektor = Matrix * Vektor + Vektor. Alles jeweils 2-zeilig.


  • Mod

    AndreaK schrieb:

    Sorry, die Schreibweise ist ein bißchen blöde. Die zwei Zeilen zusammen SIND eine Gleichung, das soll eine zwei-zeilige Gleichung sein mit Vektor = Matrix * Vektor + Vektor. Alles jeweils 2-zeilig.

    Dann ist's ein LGS und kann mit den üblichen numerischen Verfahren berechnet werden. Da es effektiv 2x2 ist, bietet sich wohl am ehesten an, die Gleichung einmal allgemein zu lösen und die Lösung fest in das Programm zu schreiben. Gaußverfahren und andere numerische Methoden wären da die sprichwörtlichen Kanonen auf Spatzen.



  • Wenn ich das richtig sehe, hast du diese Gleichung 3mal, für 3 verschiedene Pixel, also folgendes Gleichungssystem:

    $\begin{pmatrix} A & 0\\ 0 & A\\ A & 0\\ 0 & A\\ A & 0\\ 0 & A \end{pmatrix} \begin{pmatrix}a_{11}\\a_{12}\\m_{x,0}\\a_{21}\\a_{22}\\m_{y,0}\end{pmatrix} = \begin{pmatrix} m_{1,x}\\m_{1,y}\\m_{2,x}\\m_{2,y}\\m_{3,x}\\m_{3,y}\end{pmatrix}\text{ mit }A=\begin{pmatrix}v\_x & v\_y & 1\end{pmatrix}$

    Vielleicht bietet sich aufgrund der Regelmäßigkeit der Matrix irgendwas spezielles an, ansonsten halt Gauss oder eine Variante.



  • @Bashar: Oh super, die Schreibweise ist ja perfekt, A*x = b, darauf bin ich nicht gekommen. Danke!

    Allerdings habe ich jetzt die Lösung von SeppJ implementiert: Gleichungssystem symbolisch lösen und feste Formel für die 6 Unbekannten fest einprogrammieren.


Log in to reply