![]() |
Zeichnen auf Video?
Hi,
Also ich hab grad mit Delphi angefangen und muss nun für mein Projekt auf einem Video zeichnen. Das Video läuft über diese TMediaPlayer sache und wird in einem Panel angezeigt. Kann ich irgendwie auf diesem Video z.b. Kreise malen? Wenn das so nicht geht, weiß jemand eine Möglichkeit auf einem Video zu malen? Vielen Dank für jede Hilfe und `nen schönen Gruß, Quetzalcoatl |
Re: Zeichnen auf Video?
Obwohl ich dir da nicht helfen kann schreibe ich trotzdem, weil ich die Herzlich in der DP Willkommen heissen will!
übersichtshalber hier die ausgangsfrage: Zitat:
|
Re: Zeichnen auf Video?
Moin!
MCI (der TMediaPlayer spricht MCI an) bietet Möglichkeiten, sich in den Draw-Händler einzuklinken, theoretisch müsste es also möglich sein, aber ich würde da direkt mit MCI Arbeiten, anstatt das mit dem TMediaPlayer zu versuchen. Eine andere Möglichkeit wäre, es mit DirectShow zu machen. |
Re: Zeichnen auf Video?
Hallo!
Was nennst Du den Malen? - Einmalig? - Live/realtime? - oder das Video ändern? Frank :coder: |
Re: Zeichnen auf Video?
Mit malen meinte ich eine bestimmte Stelle markieren. Also was ich vor hab ist das man eine bestimmte Stelle anklickt, mehrmals an verschiedenen Stellen, dann wird ein Farbmittelwert gebildet und mit diesem soll der Punkt den man ausgewählt hat im video weiterverfolgt werden. Im Prinzip nicht weiter schwierig, bloß fehlt mir noch die Grundlage in Delphi, eben diese Stelle live im Video dann auch markieren zu können, z.b. mit einem Kreis.
Also wenn da wer was zu weiß, bitte melden ;) Achja das mit MCI hab ich leider absolut nicht verstanden -.- Quetzalcoatl |
Re: Zeichnen auf Video?
So, ich hab jetzt mal festgestellt das man auf ein Panel ja ganz einfach draufmalen kann über so ein Canvas.. also ich kann auf dasselbe Panel,auf dem nachher das video läuft auch draufmalen, nur wird das Video über den Kreis gemalt, sodass man den nich sieht.. kann man da irgendwie die reihenfolge umstellen, also das das Canvas zeugs überm Video liegt, und man dann den kreis auf das Video draufmalt? Weiß das wer? oder bin ich auf nem ganz falschen weg, nur wie gehts dann?
edit: achja, was ich auch irgendwie noch nich hinbekommen habe: Wie sag ich Delphi eigentlich, dass eine Prozedur in jedem Programm durchlauf aufgerufen werden soll? Also ich krieg das bisher nur so über diese onClick ereignisse und so hin, aber ich bräuchte das ja so, dass immer neugezeichnet wird.. Danke für jede Hilfe ;) |
Re: Zeichnen auf Video?
Zitat:
|
Re: Zeichnen auf Video?
Zitat:
|
Re: Zeichnen auf Video?
So, habs mit dem Timer nu begriffen, bleibt nur das problem das ich das malen über dem Video ruhig immer wieder wieder holen kann, es aber trotzdem nicht drübergemalt wird..
Hat noch wer ne Idee wie man auf ein Video malt? Und was war das mit dem MCI? Danke, Quetzalcoatl |
Re: Zeichnen auf Video?
Hi Quetzalcoatl,
also um das mit dem Canvas mal zu beleuchten *G*: Das Video wird sozusagen auch da drauf gemalt - nur öfter als du da kreise malen kannst- sonst würde das ja nicht laufen sondern stocken... MCI - F1 ;-) hab mich auch mal damit beschäftigt - wollte die Standard ton ausgabe ändern- das ist richtig kompliziert - finde ich zumindest^^ was mir noch als Möglichkeit einfällt wäre OpenGL zu benutzen. ![]() Allerdings ist das schon sehr aufwändig und kompliziert - man sollte sich schon ein wenig mit Delphi beschäftigt haben - sonst verliert man wahrscheinlich zu schnell die Lust/ den Spaß... Ansonsten vielleicht einfach ein Anderes Panel oder co, was Transparent schalten geht, drüber legen und da dann drauf malen- könnte nur etwas flackern... Leuchtende Grüße Stefan (alias Light) |
Re: Zeichnen auf Video?
Danke für die Antwort.
Das mit dem Panel drüberlegen hab ich auch probiert. nur wird dann das Video einfach über das Panel drübergemalt, kann man irgendwas machen, das das 2. Panel immer über dem andern ist? Eine andere Möglichkeit die auch funktioniert, ist ein 2.Form aufzumachen und das Transparent zu machen und genau über das Video zu setzen. Damit kann man dann auf das Video zeichnen. Nur.. wenn ich dann wieder auf das erste Form klicke, verschwindet das 2. wieder in den Hintergrund... kann man da was machen? also im Prinzip sowas wie Form2.showModal, sodass das 2. Formblatt immer über dem ersten ist, nur das man das erste auch noch benutzen kann? Besser wäre natürlich wenn man ein 2.Panel irgendwie dazubekommen könnte grundsätzlich über dem ersten zu sein.. Edit: Das mit dem Form2 im Vordergrundhalten hat sich erledigt: Form2.FormStyle := fsStayOnTop; Ich bin heut wohl bissl zu schnell mit Fragen ;) Mit den Panels wäre es trotzdem schöner... Achja und ich hab schon wieder ne Frage.. Ist es eigentlich möglich ein video größer zu machen? und überhaupt die Größe des Videos rauszufinden und sowas? |
Re: Zeichnen auf Video?
Zitat:
![]() ![]() Irgendwie hab ich immer noch net raus, was Du genau vor hast :gruebel: |
Re: Zeichnen auf Video?
Perfekt ^^ das is genau was ich gesucht hab, danke...
so dann sollte das soweit, mit dem umweg über das zweite Formblatt gehen.. Öh, was ich genau will hab ich nich gesagt stimmt.. weil dann lacht ihr mich ja alle aus ^^ Im Prinzip gehts um Motion Capturing. Also Ich glaub ja nich das das so ganz einfach möglich ist, im Moment gehts mir auch mehr um das Prinzip. Also ich hab ein Video, wo ich mit Tischtennisbällen an den Gelenken ne Bewegung mache ^^. Dann fängt das Programm an: zuerst werden an verschiedenen Stellen im Video vom Benutzer die Bälle markiert. Es wird ein Rechteck draufgesetzt. So an 6 Stellen oder sowas. Dann werden alle Stellen (also alle Punkte in jedem Rechteck) analysiert auf die Farbe hin und dann ein Mittelwert gebildet, sodass ich die Farbe von den Bällen habe. Dann kommt der nächste Schritt: Das Video wird abgespielt und wo die Aufnahme starten soll wird gestoppt und es werden die Bälle in diesem einem Frame markiert (wird dann ein roter Kringel drumgemalt). Jetzt wird das video weitergespielt und es werden immer wieder mittels der Referenzfarbe vom Anfang die Bälle gesucht und der Kringel entsprechend nachgeführt. Darum gehts erstmal. hab das in nem Basic-Dialekt mal programmiert, die Nachführung der Bälle hat sogar funktioniert, das Problem lag höchstens in der Videoqualität. hab halt nur ne Digitalkamera mit 320x240 oder so. Und jetzt will ich das in Delphi schreiben weil mit dem Basic-Dialekt den ich hatte (DarkBasicPro) ist das immer so aufwendig eine ordentliche Umgebung zu schaffen, sprich Buttons usw. Der nächste Schritt wäre dann die Positionen bzw. Rotationen der Gelenke in irgendein vernünftiges Animationsformat was ich mir noch ausdenken müsste zu packen (wäre dann für 3D-Objekte mit Limbs).. Der Schritt wird wohl bissl schwierig für mich werden und daran wirds wohl dann auch scheitern, aber ich hab schon Spass am Nachführen der Tischtennisbälle ^^ Ein anders Problem ist dann ja auch noch, dass ich mit einer Kamera so ja erstmal auch keine Dreidimensionalität erzeugen kann.. aber was solls ^^ Entschuldigung für den Roman, und danke für eure Hilfe soweit, Quetzalcoatl |
Re: Zeichnen auf Video?
|
Re: Zeichnen auf Video?
jo um sowas gehts im Prinzip, nur das mir der Algorithmus so nicht weiterhilft, weil der das ganze sich bewegende Objekt registriert und ich ja die Gelenke suche..
|
Re: Zeichnen auf Video?
Hi Quetzalcoatl,
also ich finde die Idee nicht zum auslachen! weil du weißt ja selbst (hast es ja auch extra so geschrieben) das es irgendwo dann verdammt schwierig wird ;-) Aber so um ein Bisschen mit Video zu experimentieren ists doch klasse! Hab mal ne Programm geschrieben was ne WebCam eingelesen hat (fremdkomponente *g*) und dann damit nen bisschen grundlegende Video "Manipulation" ausprobiert... also negative und co *g* aber nicht live weil schon alle 10sec ein Bild bearbeiten über Canvase sehr viel Rechenzeit beansprucht^^ Und ich hab mal versucht so ein "Arlarm-Programm" zu machen - also einfach ein Bild definiert und dann so schnell wie möglich halt jedes neue bild mit dem Vorgaben Bild verglichen und bei zu vielen Abweichungen ne Meldung ausgegeben - Klingt ja eigentlich einfach - ich musste aber feststellen das so ne Webcam sehr Stark rauscht - also da schon ohne das sich das licht und irgendwas in dem Raum verändert - sehr starke Schwankungen Vorgabenbild auftreten... macht aufjedenfall Spaß damit zu Spielen/Experimentieren.... nur momentan bin ich schlichtweg zu geizig mir ne neue Webcam zu kaufen nur weil die alte unter XP nich mehr läuft.... Leuchtende Grüße Stefan |
Re: Zeichnen auf Video?
Um dem Timer-Gekrampfe mal ein Ende zu bereiten: TMediaplayer sowie viele andere Videoabspielkomponenten zeichnen nicht einfach auf nem Canvas rum, sondern nutzen ein Fensterhandle als Anhaltspunkt dafür, wo das Overlay hin platziert werden soll. Overlay bedeutet dabei, dass dieser Teil des Bildes komplett an der normalen Windows-Grafik vorbei läuft, und man nicht über die üblichen Methoden an die Bilddaten heran kommt, bzw. sie bearbeiten kann. Im Falle des Mediaplayers handelt es sich dabei um ein DirectX Overlay, und an das zu kommen ist echt nicht trivial (gab es auch mal einige Diskussionen zu im Forum, bezogen auf 3D-Spiele. Da ists das selbe Problem.)
Die einfachste Variante ist es, garkeine Playerkomponente an sich dafür zu bemühen, sondern sich die Bilddaten Frameweise aus der Datei zu holen. Um dies zu tun, kann man sich ewig mit der API für Videocodecs beschäftigen, oder man nimmt z.B. ![]() Jeder Versuch einfach so auf ein Video zu zeichnen, wird im aller besten Fall flackern wie Hölle, wenn überhaupt ;) |
Re: Zeichnen auf Video?
Zitat:
MCI nutzt die Standard GDI, DirectX gabs in Win 3.x noch gar net. :zwinker: DirectShow nutzt Overlays, aber nur wenn sie nicht deaktiviert wurden... :angel2: Zitat:
![]() Wenn man sich in den Draw-Handler einklinkt geht das auch direkt, war mir aber zu mühsam :roll: @Quetzalcoatl: Du kannst es mit wie es dizzy beschrieben hat ohne Player machen, oder es, wo Du es schon mit dem MediaPlayer versuchst es auf ein Panel abspielen lassen und dieses bei jedem MCI Signal in ein Bitmap zu Capturen, womit Du dann mit ScanLine schneller zugreifen kannst. Obwohl ich dazu sagen muß, so ist es einfacher zu Programmieren, aber benötigt auch etwas mehr Rechenzeit der CPU... |
Re: Zeichnen auf Video?
So, schon wieder ne Frage:
ich versuche gerade die Position des Videos über ne Trackbar verstellbar zu machen. Also Die Trackbar soll wenn Play gedrückt wird mitlaufen.. Soweit kein Problem, hab in nem Timer einfach: Trackbar1.Position:=MediaPlayer1.Position; Nur sollte man über die Trackbar auch selber noch eine beliebige Position einstellen können. Das hatte ich auch schonmal am Laufen, aber immer nur das eine oder das andre. also entweder die Trackbar läuft schön mit dem video oder ich kann selber die position über die trackbar verstellen.. Wie krieg ich jetzt beides zusammen? Oder gibts was um zu prüfen ob das Video grad läuft, dass man halt "Trackbar1.Position:=MediaPlayer1.Position;" nur dann macht wenn play gedrückt wurde? Danke für jede Hilfe, Quetzalcoatl |
Re: Zeichnen auf Video?
Schau mal nach
![]() Du könntest das auch so einbauen, das Du in der TrackBar.OnChange guckst, ob die den Fokus hat, nur so ne Schnapsidee am Rande :stupid:
Delphi-Quellcode:
If TrackBar1.Focused then
MediaPlayer1.Position:=TrackBar1.Position else TrackBar1.Position:=MediaPlayer1.Position; |
Re: Zeichnen auf Video?
Zitat:
Zitat:
Zitat:
Zitat:
|
Re: Zeichnen auf Video?
Zitat:
Zitat:
Sunlight7 hat in einem anderen Thread folgendes geschrieben: Gelegentlich gibt die Eigenschaft .Mode vom TMediaPlayer Werte aus, die gar net in den TMPModes vorhanden sind :stupid: Solltest Du also das machen, wie es das Beispiel in der OH zeigt kannst Du schon mal einen Crash erleben. :roll: Ähm ne, ich hab mir ne eigene Kompo gebastelt, die MCI direkt anspricht, die TMediaPlayer Kompo hat mich zu sehr genervt und MCI bietet vielmehr Funktionen, als sie der TMediaPlayer anbietet. Zitat:
Net das optimalste, aber mal was zum rumspielen und probieren :cyclops: |
Re: Zeichnen auf Video?
Hi Ihr,
MCI - ja es bietet viiiiiieeeeeeellllle Möglichkeiten - aber nur wenn man weiß wies funktioniert ;-) - Ich hab mal den TMediaPlayer so umgeschrieben bzw. erweitert das man noch einstellen konnte welche Soundkarte er Nutzen soll - (falls mehrere Installiert sind...) So als "DJ-Player" dann halt mit zwei Playern und einem zum Vorhören die dann erst am Mischpult gemixt werden sollen und nicht automatisch.... es hat irgendwann auch mal so einigermaßen Funktioniert - allerdings nur mit Wavdateien da der TMediaPlayer dann für MP3 immer ja den umweg übers deCodieren macht... und da hab ich dann immer nur ne schöne Fehlermeldung bekommen ala "Dieser Befehl wird von Diesem Medium nicht unterstützt!" und ich musste mich sehr sehr lange durch die OH schlagen und hier in der DP suchen bis ich überhaupt mal einen blassen schimmer davon hatte wie das funktioniert... .. ist auch schon ein bisschen länger her Leuchtende Grüße Stefan |
Re: Zeichnen auf Video?
Hi, Also die Trackbar funktioniert jetzt soweit: Wenn das Video spielt wird halt da mitgeschoben und wenn es nicht spielt kann man selber den Schieber bewegen... Ich komm immer nie auf die Funktionen wie z.b. Focused oder das mit dem MediaPlayer.Mode=mpPlaying.. is für mich nich so intuitiv im Moment ^^ ich kenn nur von Basic: if video Playing() ^^ Da konnte man einfach schreiben was man wollte ^^
Und mir kommt es so vor als würde die Delphihilfe mir auch nich alle Befehle ausspucken -.- argh und da is schon wieder ein Problem.. Ich muss ja zwangsläufig die RGB Werte eines Pixels auf dem Video rausfinden können.. mit Canvas.Pixels scheint das irgendwie nich zu funktionieren, bleibt das Canvas wohl unberührt von dem Video? Ich find einfach keine Funktionen sonst die mir Pixeldaten geben.. hm.. |
Re: Zeichnen auf Video?
Hi,
durchforste doch mal selbst die Eigenschaften des TMediaPlayer und vieleicht gibts da irgendwie ein Handel zur eigentlichen Zeichenfläche - weil scheinbar gibt er es ja nicht direkt auf dem Canvas wieder- aber wie du aus dem TColor Wert die RGB Werte raus bekommst weist du? Leuchtende Grüße Stefan |
Re: Zeichnen auf Video?
HI..
also als ich mit Canvas.Pixels die Farben gesucht hab, hab ich die jeweiligen Werte versucht mit GetRValue GetgValue und GetBValue die einzelnen Farbwerte gesucht.. Dann gibts ja da scheinbar noch eine Funktion GetPixel(hdc, nxpos,nypos).. Die gibt mir auch einen Farbwert und mit GetRValue usw. kann ich offensichtlich auch die einzelnen Komponenten rausfinden.. nur.. das klappt bei mir bisher noch nicht auf dem Video.. wobei ich auch nicht so recht weiß was bei 'hdc' hin muss. Also ich hatte diesen Codeschnippsel dazu gefunden:
Delphi-Quellcode:
dc := GetDC(0);
r := GetPixel(dc, Mouse.CursorPos.x, Mouse.CursorPos.Y); ReleaseDC(0, dc); |
Re: Zeichnen auf Video?
Hi Quetzalcoatl,
also h steht meist für handel ;-) und DC würde ich jetzt mal mit Device Context oder so was übersetzen. also ist das das Handel für die Fläche wo er den Pixel her nehmen soll! also genau das was du willst! Jetzt musst du nur noch das handel von der Oberfläche haben wo der Film drauf läuft^^ Ich tippe mal das GetDC(0) dir das Handel deiner Form oder so in der Richtung zurückliefert. Notfalls der Bildschirm ;-) allerdings musst du dann halt erst mal noch den Ausschnitt errechnen wo dein Video überhaupt läuft... hoffe dir helfen zu können! Leuchtende Grüße Stefan PS: Falls ich mich Irre dann bitte ich dringend um Berichtigung - ich will was lernen^^ PPS: Wieso ich das mit dem DC weiß bzw. woher? --> bei OPEN GL muss man auch den DC angeben damit er weiß wo er hinmalen soll! |
Re: Zeichnen auf Video?
Da mein Beitrag von 15:40 Uhr verschwunden is :cry: Nochmals...
Mit Canvas.Pixels würd ich das sowieso net machen, das ist extra langsam X-D Ich weiß jetzt grad net, welche Delphi Version Du hast, jedenfalls haben Panels bei mir kein Canvas, deshalb habe ich mit ![]() ![]() ![]() Dann kannst Du es mit ![]() @Light: GetDC(0) gibt ein Device Context vom Desktop, nicht vom Fenster ;) |
Re: Zeichnen auf Video?
Hi,
Also mit GetDC(0) krieg ich doch theoretisch dann vom ganzen Bildschirm die Pixeldaten? klappt auch, solange kein Video geladen ist. wenn ich das Video auf dem Panel habe, funktioniert die Funktion nich mehr (nur auf dem Panel nicht) bzw. gibt konstante Werte aus, was aber nicht passen kann. Wie krieg ich denn das Handle von der Oberfläche wo der Film drauf läuft. Habs mit MediaPlayer1.Display.Handle und solchen sachen probiert, aber kommt nix komischer weise.. Theoretisch müsste das doch mit GetDC(0) gehen, funktioniert doch bei allem andern auch, sogar außerhalb des Programms. Wenn ich nebenbei dasselbe Video vom WindowsMediaPlayer, also extern abspielen lasse klappt das mit dem GetPixel perfekt. Hat grad sogar zwischen durch mal in meinem Programm selbst funktioniert, woran das lag hab ich nich rausgefunden, jetzt gehts auf jedenfall nicht mehr.. irgendwie ist das komisch. |
Re: Zeichnen auf Video?
Hm,
also tut mir sehr leid- mehr weiß ich leider auch nicht- überleg genau was war als es funktioniert hat^^ vielleicht war irgend ein anderes Programm "schuld" Leuchtende Grüße Stefan PS: mich würde es schon Interessieren wie es dann funktioniert... |
Re: Zeichnen auf Video?
Ja, hab ich auch gedacht das ein andres Programm Schuld war, das einzige (zumindest was mir einfällt) was anders war, war eben das der WindowsMediaPlayer nebenbei auch ein Video abgespielt hat.. Erst ging mein eigenes Programm nicht, dann hab ich ein anderes Video darin geöffnet, dann gings aufeinmal. dann hab ich das Video vom Anfang geöffnet und es ging immernoch.. Als ich dann mein Programm neugestartet hab (ohne Codeänderung) ging wieder nix mehr.. bissl seltsam das ganze
Edit: Argh.. Es hat ja mal geklappt also muss es irgendwie ja auf diese Weise gehen.. Sonst bleibt mir wohl nur die Screenshotmethode, wobei die wird bestimmt dann bisschen langsam Edit2: So Für alle dies interessiert: Meine Lösung fürs erste ist einfach keine WindowsMediaPlayer Videos oder MPEG zu benutzen sondern .avi Videos -.- Mit denen funktionierts.. Vielleicht weiß ja sogar einer warum das so ist? |
Re: Zeichnen auf Video?
Hmm, seltsame Sache, mit MPEG funkts echt net :gruebel:
Aber für AVIs kannst Du das nehmen:
Delphi-Quellcode:
procedure TForm1.Timer1Timer(Sender: TObject);
var DC:HDC; begin DC:=GetDC(Panel1.Handle); BitBlt(Bit.Canvas.Handle, 0, 0, 384, 288, DC, 0, 0, SRCCOPY); ReleaseDC(Panel1.Handle, DC); Canvas.Draw(384, 0, Bit); end; procedure TForm1.FormCreate(Sender: TObject); begin Bit:=TBitmap.Create; Bit.Width:=384; Bit.Height:=288; end; |
Re: Zeichnen auf Video?
Hi, Danke nochmal für eure ganze Hilfe.
@Sunlight7: Für Avi´s funktionierts ja auch einfach so, oder meintest du für MPEG? Find das immernoch ein bisschen seltsam das MPEG´s da anders sind als die avi´s |
Re: Zeichnen auf Video?
Das was ich gezeigt habe is für AVIs
Das liegt da dran, das MCI aus mehreren Komponenten besteht, jeder MCI-Treiber hat so seine Eigenheiten. Übrigens funkt das mit den MPEGs bei mir unter Win95 :gruebel: |
Re: Zeichnen auf Video?
Hi
Was macht denn dein Code genau? Also es wird ein Bitmap erstellt und dann im Timer das Bild vom Panel1 auf die Bitmap kopiert und das ganze wird mit Canvas.Draw angezeigt? Bzw. Wozu genau? |
Re: Zeichnen auf Video?
Moin,
das Bitmap wird schon im FormCreate erstellt. Der Code kopiert lediglich das DC vom Panel auf die Bitmap, wenn der Timer 40 MS lief, war rechts das Original Video zu sehen und links lief die Livekopie davon. Wenn Du es auf eine Bitmap kopierst kannst Du mit ![]() |
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:02 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz