konstante Projektion eines Bildes unabhängig davon wie das Projektor steht (somit ohne Winkelabhängigkeit)
-
Hallo die Community,
ich bin ganz neu und auch frisch in Programmieren. Keiner kommt ja mit diesem Wissen zur Welt.
Ich will ein Programm mit Visual C++ schreiben, welches eine Bildwiedergabe unabhängig wie der Projektor steht, ermöglicht. Das heisst, das Bild muss jedesmal neugerechnet / gerendert werden, wenn sich der Projektor bewegen würde. Damit man vom Betrachter her immer das gleiche Bild sehen kann..
Wie soll ich sowas programmieren, was soll ich dafür nutzen? Wie soll ich an die Sache rangehen? OpenCV ? Aber inweifern?
Ich bin für jede Tipps, Frage, Antwort und Hinweiss dankbar.
freundliche Grüße
s.
-
Klingt interessant, aber wie merkst du denn, dass der Projektor bewegt wurde? Und wie ermittelst du Winkel und Entfernung zur Wand?
-
Badestrand schrieb:
Klingt interessant, aber wie merkst du denn, dass der Projektor bewegt wurde? Und wie ermittelst du Winkel und Entfernung zur Wand?
zum beispiel so: http://de.youtube.com/watch?v=XgrGjJUBF_I&feature=channel
-
Badestrand schrieb:
Klingt interessant, aber wie merkst du denn, dass der Projektor bewegt wurde? Und wie ermittelst du Winkel und Entfernung zur Wand?
Über Infrarot Kameras, bzw. spezialle Marker für die Kameras.
Ich will nur das Bild entsprechend anpassen können. Kamere- bzw. Wand-Koordinaten werden erstmal fest sein, damit Ich manuel die probeweise ändern kann. Ich will halt ein anhand der Wand verzerrtes Bild projezieren.
Wie mache ich aber dieses Kalibration des Bildes?
Welche Klassen, wie?Ic
Viele Grüße
s.
-
das must du den herssteller des beamers fragen, oder?
wenn du das slebst machen willst, büßt du ja teile der Auflösung ein, da du das Projizierte Bild verkleinern musst, damit du die Bereich die du strecken musst, oder Rotation, jnoch drauf bekommst.
Aber zur eigendlichen Frage:
Was Kumpel und ich im Studium mal gemacht haben:
Wir haben DirektX benutzt, um ein Kamerabild einer Weitwinkelkamera zu entzerren.
Wir haben ein ebenes Mesh mit 64*64 Punkzen erzeugt und darauf das Video gerendert (video to texture).
Die gitterpunkte haben wir dann gemäß der Radialenverzeichnugsformel nach hinten oder vorn geschoben, so dass auf dem Viewport das ganze unverzerrt aussah. Dieses Bild haben wir dann gecaptured und damit gearbeitet, bzw den anderen zur verfügung gestellt.Das ganze sollte sich auch umkehren lassen, um damit bilder geziehlt zu verzerren, so dass sie der Raumgeometrie entgegenwirken.
Also erst Mesh erzeugen mit deinem Bild als Textur, dann die Punkte ahand der Tiefeninformation anpassen und dieses Bild dann auf die Wand werfen.
Sollte sogar noch einfacher sein, da du zum schluss nicht das gerenderte Bild capturen musst, sondern es direkt auf die Wand werfen kannst.Nebenbei: Wenn das Bild in eine Raumecke projiziert wird, kann nur ein Zuschauer ein unverzerrtes Bild sehen.
-
vlad_tepesch schrieb:
das must du den herssteller des beamers fragen, oder?
wenn du das slebst machen willst, büßt du ja teile der Auflösung ein, da du das Projizierte Bild verkleinern musst, damit du die Bereich die du strecken musst, oder Rotation, jnoch drauf bekommst.
Aber zur eigendlichen Frage:
Was Kumpel und ich im Studium mal gemacht haben:
Wir haben DirektX benutzt, um ein Kamerabild einer Weitwinkelkamera zu entzerren.
Wir haben ein ebenes Mesh mit 64*64 Punkzen erzeugt und darauf das Video gerendert (video to texture).
Die gitterpunkte haben wir dann gemäß der Radialenverzeichnugsformel nach hinten oder vorn geschoben, so dass auf dem Viewport das ganze unverzerrt aussah. Dieses Bild haben wir dann gecaptured und damit gearbeitet, bzw den anderen zur verfügung gestellt.Das ganze sollte sich auch umkehren lassen, um damit bilder geziehlt zu verzerren, so dass sie der Raumgeometrie entgegenwirken.
Also erst Mesh erzeugen mit deinem Bild als Textur, dann die Punkte ahand der Tiefeninformation anpassen und dieses Bild dann auf die Wand werfen.
Sollte sogar noch einfacher sein, da du zum schluss nicht das gerenderte Bild capturen musst, sondern es direkt auf die Wand werfen kannst.Nebenbei: Wenn das Bild in eine Raumecke projiziert wird, kann nur ein Zuschauer ein unverzerrtes Bild sehen.
Ja bei unserer Anwendung soll auch nur einer es sehen, zumindest für den Anfang.
Wie mache ich denn das ganze? Wie erzeugt man ein Mesh? Soll ich es über graphedit machen? Was soll ich mir reinziehen.. Könntest du mir bitte einige Quellen bzw. Themengebiete vorschlagen, damit ich das tun kann, was du mir vorgeschlagen hast.
Danke!
viele Grüße
s.
-
sloomy schrieb:
Wie mache ich denn das ganze? Wie erzeugt man ein Mesh? Soll ich es über graphedit machen? Was soll ich mir reinziehen.. Könntest du mir bitte einige Quellen bzw. Themengebiete vorschlagen, damit ich das tun kann, was du mir vorgeschlagen hast.
Nun ja, das ganze ist, wenn du noch gar nix in die richtung gemacht hast recht aufwendig zu lernen. Dafür passiert das ganze aber dann auf der Grafikkarte. Ist natürlich auch die Frage ob man das will. Wenn das letztendliche Ziel ein embedded-System ist, wäre das wahrscheinloihc kontraproduktiv. Wenn das egal, hast du den großen Vorteil, dass das anze ohne viel Rechenlast, quasi von der GraKa gerendert wird.
Das einzige Problem ist, das anzuzeigende Bild/Video in eine Textur zu bekommen. Bei videos an sich ist es sicher einfacher, als der gesammte desktop.Du hast auch die Wahl zwischen OpenGL und DirectX.
Für dem Umgang hiermit suchst du dir am besten selbst Tutorials.Hab mir nochmal dein ersten Post durchgelesen, da stellt sich mir folgende Frage:
bewegt sich der Beamer die ganze zeit, oder gibt es eine Kalibrierphase und dann sollte er sich nicht mehr bewegen.Wie sieht denn die Kalibrier-strategie aus?
Bekommst du nur das Bild der Infrarot kameras, oder schon eine Entfernungskarte.
Oder strahlt der Beamer das Kalibrierpattern?Nimmt das Kalibriersystem das Bild von dem Punkt auf, wo der Zuschauer später sitzt?
In der Kalibrierung selbst stecken natürlich die größeren schwierigkeiten, mein Vrschlag bezog sich nur auf den 2. Teil, nämlihc die erkannten Unebenheiten auszugleichen und das möglichst effizient und Echtzeitfähig.
Der andere weg (für den Anfang einfachere) wäre natürlich, einfach Pixelweise das neue Bild nach einer Look-Up-Table (die ntürlich trotzdem berechnet werden muss) Zusammenzusetzen.
-
also der Projektor steht eigentlich konstant, nicht dass der immer in Bewegung ist, aber der Betrachter könnte ihn ja halten wie er es will, nicht dass er immer in bestimmter Höhe mit bestimmter Enfernung halten muss. Dass er auch mal die Hände tauschen kann, aber das projezierte Bild immer noch das gleiche ist. (von seinem Betrachtungswinkel her natürlich
)
Als wir kriegen schon das Bild bzw. die gerenderte Grafik ( es sollen bestimmte gerenderte Grafiken projeziert werden)über DirectX bzw. DirectShow über eigenes Programm ( mit Graphedit usw) projeziert.
Jetzt müssen wir sie halt anhand des Projektorstandortes anpassen ( neu rendern).
Der Projektor halt hat diese Markern drauf und die Infrarot-Kameras wissen, wo und wie halt der steht, im Detail weiss es aber nicht, ich glaube das werden wir es aber auch durchs Testen dann anpassen. Deswegen kann ich deine Frage darüber jetzt nicht soo detalisiert antworten.
Kann man dann nicht einfach die Grafik anhand der Winkeln, die sich wegen der Position des Betrachters, des Kameras und der Projektionsstelle neurendern bzw. verzerrt projezieren?
Hast du damals auch mit OpenGL oder mit DirectX genutzt?
Ich würde mir auch gerne selber die Tutorials suchen, aber ich weiss nicht mal wie es heisst, was ich gerade versuche, zu machen? Das merkt man auch ganz bestimmt von meiner Überschrift!
Übrigens wäre es eigentlich bessern, wenn wir es über CPU rendern könnten, ist erstmal kein muss, aber für die Zukunft wäre es besser, wenn das jetzt schon mal entsprechend programmiert sein könnte.
Was heisst es dann überhaupt, was ich gerade versuche?
vlad, ich danke dir sehr für deine Zeit und Mühe.
ich bin aber auch für alle andere Hinweise, Ideen, Vorschläge dankbar!
Viele Grüße
s.
-
volkard schrieb:
zum beispiel so: http://de.youtube.com/watch?v=XgrGjJUBF_I&feature=channel
sehr nice!
-
hey vlad_tepesch, wie hast du denn dein Mesh erzeugt??
Ich bin am verzweifeln weil ich absoluter newbie in directx binGrüße