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!
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.