tutorials.de Buch-Aktion 05/2012
Like Tree2Danke
  • 1 Beitrag von Vereth
  • 1 Beitrag von Matthias Reitinger
ERLEDIGT
NEIN
ANTWORTEN
12
ZUGRIFFE
1765
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Avatar von Marschal
    Marschal Marschal ist offline Großer Enumerator
    Registriert seit
    May 2008
    Ort
    Lohfelden (bei Kassel)
    Beiträge
    363
    Hallo Community,

    Ich habe ein Problem was in kein Forum so richtig reinpasst, deshalb hab ichs mal im Coders Talk gepostet.

    Ausgangspunkt:
    (Ich erkläre es prinziepiell ohne zu sehr auf den Kram drum rum einzugehen)

    Ich habe eine Kamera, die irgendwie im Raum angeordnet ist. Diese betrachtet eine Projektionsfläche (aus irgendeinem Winkel).
    Vllt noch schnell was genau das werden soll. Im Prinziep ein Whiteboard, jedoch nur auf optischer Basis, dh keine touchfläche also, deswegen auch die Kamera.
    Somit soll dann (mit einer Lichtquelle z.B.) auf der Projektionsfläche ein optisches Signal erfolgen. dieses Muss die Kamera erfassen (tut sie auch ) und in einen (für den Anfang "nur") Mouseklick auf dem mit dem Beamer verbundenen Rechner erfolgen.

    Hoffe es ist klar, was ich meine. Hab im Anhang eine einfache Darstellung des Aufbaus.

    Mein Problem ist nun folgendes:
    Ich brauche eine Mathematische rechen operation, die das (gezerrte Bild, welches die Kammera wahrnimmt, da sie ja irgendwie angeordnet ist) wieder in ein quadratisches (also Bilschirmauflösung) umrechnet.

    Ich hatte mir eine 4-Punkt kalibrierung gedacht. Also, man geht mit dem Zeigegerät zur Projektionsfläche und klickt auf die 4 Eckpunkte. Somit erhält man auch vier Koordinaten von der Kamara (nähmlich die, wo die einzelnen Eckpunkte landen). Nach der Kalibrierung muss irgendeine Matrix vorhanden sein (so hab ich mir das gedacht) die dan jeden Beliebigen Punkt auf der Projektionsfläche auf den analogen Punkt auf dem Bildschrim umrechen.

    Hier ist also eher ein logisches Problem, programmiert krieg ich das nähmlich, ich hab aber irgendwie Fehler in meinem Ansatz.

    Ich würde mich sehr über Diskusion und Anregung freuen.

    MfG

    EDIT: Zum Bild. Es ist klar, der Beamer stellt ein Recheckiges Bild dar, so wies sein soll, die Kamera sieht jedoch ein ein gezertes Bild, also ein Trapez oder ähnliches. Hoffe es ist klar was gemeint ist, und dass jemand helfen kann

    EDIT2: Auf dem zweiten Bild habe ich nochmal schematisch dargestellt worum es geht.

    MfG
    Miniaturansicht angehängter Grafiken Miniaturansicht angehängter Grafiken Matrix Transformation-untitled.jpg   Matrix Transformation-unbenannt-1.jpg  

    Geändert von Marschal (26.02.10 um 16:43 Uhr)
     


    " Gehirn: ein Organ, mit dem wir denken, daß wir denken. "
    Ambrose Bierce

  2. #2
    Avatar von Vereth
    Vereth Vereth ist offline Mitglied Brokat
    Registriert seit
    Nov 2009
    Ort
    Dortmund
    Beiträge
    372
    Rein geometrisch betrachtet möchtest du ein allgemeines Ur-Viereck in ein Bild-Viereck umwandeln, das folgende Eigenschaften hat:
    • es hat zwei zueinander parallele Streckenpaare
    • die Streckenpaare haben eine definierte Länge
    Gegeben hast du zwei Streckenpaare, die im allgemeinen nicht parallel sind und die paarweise unterschiedliche Längen haben. Jedes dieser Streckenpaare hat dann einen Fluchtpunkt, der nicht im Unendlichen ist. Dann musst du folgende Transformationen ausführen
    1. Rotation um den Fluchtpunkt, damit die Winkelhalbierende parallel zu einer Kante eines Bild-Streckenpaares ist
    2. Trapez-Verzerrung, damit dieses Streckenpaar parallel ist
    3. Scherung, damit die Winkelhalbierende des zweiten Streckenpaares parallel zu einer Kante des anderen Bild-Streckenpaares ist
    4. Trapez-verzerrung, damit das zweite Streckenpaar parallel ist
    5. Skalierung und Translation (Verschiebung), damit das Bild-Viereck die geforderte Größe und Lage hat
    Das ist eine sehr anspruchsvolle Problemstellung, und ich wünsche dir viel Erfolg bei der Realisierung.
     
    Vielen Dank für die Nutzung des Bewerten- und Danke-Buttons

    Wenn man sieht, dass man einen anderen glücklich gemacht hat, ist die Welt um zwei glückliche Menschen reicher.

  3. #3
    Avatar von Marschal
    Marschal Marschal ist offline Großer Enumerator
    Registriert seit
    May 2008
    Ort
    Lohfelden (bei Kassel)
    Beiträge
    363
    Hi, erstmal danke für deine Antwort.

    Ich verstehe was du meinst, jedoch glaube ich nicht dass mir das wirklich was bringen würde?!

    Ich muss ja nicht nur ein 4-Eck transformieren, sondern auch jeden Punkt proporional korrekt abbilden. Da müsst ich ja ständig neue Berechnungen anstellen.

    Gedacht hatte ich mir das so, dass ich irgendwie aus diesen 4 Punkten (Kalibrierung) eine oder auch mehrere Matrizen ausrechne und dann einenbeliebigen Vektor innerhalb des Ur-Bilds mit der Matrix verrchnen kann und dan einen korrekten Bildvektor erhalte. Was mir fehlt ist dieses "irgendwie"

    Ich hatte folgenen Ansatz:

    v1 * m1 = v1'

    v1 sei eine matrix, bzw ein Vektor (je nach Dimension) der die Input, also Ur-Bild koordinaten (4-Eckpunkte) beinhaltet.
    m1 ist die auszurechnende Hypermatrix (beinhaltet 4 2*2 Matrizen, immer eine pro Eckpunkt, der Rest Null)
    v1' ist der Vektor, bzw Matrix mit dem Entzerrten Bild, also meine Bildschirm Koordinaten (In meinem Fall die Echpunkte eines 1400*900 4-Ecks)

    v1 wird eingelesen von der Kamera, v1' kenn ich auch, m1 ist unbekannt. Das Problem, m1 ist nicht bestimmbar, da beim Aufstellen eines liniaren Gleichungssystems acht Gleichungen mit je 2 Unbekannten entstehen. Auslo nicht lösbar. In meinem Ansatz fehlt irgendwas, was das Ganze lösbar macht.

    MfG
     


    " Gehirn: ein Organ, mit dem wir denken, daß wir denken. "
    Ambrose Bierce

  4. #4
    Avatar von Vereth
    Vereth Vereth ist offline Mitglied Brokat
    Registriert seit
    Nov 2009
    Ort
    Dortmund
    Beiträge
    372
    So einfach kannst du dir das nicht machen.
    Deine Punkte, mit denen du arbeitest, sind keine mathematischen Punkte, sondern Pixel, und diese sind examplarische Punkte für als atomar anzusehende Teilflächen deines Gerätes (Bildschirm, Drucker etc.). Die Abbildung ist also nicht bijektiv, weil zwischen den Pixeln im allgemeinen eine m:n-Relation besteht, die außerdem noch gewichtet werden muss, weil nicht jedes Ur-Pixel in Gänze Teil eines Bild-Pixels sein muss. Die oben genannten Transformationsschritte sind voneinander abhängig, weil die Parameter einer Transformation von den Ergebnissen der vorherigen beeinflußt wird. Die Verknüpfung ist also nicht assoziativ, was bei einer Matrixmultiplikation der Fall sein müsste. Das ist deswegen so, weil Matrizen nur für affine Abbildungen geeignet sind, aber z.B. die Trapez-Transformation ist nicht affin.
     
    Vielen Dank für die Nutzung des Bewerten- und Danke-Buttons

    Wenn man sieht, dass man einen anderen glücklich gemacht hat, ist die Welt um zwei glückliche Menschen reicher.

  5. #5
    Avatar von Marschal
    Marschal Marschal ist offline Großer Enumerator
    Registriert seit
    May 2008
    Ort
    Lohfelden (bei Kassel)
    Beiträge
    363
    Hört sich (theoretisch) gut an was du sagst

    Ehm Trapetzformation scheint also mein Ansatz zur Problemlösung zu sein.

    Zu den Pixeln, logisch, meine Bildschirm Koordinaten sind pixel, die der Kamera jedoch auch (auch wenns eine andere Auflösung ist, ist aber egal).
    Gut, dass das mit der Matrix nicht klappt ist mir schon irgendwie aufgefallen Klar, dass nicht jedes Pixel transformiert werden kann, doch das kann ja aproximiert werden, die leichte toleranz lässt sich verkraften.

    Mein mathe Dok hat mir was von Clustertn erzählt. ich müsse immer Kleine Cluster Transformieren, doch das ginge laut einer Vorstellung mit Hilfe einer Matrix, was ja nicht geht, wie die Praxis zeigt.

    Könntest du deine Theorie etwas exemplarischer ausformulieren? Wäre dir sehr dankbar dafür. Ich schau mal, was ich zu den von dir genannten Begriffeim Netz finden kann.

    Danke für die Hilfe auf alle Fälle

    MfG
     


    " Gehirn: ein Organ, mit dem wir denken, daß wir denken. "
    Ambrose Bierce

  6. #6
    Avatar von Vereth
    Vereth Vereth ist offline Mitglied Brokat
    Registriert seit
    Nov 2009
    Ort
    Dortmund
    Beiträge
    372
    Ich habe dir hier mal ein Bildchen gemacht, das dir die Resultate der einzelnen Schritte veranschaulicht. Die Genauigkeit ist nicht besonder hoch, aber es dürfte dir einen passenden Eindruck vermitteln, wie so etwas aussehen könnte.
    Miniaturansicht angehängter Grafiken Miniaturansicht angehängter Grafiken Matrix Transformation-transfo.jpg  
    Marschal bedankt sich. 
    Vielen Dank für die Nutzung des Bewerten- und Danke-Buttons

    Wenn man sieht, dass man einen anderen glücklich gemacht hat, ist die Welt um zwei glückliche Menschen reicher.

  7. #7
    Avatar von Marschal
    Marschal Marschal ist offline Großer Enumerator
    Registriert seit
    May 2008
    Ort
    Lohfelden (bei Kassel)
    Beiträge
    363
    Vielen Dank ersteinaml für deine Hilfe. Ich weis zwar noch nicht wie man das umsetzen könnte, werd aber mein bestes geben

    Ich denke mal, wir sprechen uns montag nochmal
     


    " Gehirn: ein Organ, mit dem wir denken, daß wir denken. "
    Ambrose Bierce

  8. #8
    lui7172 lui7172 ist offline Mitglied
    Registriert seit
    Mar 2008
    Beiträge
    17
    Mal so einfach gebrainstormt;
    Wenn Du eine 5-Punkt-Kalibrierung durchführst, alle vier Ecken plus Mitte, dann erhälst Du für jeden Quadranten einen Streckungsfaktor für x und y, anhand dessen Du jede Position umrechnen kannst.Den Mittelpunkt des Rechteckes würde ich auf 0/0 setzen. So lange es sich nur um (lineare) Streckung und Stauchung handelt sollte das doch ausreichen? Bei Rotation wird es aufwendiger.

    Sicher bin ich mir nicht, ist alles so lange her Aber vlt. ein einfacher Ansatz.
     

  9. #9
    Avatar von Marschal
    Marschal Marschal ist offline Großer Enumerator
    Registriert seit
    May 2008
    Ort
    Lohfelden (bei Kassel)
    Beiträge
    363
    Nun, schau mal, wp ist da der unterschied. 4 Kalibrirungspunkte -> ich erhalte ein Viersck, velches (nur mal theoretisch) transformiert werden muss.

    5 Kalibrierungspunkte -> ich erhalte 4 vierecke, bei denen ich für jedes das gleiche tun muss.

    Num wenn man deine Idee vprtführt, dann müsste man immer mehr und mehr vier-Ecke nehmen, was den Rechenaufwand, die zeit die benötigt wird, so wie die Rechenleistung exponential in die Höhe schießen lässt - wenn man ein gescheites halbwegs präzises ergebniss erhalten will.

    Ich fäd halt auch eine Lösung schön, bei der nur einmal, Beispielsweise bei der Kalibrierung, die ganze Rechnerei erfolgt, danach immer nur noch jeder Punkt einzeln (nicht mehr rechenaufwändig) transformiert werden kann. Bei deine Idee hieße dass, ich muss für jeden Punkt immer wieder alles neu berechnen.

    Aber trotzdem danke

    So langsam kommen hier ja Ideen Ich würde mich freuen, wenn wir das hier zu einer schönen Diskussionsrunde ausweiten könnten, vllt hab ich ja dank vieler verschiedenen und kreativen Ideen irgendwann einen Einfall, wie man das Problem schön und elegant realisieren könnte

    MfG

    EDIT: Eigentlich garnicht übel deine Idee, ich glaube jetzt weis ich was mein Mathe Doktor Ingeneur so meinte mit den Clustern
    Ich breauch den Punkt in der Mitte doch garnicht. Ich kann doch einfach die zwei Diagonalen kreuzen lassen, da das ein liniares Verhältniss ist, kommt auch immer ein Schnittpunkt, und zwar genau der Mittelpunkt dabei raus

    Mal sehen, vllt kann man das ja erst einmal für eine Beta-Version so programmieren, wird auffwändig werden

    EDIT2: Ach du sch***e, da erhalte ich ja Datenmengen von gigantischem Ausmaß Gut, dass ich 4GB Ram und nen zwei Kern habe:P
    Geändert von Marschal (27.02.10 um 12:57 Uhr)
     


    " Gehirn: ein Organ, mit dem wir denken, daß wir denken. "
    Ambrose Bierce

  10. #10
    Registriert seit
    Dec 2001
    Ort
    Bayern
    Beiträge
    5.805
    Blog-Einträge
    5
    Hi,

    du suchst die über vier Bild-/Urbild-Punktpaare eindeutig festgelegte projektive Abbildung. Seien A, B, C und D die Urbildpunkte (Eckpunkte auf dem verzerrten Kamerabild), A', B', C' und D' die entsprechenden Bildpunkte, alle in homogenen Koordinaten[1]. Bestimme nun die Lösung der beiden folgenden Gleichungssysteme:
    Name:  lgs1.png
