ungleichmäßiges viereck in rechteck transformieren
-
Hi
nachdem ich es doch noch geschafft hab, meine Webcam anzusprechen, hab ich vor, so eine Art Infrarot-Maus-Bedien-Dingens zu bauen.Ich habe:
-Webcam mit selbstgebautem IR-Filter (Diskettenfolie)
->ziemlich billig, tuts aber^^
-Infrarotstift (einfach ne IR-Led mid widerstand an ne spannungsquelle und in n stift gebaut)
-Programm was bereits folgendes kannProgramm:
-Bild von der Cam holen (im timerinterval von ca 33ms/~30fps)
-Bild S/W machen, weil ich farbinfos eh nich brauch
-in ner schleife alle pixel durchlaufen; (x&y extraktion mir teilen und modulo)
-sobald ein pixel mit wert>treshold gefunden wird, wird ein floodfill algorithmus gestartet. dieser nimmt von allen pixeln, die um ihn herum sind, sprich, ihn über irgendwelche helle wegen verbunden sind, x und y koordinaten auf und multipiziert sie mit ihrem wert, zusätzlich wird eine extravariable um den wert erhöht. dann wird der pixel schwarz gemacht, damit er nich nochma erkannt wird.
zuletzt werden die x/y koordinaten durch die summe aller gezählten pixel-helligkeitswerte geteilt, um einen gewichteten Mittelwert zu erhalten.
-diese kordinate wird zurückgegeben.
also kann ich von einem beliebig großem, weißen/IR punkt die koordinaten erhalten.
das funzt schon wirklich gut und ohne fehler und die koordinaten scheinen auch zu stimmen.jedoch habe ich ein problem.
ich möchte mit diesen koordinaten den mauscursor steuern. ich denke mal, dass ich irgendwo eine funktion finden werde, womit ich den Cursor bewegen kann und klicken.
Das problem daran is jetzt, das die fläche der webcam ja nich genau der Monitorfläche entspricht. (die auflösung is das geringste problem)und zwar steht die webcam irgenwie so, dass sie den monitor filmt.
Die Bildecken sind nicht genau in den Bildecken der Webcam.
auch hat der monitor auf dem webcambild sicher keine rechteckige (5:4) form.
eher eine trapez- oder komplett unregelmäßige vierecksform.
die webcam hat einen festen standort, während sie benutzt wird. schwenkungen oder eine zweite webcam sind leider nicht möglich.ich muss also irgendwie die ecken des virtuellen Mausfeldes auf die ecken des monitors transformieren und dabei den infrarotpunkt des maus-stiftes korekt ändern.
sry, wenn ich das n bisschen unverständlich schrieb, ich konnte es nich besser
ich habe jetzt irgendwo im internet an diversen orten gefunden, dass man das irgenwie mit ner matrix transformieren kann. jedoch habe ich weder ahnung, wie diese matrix aussehen muss, noch, wie ich diese auf die koordinaten anwenden muss.
da wüsste ich nun gerne wie man sowas bewerkstelligen muss.
Ich verlange keine fertigen copy&paste lösungen, im gegenteil, da lernt man ja nix!
ich suche vielmehr ne anleitung dazu, wie man sowas hinkriegt, am liebsten schön alles erklärt und vllt, wo man auch selber ettwas mitdenken muss.
am liebsten wär mir irgendein link mid einem guten tutorial zu dem thema, nich dass jez jemand auf die idee kommt und das hier alles hintippt Oovorweg: ich bin schüler neunter klasse und hab daher nichma ansatzweise eine ahnung. wir haben erst quadratische gleichungen :p
mir ist durchaus klar, dass das oder jedenfalls änliche probleme bereits in diesem forum diskutiert wurden, jedoch bin ich nicht in der lage, die lösungen zu verstehen.
ich werde versuchen, mein vorhaben mal aufzuzeichnen, mid gimp oder so.
übrigens hab ich folgendes projekt entdeckt. hier unter whiteboard is eig genau das gleiche, wie ich es vorhabe. jedoch mid ner wiimote. Ich bin durch diese seite auch erst auf die idee gekommen
Ich habe auch den Code des Projekts (frei downloadbar), jedoch verstehe ich dieses ganze warpzeug in dem code nicht ganz (wenig kommentiert). Übernehmen kann ich es nicht direkt, weil es C# ist (oder, glaub ich zu mindest).aber da hätte ich schon mal ein ansatz, was ich versuchen würde zu portieren, wenn sich keine Lehrreiche anleitung findet!
danke schonmal in voraus
Gruß Elefunty
-
hi,
du kannst eine abbildung nehmen, die die koordinaten (u,v) aus [0,1]x[0,1] (normierte bildschirmkoordinaten) in eine koordinate x in deinem beliebigen rechteck mit den eckpunkten x1,x2,x3,x4 transformiert. die umkehrung dieser funktion ist das, was du suchst. siehe folgende skizze:
x4 ---------------------------------------------------+ x3 / | / | | | / | | | / \ | x = a + u*(b-a) | / | / \ / /---------+ b = x2 + v*(x3-x2) | /-----X------------- \ / /------------------- / \ | a = x1+v*(x4-x1) +--------- | / | | \ / | / | | /-----+ / /------------- x2 | /------------- / /------------ | /------------- ------- x1 = (x1.x, x1.y)
x1 bis x4 sind zweidimensionale vektoren, u und v reelle zahlen.
-
Hi
danke für die Antwort!Ich habe es jedoch nicht hingekriegt, die Gleichung vernünftig umzuformen.
Bei mir bleiben immer Zwei unbekannte in der Gleichung. Mir ist zwar bekannt, dass man Gleichungen mit 2 unbekannten lösen kann, jedoch hab ich grad keine ahnung, wo ich die zweite gleichung hernehmen soll.
Allein die erste ist -mit Kugelschreiber aufm A4 Papier- schon ca. 2 Zeilen lang und hat diverse Ineinander verschachtelte Brüche und Klammern.Außerdem musste ich mir noch die variablen c und d für die stecke oben und unten dazubasteln. Ich glaube aber, dass ich damit aufm holzweg bin, deshalb frage ich lieber nochma nach, bevor ich drei stunden diese gleichung umreche, nur um zu merken, dass ich da n völlig grundlegenden Fehler drinhab.
Ich denke, mein größtes Problem ist, dass ich nicht weiß, ob jetzt immer wenn da meinetwegen x1 steht, ob dann x1.x oder x1.y gemeint ist.
Allgemein wäre jetzt meine Frage, ob es möglich wäre, dass du es ein wenig deutlicher machen oder erklären würdest, was jetzt was ist.vielleicht auch ein ansatz einer kompletten formel, falls es nicht allzuviel arbeit macht.
aber um klarzustellen, dass ich wenigstens das, was ich verstanden habe, auch richtig verstanden habe:
x1-x4 sind die Eckpunkte des ungleichmäßigen vierecks jeweils mit einem x und einem y wert
x und y sind die koordinaten des punktes im ungleichmäßigen viereck.
u ist die x-variable und v die y-variable im einheitsviereck
[0,1]x[0,1] bedeutet, dass das viereck seine ecken unten links bei (0|0) und oben rechts bei (1|1) hat.
a und b sond solche hilfs dinger, von denen ich noch nicht so recht weiß, wie und wozu sie gut sind.danke schonmal im voraus.
Gruß Ele
/edit: hab jetzt die Warp-klasse aus dem Wii-Projekt in C++ umgeschrieben, so viel anders is C# garnich.
ich weiß nich, obs da noch andere lösungen gibt, ich bin jedoch mit dieser ersmal völlig zufrieden^^Ele