2017-03-28 6 views
1

Ich habe 4 Punktwerte: TopLeft, TopRight, BottomLeft, BottomRight. Diese definieren eine vierseitige Form (wie ein verzerrtes Rechteck) auf meinem Monitor. Dies sind die Punkte, die ein Tobii Blick Gerät denkt Ich schaue, wenn in der Tat ich die vier Ecken meines Monitors betrachte.Plotten einer Position in ein unregelmäßiges Rechteck

Dieses Bild zeigt ein Bitmap auf der linken Seite, das meinen Monitor darstellt, und die Punkte, die das Tobii-Gerät mir sagt, wenn ich tatsächlich in die Ecken des Bildschirms schaue. (Es ist eine Darstellung, nicht real).

Example

Ich möchte diese vier Kalibrierungspunkte verwenden, um einen Bildschirm X, Y-Position zu übernehmen, die von einer falschen Blickposition ist und korrigieren, so dass es nach dem Bild auf der rechten Seite positioniert ist.

+0

ziemlich kompliziertes Thema, https://www.tutorialspoint.com/computer_graphics/2d_transformation.htm obwohl ich denke, für einfachere Formen wie Rechteck zu trapez ohne Rotation ist einfach. – maraca

+0

Sie brauchen ** Perspektive ** Transformation hier, nicht affine. Aber um persp.transform zu definieren, sollte man vier Punktepaare angeben: https://www.cs.cmu.edu/~ph/texfund/texfund.pdf – MBo

+0

@MBo Wenn man sich ansieht, wohin sich der zweite Punkt bewegt, ist das kein a Perspektivische Transformation, ansonsten würde sich der Punkt viel mehr nach rechts bewegen (zeichne die Diagonalen im verzerrten Rechteck, um zu sehen, wo das Zentrum ist). – m69

Antwort

3

Bearbeiten: Neue Lösung für die bearbeitete Frage ist am Ende.

Dieses Problem ist Anruf bilinear interpolation.
Sobald Sie die Idee begreifen, wird es sehr einfach sein und Sie würden es für den Rest Ihres Lebens erinnern.
Es wäre ziemlich lang, alle Details hier zu veröffentlichen, aber ich werde es versuchen.

Zuerst werde ich den Punkt auf der linken Seite zu (x,y) und das Recht zu (X,Y) sein.

Lassen Sie (x1,y1), (x1,y2), (x2,y1), (x2,y2) die Eckpunkte auf dem linken Rechteck sein.

Zweitens wollen wir das Problem in zwei bilineare Interpolation Probleme aufgeteilt:

  • X
  • wollen finden wollen Y finden

ist sie eins nach dem anderen (Xoder Lassen finden Y).

definieren: Qxx sind der Wert von XoderY der vier Ecken in dem rechten Rechteck.

Angenommen, wir möchten den Wert der unbekannten Funktion f bei den Punkt (x, y) finden. Es wird angenommen, dass wir den Wert von f bei vier Punkten Q11 = (x1, y1), Q12 = (x1, y2), Q21 = (x2, y1) und Q22 = (x2, y2) kennen.

Die f(x,y) des Problems ist XoderY in Ihrer Frage.

enter image description here

Dann interpolieren Sie f(x,y1) und f(x,y2)f(x,y) auf die gleiche Art und Weise zu sein.

Schließlich werden Sie XoderY = bekommen f(x,y)

Referenz: hier Alle Bilder/Formeln/Text aus dem Wiki-Link (einige mit Modifikation) kopiert werden.

Bearbeiten: Nachdem die Frage bearbeitet wurde, wird es sehr unterschiedlich.
Die neue ist entgegengesetzt, und es ist "inverse bilinear interpolation" genannt, die viel schwieriger ist.
Für weitere Informationen lesen Sie bitte http://www.iquilezles.org/www/articles/ibilinear/ibilinear.htm

+0

Ich habe die Frage präzisiert. Ist deine Antwort immer noch gültig? Wenn ja, werde ich versuchen zu verstehen, wovon zum Teufel du redest und es in C# umwandeln :) –

+0

@Peter Morris Nein, es gilt nicht mehr. Ich habe die Antwort bearbeitet, um Ihren neuen Fall zu behandeln. – javaLover

+0

Der Link, den du mir geschickt hast, hat wie ein Zauber funktioniert. Ich danke dir sehr! –

0

Sie können eine eindeutige lineare Transformation mit 6 Gleichungen definieren. Die drei Punkte, die ausgerichtet werden müssen, stellen diese 6 Gleichungen bereit, da jedes Paar übereinstimmender Punkte zwei Gleichungen in x und y liefert.

Wenn Sie dies verfolgen möchten, kann ich die Matrixgleichung bereitstellen, die die lineare Transformation basierend auf der Abbildung von drei Punkten definiert. Sie invertieren diese Matrix und es wird die lineare Transformation bereitstellen.

Aber damit ist die Transformation vollständig spezifiziert. Sie haben keine Kontrolle darüber, wo die Eckpunkte des ursprünglichen Vierecks liegen. Im Allgemeinen können Sie nicht einmal eine lineare Transformation definieren, um ein Viereck auf ein anderes zu mappen; dies ergibt 8 Gleichungen (2 für jede Ecke) mit nur 6 Unbekannten. Es ist überspezifiziert. Tatsächlich muss eine lineare Transformation ein Rechteck immer einem Parallelogramm zuordnen, so dass Sie im Allgemeinen keine lineare Transformation definieren können, die ein Viereck mit einem anderen verknüpft.

Wenn es also keine lineare Transformation sein kann, kann es eine nichtlineare Transformation sein? Nun, ja, aber nichtlineare Transformationen ordnen gerade Linien nicht notwendigerweise geraden Linien zu, so dass die zugeordneten Kanten des Vierecks nicht gerade sind. Oder irgendwelche anderen Linien. Und Sie haben immer noch 14 Gleichungen (2 für jeden Punkt und jede Ecke), für die Sie eine nichtlineare Transformation mit 14 Unbekannten erfinden müssen.

Also das Problem wie gesagt kann nicht mit einer linearen Transformation gelöst werden; es ist über spezifiziert. Wenn Sie eine nichtlineare Transformation verwenden, müssen Sie eine nichtlineare Transformation entwickeln, die 14 freie Variablen enthält (gegenüber 6 in einer linearen Transformation). Dadurch werden die 7 Punkte korrekt zugeordnet, aber gerade Linien sind nicht mehr gerade. Wenn Sie diese Anforderung hinzufügen, wird eine unendliche Anzahl von Einschränkungen hinzugefügt (eine für jeden Punkt in der Zeile), und Sie können nicht einmal kontinuierliche Funktionen verwenden.

Möglicherweise gibt es eine Lösung für das, was Sie gerade tun (dh die zugrunde liegende Anwendung benötigt), aber als mathematisches Problem ist es unlösbar.

Lassen Sie mich wissen, wenn Sie möchten, dass die Matrixgleichung eine lineare Transformation basierend auf der Transformation von 3 Punkten erzeugt.

Verwandte Themen