Hits: 79
Größe:  2,5 KB
    Name:  lgs2.png
Hits: 78
Größe:  2,7 KB

    Die gesuchte Matrix M der projektiven Abbildung ist dann
    Matrix Transformation-ergebnis.png

    Einen Punkt P = (x, y) auf dem Kamerabild wandelst dann wie folgt in Bildschirmkoordinaten um:
    1. Erweiterung des Punktes auf homogene Koordinaten (Anhängen einer 1)
    2. Anwendung der Matrix: P' = (x', y', z') = MP
    3. Zurückführen auf einen 2D-Punkt: (x' / z', y' / z')

    Grüße,
    Matthias

    [1]: Man erhält man die homogenen Koordinaten eines 2D-Punktes (x, y), indem man ihn durch Anhängen der z-Koordinate 1 in einen 3D-Punkt (x, y, 1) umwandelt.
    Marschal bedankt sich. 
    „Gib einem Menschen einen Fisch, und er wird für einen Tag satt. Lehre ihn Fischen, und er wird ein Leben lang satt.“
    “For every complex problem, there is an answer that is short, simple and wrong.”
    “Pessimism is safe, but optimism is a lot faster!”


    Aktuelles Coding Quiz: #17 - Wörter kreuz und quer

  11. #11
    Avatar von Marschal
    Marschal Marschal ist offline Großer Enumerator
    Registriert seit
    May 2008
    Ort
    Lohfelden (bei Kassel)
    Beiträge
    363
    Danke für deinen Ansatz
    Ich habe mich nähmlich derzeit zu einem Interativen ansatz entschieden.
    Ich habe eine Funktion geschrieben, die das Bild immer in 4 Abschnitte teilt und dan entscheidet, in welchem Abschnit der Inputvektor liegt. Somit wird angenährt wo der Punkt liegt, und die Vorgehensweise rückwärts angewandt erzeugt mir ja auch meinen Abbild-Vektor.
    Die Lösung erachte ich aber als unschön, da ich sehr verschwenderisch mit RAM und CPU umgehe dadurch, dewegen werde ich später mal die elegantere Matrizenlösung probieren.
    Da ich grade aber etwas unter Zeitdruck durch das Landesabitur stehe kann ich mich derzeit nicht damit auseinander setzen.

    Auf jeden Fall danke für deine Hilfe, ich werde bestimmt nochmal darauf zurück kommen.
     


    " Gehirn: ein Organ, mit dem wir denken, daß wir denken. "
    Ambrose Bierce

  12. #12
    digitalhoax digitalhoax ist offline Rookie
    Registriert seit
    Jan 2011
    Beiträge
    0
    Danke für den entsprechenden mathematischen Ansatz. Wer eine Umsetzung in Java benötigt, kann sich hier melden, habe ich gerade inklusive Testumgebung fertiggestellt.
    Gruß, dih
     

  13. #13
    Avatar von Marschal
    Marschal Marschal ist offline Großer Enumerator
    Registriert seit
    May 2008
    Ort
    Lohfelden (bei Kassel)
    Beiträge
    363
    Hi. Ich hab das Projekt letztes Jahr fertiggestellt und zum Abi präsentiert (15pkt) Somit habe ich mich ausreichend mit dem Thema beschäftig, wie du dir vorstellen kannst. Ich selbst habe das Problem in C# realisiert damals, eine Doku zu geschrieben und sämtliche Erklärungen und Erläuterungen angefügt, ganz so wie es das Land Hessen für eine besondere Lernleitung wünscht

    Somit würde ich mir gerne deinen Ansatz anschauen, den Java ist beinahe identisch zu C#.

    MfG Marschal
     


    " Gehirn: ein Organ, mit dem wir denken, daß wir denken. "
    Ambrose Bierce

Ähnliche Themen

  1. 3D Transformation
    Von tobee im Forum Flash Plattform
    Antworten: 3
    Letzter Beitrag: 04.08.10, 09:44
  2. Transformation
    Von FiselM im Forum Java
    Antworten: 18
    Letzter Beitrag: 07.01.08, 21:32
  3. XSL Transformation
    Von Tikonteroga im Forum Java
    Antworten: 0
    Letzter Beitrag: 13.07.07, 10:20
  4. PHP XSL Transformation
    Von shockshell im Forum PHP
    Antworten: 1
    Letzter Beitrag: 06.06.05, 13:04
  5. 3D-Transformation in CS?
    Von Lenhard im Forum Photoshop
    Antworten: 2
    Letzter Beitrag: 17.10.04, 16:46