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.
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" ;)
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 :-)
..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
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
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).
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 :-)
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 ;)
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 :-)
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!