Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Bluescreen-Programm (https://www.delphipraxis.net/49604-bluescreen-programm.html)

MasterDG 13. Jul 2005 17:09


Bluescreen-Programm
 
Hallo!

Ich versuche gerade ein Bluescreen-Programm zu schreiben was eine einfache Vorschau machen soll. Wie ich das Bild von der Kamera bekomme hab ich in nem anderen Thread schon gefragt. Das ist auch nicht das große Problem. Was mir momentan Probleme bereitet ist die Geschwindigkeit mit der das Bild verarbeitet wird. Ich möchte nur die blauen Teile aus dem Bild entfernen und das ganze auf ein anderes Bild legen.

Meine ersten Versuche habe ich mit Graphics32 gemacht, allerdings kein gutes Ergebnis bekommen. Wenn ich nur die Farbwerte beispielsweise in ein String schreibe dann dauert das schon so lange dass ich kein flüssiges Bild mehr bekomme. Ich habe auch keine Idee wie ich das jetzt beschleunigen könnte.

Wie könnte man sonst noch das gleiche machen wie ich das will? Kann man evt. die Verarbeitung durch Graphics32 so optimieren dass ich eine flüssige Vorschau bekomme?

Also es geht mir nicht darum den Film als avi oder so zu exportieren sondern ich will eine reine Vorschau sodass man vorher schon mal sehn kann wie der Film am Ende in etwa aussehen könnte.

Für alle die nicht wissen was Bluescreen ist: Bluescreen/Bluebox

Gruß
MasterDG

Khabarakh 13. Jul 2005 17:20

Re: Bluescreen-Programm
 
Was ich nicht verstehe, ist, warum du die blauen Pixel in einen String schreiben willst :gruebel: . Ich würde das ganze so angehen: Du hast für jeden Frame zwei Bitmaps, das Kamerabild und den Hintergrund. Nun iterierst du durch die Pixel des Kamerabilds (z.B. per Delphi-Referenz durchsuchenTBitmap32.Bits), wenn die Farbe innerhalb einer gewissen Grenze liegt, fügst du stattdessen das Pixel des Hintergrunds ein.

Chris1986 13. Jul 2005 17:20

Re: Bluescreen-Programm
 
Hi, wie groß ist denn dein Vorschaubild?
Rechnest du es vor dem Keyen auf 1/2 oder 1/4 der PAL-Auflösung runter, oder arbeitest du mit der vollen Auflösung?

Gruß
Christian

MasterDG 13. Jul 2005 20:05

Re: Bluescreen-Programm
 
Hallo!
@Khabarakh: Das mit dem String war nur en Test weil ich noch keine richtige Funktion hatte und einfach mal testen wollte wie schnell das Auslesen der Farben und das schreiben von Variablen bei mehreren tausend Aktionen ist und ob das geeignet ist um eine flüssige Vorschau anzuzeigen und nicht nur en paar Bilder alle paar Sekunden.

Du hast die Funktion TBitmap32.Bits erwähnt, bisher habe ich immer nur mit TBitmap.Pixel gearbeitet. So wie ich das jetzt in der Hilfe gelesen habe macht das das gleiche speichert jedoch die Werte einmalig in ein Array. Wie sieht das mit der Schnelligkeit aus? Was ist die schnellste Methode?

@Chris1986: Ich werde warscheinlich mit einer Auflösung von 320x240 arbeiten. Wenn es von der Schnelligkeit stimmt, dann werd ich auch evt. 640x480 nehmen, was ich aber für eher unwarscheinlich halte weil doch sehr viel Rechenleistung gebraucht wird.

Grüße
MasterDG

Delphi-Freak 13. Jul 2005 20:22

Re: Bluescreen-Programm
 
Hi!

Schneller ist sicher TBitmap32.Bits. Habemal einen Überblendeffekt in Laufzeit gemacht (mit voller Bildschirmauflösung -> 1280x1024), das hat mit Graphics32 und TBitmap32.Bits ziemlich gut funktioniert.

LG

Edit: Wie machst du das eigenlich mit der Farbgrenze - das würde mich interessieren - bzw. baust du auch Anti-Aliasing ein (für Objekt (Mensch) <-> Hintergrund)?

tn249 13. Jul 2005 20:45

Re: Bluescreen-Programm
 
Wenn für dich DX kein Overkill ist, ich weiß nicht ob du das für den Rest deines Programms eventuell benutzen kannst wären aus DirectDraw die Funktionen BltFast bzw Blt interessant. Beide Funktioinen sind ziemlich flott vorallem BltFast. Beide bieten einen Colokey an, allerdings nur für einen Wert. Blt kann zusätzlich Strecken usw

Ich weiß nicht was es für Implementierungen für die Delphilanguage gibt (wahrscheinlich geht es auch mit DelphiX), aber wollte das nurmal als option in den Raum geworfen haben.

MfG
tn249

MasterDG 13. Jul 2005 21:11

Re: Bluescreen-Programm
 
An DirectX wollte ich mich noch nicht so ranwagen weil ich denke dass das doch schwer ist. Stimmt das. Wenn es relativ einfach wäre dann wäre es eine Alternative. Was bringt das von der Geschwindigkeit? Sehr viel, oder doch eher wenig sodass es sich nicht lohnt?

@Delphi-Freak: Ich hab schon mal sowas ähnliches gemacht. Da habe ich es so gemacht solange Rot und Grün unter bestimmten Werten bleiben und Blau über einem bestimmten Wert bleibt dann ist es die richtige Farbe. Welche Werte dann benutzt werden können muss man schauen.

Gruß
MasterDG

Khabarakh 14. Jul 2005 13:35

Re: Bluescreen-Programm
 
Ja, Bits sollte das schnellste sein, weil man damit direkt auf den Bitmapinhalt zugreifen kann, ohne irgendwelche Funktionen dazwischen.

Zu DirectX:
Ich denke nicht, dass es GR32 in Sachen Geschwindigkeit schlagen kann. Man muss sich mal ansehen, wieviel Mühe die Jungs in das Projekt gesteckt haben: Ein Großteil in Assembler, MMX-Support usw.
Und ein ColorKey reicht wahrscheinlich nicht :zwinker: .

MasterDG 14. Jul 2005 16:43

Re: Bluescreen-Programm
 
Hallo!
Mit Bits habe ich leider leichte Verständniss Probleme. Bits gibt ja PColor32Array zurück. Aber wie kann ich damit arbeiten? Ich hab gedacht dass das einfach alle Pixel in ein Index schreibt und man mit dem Index den TColor32 Wert zurückbekommt. Ist aber anscheind nicht so.

Kann mir einer sagen wie das funktioniert? :gruebel:

Was ist eigendlich bei den Vorgängen die ich machen muss das das am längsten dauert? Das auslesen der Farbwerte? Das setzen der Pixel in der Vorschau?

Ich habe auch in der Hilfe gelesen dass es eine schnellere Methode gibt als Canvas, jedoch habe ich nur setpixelT gefunden. Allerdings hab ich es noch nicht geschafft ein Pixel einzufärben... :(

Grüße
MasterDG

Delphi-Freak 14. Jul 2005 16:51

Re: Bluescreen-Programm
 
Habe das gerade in meinem Dateienchaos :wink: gefunden:
Delphi-Quellcode:
maxP := ViewImage.Bitmap.Width * ViewImage.Bitmap.Height - 1;
Pdst := @ViewImage.Bitmap.Bits[0];
Psrc1 := @oldImage.Bits[0];
Psrc2 := @newImage.Bits[0];
for i := 0 to maxP do begin
   Pdst^ := ((((Psrc1^ and $00FF0000) shr 16) * (255 - blendfact)) shl 8 + (((Psrc2^ and $00FF0000) shr 16) * (blendfact)) shl 8) and $00FF0000
      or ((((Psrc1^ and $0000FF00) shr 8 ) * (255 - blendfact)) shl 0 + (((Psrc2^ and $0000FF00) shr 8 ) * (blendfact)) shl 0) and $0000FF00
      or ((((Psrc1^ and $000000FF) shr 0 ) * (255 - blendfact)) shr 8 + (((Psrc2^ and $000000FF) shr 0 ) * (blendfact)) shr 8) and $000000FF;
   Inc(Pdst);
   Inc(Psrc1);
   Inc(Psrc2);
end;
Pdst, Psrc1 und Psrc2 sind vom Typ PColor32; maxP vom Typ Cardinal (schneller als Integer)
ViewImage, oldImage, newImage sind TBitmap32s

Hoffe, das ist etwas hilfreich...


LG, Gerhard


Edit: Achja, der Code war zum Überblenden von oldImage auf newImage; das Bild wird eben immer in ViewImage ausgegeben. blendfact geht von 0 bis 255.

MasterDG 19. Jul 2005 15:52

Re: Bluescreen-Programm
 
Hallo!

Also ich habe dein Code verstanden und der hat auch in meinem Programm funktioniert. Jedoch wollte ich das Programm bei einem Freund testen der einen Bluescreen und ne gute Kamera hat. Bisher hab ich es ja nur per Webcam getestet.

Das Problem ist dass er einen Zugriffsfehler bekommt. Das Anzeigen der Kamera klappt gut. Das kopieren in ein Image32 auch. Ich weiß nicht exakt wo der Fehler liegt, aber ich vermute dass bei ihm das zuweisen einer Farbe zu einem Pointer nicht klappt und die Fehlermeldung bringt. Sind halt alles Spekulationen...

Kann mir jemand evt. einen Tipp geben was da schief läuft?

Hier der Code, wo ich die Fehlermeldung vermute:
Delphi-Quellcode:
maxPixel := ilive.Bitmap.Width * ilive.Bitmap.Height - 1;
Livecol := @ilive.Bitmap.Bits[0];
Videocol := @ivideo.Bitmap.Bits[0];
for i := 0 to maxPixel do begin
if ((Livecol^ and $FF) < Red) or (((Livecol^ div 256) and $FF) < Green)
   or (((Livecol^ div 65536) and $FF) > Blue) then Videocol^ := Livecol^; // <-- evt. hier
Inc(Livecol);
Inc(Videocol);
end;
Red, Green, Blue sind Werte die zum entfernen der blauen Flächen sind.

Gruß
MasterDG

Delphi-Freak 19. Jul 2005 21:02

Re: Bluescreen-Programm
 
Hi!
Eine AV - oje :wink:
Livecol und Videocol haben sicher die gleiche Breite und Höhe? Das könnte IMHO der einzige Grund für eine AV sein.
Tritt die AV eigentlich nur bei deinem Freund, oder auch bei dir auf?
Übrigens »shl 8« macht das gleiche wie »div 256« (bzw. »shl 16« und »div 65536«) und ist AFAIK schneller, da einfach die Bits verschoben werden. Bei »div i« könnte es ja auch passieren, dass die Bits nicht einfach verschoben werden können (wenn i <> 2^1 und i <> 2^2 und i <> 2^3 usw.), was es dann langsamer machen könnte...

LG, ich

MasterDG 20. Jul 2005 08:13

Re: Bluescreen-Programm
 
Hallo!

Das Problem tritt nur bei meinem Freund auf. Bei mir hat alles funktioniert. Livecol und Videocol haben die gleiche Größe (320x240). Ich habe alles versucht das hinzubekommen. Es hat bisher nicht geklappt.

Nun habe ich in der Hilfe ein bischen gesucht und Bitmap.SetPixelT(Ptr:PColor32,Tcolor32) gefunden. Habe es in mein Programm eingebaut und es funktioniert genauso. Kann ich damit die Fehlermeldung verhindern?

Gibt es Programme die vieleicht im Hintergrund laufen und die Funktion meines Programmes stören könnten? Er hatte auf dem Rechener Adobe Premiere laufen. Jedoch auch als er das beendet hat kam soweit ich weiß der Fehler.

Ach ja, danke für den Tipp mit shl8 und shl 16! Werde es gleich in meinem Programm ändern!

Gruß
MasterDG

Delphi-Freak 20. Jul 2005 10:13

Re: Bluescreen-Programm
 
Zitat:

Zitat von MasterDG
Das Problem tritt nur bei meinem Freund auf. Bei mir hat alles funktioniert.

Auweh, AVs die nur auf manchen Rechnern auftreten. Da habe ich dann keine Ahnung...
Zitat:

Zitat von MasterDG
Nun habe ich in der Hilfe ein bischen gesucht und Bitmap.SetPixelT(Ptr:PColor32,Tcolor32) gefunden. Habe es in mein Programm eingebaut und es funktioniert genauso. Kann ich damit die Fehlermeldung verhindern?

Die Funktion SetPixelT ist mir eigentlich noch nicht untergekommen, aber probieren kannst du's ja.
Zitat:

Zitat von MasterDG
Gibt es Programme die vieleicht im Hintergrund laufen und die Funktion meines Programmes stören könnten? Er hatte auf dem Rechener Adobe Premiere laufen. Jedoch auch als er das beendet hat kam soweit ich weiß der Fehler.

Kann ich mir eigentlich nicht vorstellen.
Zitat:

Zitat von MasterDG
Ach ja, danke für den Tipp mit shl8 und shl 16! Werde es gleich in meinem Programm ändern!

NEEEIIIN, tschuldige, das muss shr 8 bzw. shr 16 heißen, die Bits müssen ja nach rechts verschoben werden. :oops: :oops:

Leider weiß ich dann den Fehler (oder nicht-Fehler???) nicht. Könntest du mir vielleicht das Projekt schicken (z.B. via PN), damit ich mir das etwas genauer anschauen kann? (Natürlich nur in deinem Sinn, also wenn du's willst!)

LG, Delphi-Freak

MasterDG 21. Jul 2005 15:55

Re: Bluescreen-Programm
 
Hallo!

Danke für das Angebot, dass du dir mein Programm mal ansiehst und nach dem Fehler suchst. Ich habe es mal mit SetPixelT versucht und siehe da es geht ohne Fehlermeldung. Anscheinend ist diese Methode die sicherere. Ich weiß immer noch nicht ganz wieso der Fehler nur bei meinem Freund auftrat, ist aber jetzt auch egal, es geht ja :-D !

Und wegen shr(l) 8 und 16. Ich hab es mal ausprobiert gehabt und es hat nicht funktioniert. Da du jetzt sagst dass es shr anstatt shl ist wird mir das klar. :-D

Also nochmal vielen Dank für deine Hilfe.

Gruß
MasterDG

Delphi-Freak 21. Jul 2005 15:58

Re: Bluescreen-Programm
 
Nochmal tschuldige wegen dem shr.
Super aber, dass es jetzt funkioniert!!

LG


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:38 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz