Forum: PC-Programmierung GLS mit 6 Unbekannten und 3x4 Bekannten lösen


von Andrea (Gast)


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.

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

Gleichungssystem kann man z.B. mit dem Gausverfahren lösen, falls nichts 
weiter über das System bekannt ist.
Debi wird halt einfach systematisch vorgegeangen anstelle "kreuz und 
quer" ;)

von Karl H. (kbuchegg)


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

von Gast (Gast)


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

von Detlef _. (detlef_a)


Angehängte Dateien:

Lesenswert?

Die Lösung eines linearen Gleichungssystems am Nachmittag macht gute 
Laune für den Rest des Tages.
Bei hartnäckigen Fällen von Übellaunigkeit muß man allerdings eine DGL 
heranziehen.

:-))
Math rulez
Cheers
Detlef

von Andrea (Gast)


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

von Karl H. (kbuchegg)


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

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

Man könnte das ganze sicherlich auch von einer passenden Bibliothek 
lösen lassen (z.B. Java AffineTransform) wenn man das ganze in eine 
Affine Abbildung übersezt, da würde ich mir selber garnicht die Finger 
schmutzig machen ;)

von Simon K. (simon) Benutzerseite


Lesenswert?

Detlef _a schrieb:
> Die Lösung eines linearen Gleichungssystems am Nachmittag macht gute
> Laune für den Rest des Tages.
> Bei hartnäckigen Fällen von Übellaunigkeit muß man allerdings eine DGL
> heranziehen.
>
> :-))
> Math rulez
> Cheers
> Detlef

Sieht nach Mathematica aus :-)

von Detlef _. (detlef_a)


Lesenswert?

yep.

Cheers
Detlef

von Andrea (Gast)


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!

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.