GLS mit 6 Unbekannten und 3x4 Bekannten lösen

Gast #1477181
Lesenswert?

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.
#1477369
Lesenswert?

Andrea schrieb:

> 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 :) .

Na dann mach das doch auf dem Papier und löse das System symbolisch :-)

Du hast

  m_x1 = a_11 * v_x1 + a_12 * v_y1 + m_x0
  m_y1 = a_21 * v_x1 + a_22 * v_y1 + m_y0
  m_x2 = a_11 * v_x2 + a_12 * v_y2 + m_x0
  m_y2 = a_21 * v_x2 + a_22 * v_y2 + m_y0
  m_x3 = a_11 * v_x3 + a_12 * v_y3 + m_x0
  m_y3 = a_21 * v_x3 + a_22 * v_y3 + m_y0

Auf dem Papier umformen, so dass du Gleichungen erhältst

  a_11 = ....
  a_12 = ....
  a_21 = ....
  a_22 = ....
  m_x0 = ....
  m_y0 = ....

6 Unbekannte, 6 Gleichungen.
Ist lösbar.

(Man kann sich natürlich auch hinsetzen und das ganze geometrisch 
angehen. m_x0/m_y0 ist eine Verschiebung. Von den 3 Punkten die dein 
Benutzer anvisiert, ist einer der 0-Punkt und seine Koordinaten sind 
identisch mit m_x0 / m_y0. Die Matrix ist eine Rotiation/Skew/Scale 
Transformation. Gebe ich die Punkte 2 und 3 so vor, dass sie in der 
Vorgabe rechtwinkelig aufeinander stehen, lässt sich die Matrix auch so 
ziemlich einfach direkt angeben :-)
Gast #1477382
Lesenswert?

..und wenn man jetzt noch die Antworten von laeubi (Gaußverfahren) und 
kbuchegg (Gleichungen aufgestellt) zusammennimmt und 'Pivotsuche' 
dazunimmt, dann ist man praktisch am Ziel, der Rest ist eine 
Fingerübung.

Selbiges ist übrigens eine Standardaufgabe im Informatik-Grundstudium. 
Falls Du es nicht selbst ausformulieren willst, dazu gibts es sicher 
eine Vielzahl an fertigen Lösungen bei Tante Gugl ;-)

HTH
Gast #1477469
Lesenswert?

Wow, also danke für die sofortige Lösung des GLS, Detlef!! Das JPG 
"gutelaune" zu nennen war übrigens eine lustige Idee ;) .

Hmmpf, es kann mir sicher keiner von euch sagen, warum ich darauf nicht 
selbst gekommen bin... Ich hatte wie gesagt das gesamte System schon mal 
mit Testwerten gelöst. Die richtigen Variablen drin zu lassen und es 
symbolisch zu lösen, da bin ich natürlich nicht drauf gekommen... 
"blond". Angesichts Detlefs Lösung wär das allerdings wohl aber auch ein 
ganz schöner Krampf geworden, kurz sind die Formeln ja nun nicht gerade.

Danke auch für die anderen Antworten.
@kbuchegg: Der geometrische Ansatz ist natürlich quasi noch viel besser, 
allerdings traue ich mich kaum, zu fragen, wie man so denn nun genau die 
Matrix aufstellen würde... Wenn du dir nicht denkst "Boah, Mädel, so 
blond kann man doch gar nicht sein, überleg doch selber!" und es mir 
aufschreiben würdest, wär ich natürlich sehr erfreut. Wie 
Rotation-Scale-Skew-Matrizen aufgebaut sind, weiß ich, und auch die 
Überlegung hinter deinem Ansatz verstehe ich schon (rechtwinklig 
aufeinander und so).
#1477498
Lesenswert?

Andrea schrieb:

> @kbuchegg: Der geometrische Ansatz ist natürlich quasi noch viel besser,
> allerdings traue ich mich kaum, zu fragen, wie man so denn nun genau die
> Matrix aufstellen würde... Wenn du dir nicht denkst "Boah, Mädel, so
> blond kann man doch gar nicht sein, überleg doch selber!"

Das würde ich in diesem Fall ganz und gar nicht sagen.
Das ist nämlich alles andere als trivial, wenn man sich noch nie mit 
Matrizen und Vektoren in der Graphikprogrammierung beschäftigt hat. Wenn 
man es aber schon mal getan hat, ist es eigentlich ganz einfach :-)

In der Matrix versteckt sich ein 2D-Koordinatensystem:

  a_11 und a_21 beschreiben die X-Achse dieses Systems (also wie es
  in Bezug zum 0-System ausgerichtet ist)
  a_21 und a_22 die entsprechende Y-Achse.


Wählst du zb deine 3 Ursprungspunkte m1, m2, m3 so
   dass m1 im 0-Punkt deines Weltkoordinatensystems liegt
   m2 auf dessen X-Achse
   m3 auf dessen Y-Achse

so ergeben die gemessenen Punkte direkt die a Werte

Dies deshalb, weil dann in der Gleichung für m2

( m_x2 ) = ( a_11 a_12 ) * ( v_x2 ) + ( m_x0 )
( m_y2 )   ( a_21 a_22 )   ( v_y2 ) + ( m_y0 )

vieles zu 0 wird
m_x0 ist 0, m_y0 ist 0, m_y ist 0 und es bleibt übrig

  m_x = a_11 * v_x + a_12 * v_y
  0   = a_21 * v_x + a_22 * v_y

Dasselbe für m3 mit einer x-Komponente von 0

Und das vereinfacht das Gleichungssystem dann schon enorm :-)
Gast #1480024
Lesenswert?

Also ich hab jetzt den einfachen Weg genommen, indem ich MATLAB die 
feste Lösung der 6 Unbekannten hab ausrechnen lassen, und sie ist auch 
identisch mit Detlefs Lösung (glaube ich, zumindest...).

Danke noch mal an alle!

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren