Seite 2 von 3

Verfasst: 19.07.2009 17:10
von Joel
Ja, es geht echt um Videos. Ok, ich möchte einen gespeicherten Video mit dem Bluebox Effekt Bearbeiten. Live-Streaming auf den PC kommt später....

Ich kann mit der AViFil32 Lib die Bilder aus einem Video auslesen. Das Problem ist aber, das ich diese Bilder wieder zu einem Video zusammenfügen müsste (mit Codecs und Ton). Hat jemand da auch einen Ansatz, wie das gehen könnte?


------------------------------------------------------------------------------------


2. Habe den Ansatz etwas umgeschrieben, damit jedes Pixel berücksichtigt wird. Gibts es Ideen, wie ich den Code noch beschläunigen kann, damit er schneller arbeitet?

Code: Alles auswählen

 StartTime = ElapsedMilliseconds()             ; ermittelt den aktuellen Wert
UseJPEGImageDecoder()
UseJPEGImageEncoder()
UsePNGImageDecoder()
UsePNGImageEncoder()

; höhe/breite des Bildes 
img = CatchImage(#PB_Any, ?image)
INS = CatchImage(#PB_Any, ?insert)
imgH = ImageHeight(img) 
imgW = ImageWidth(img)
insH = ImageHeight(INS) 
INSW = ImageWidth(INS)

ins_out = ImageOutput(INS) 
Dim insColors(INSW,insH) ; farbenarray für insert erstellen 
StartDrawing(ins_out) 
  
  For x=0 To INSW 
    For y=0 To insH 
      insColors(x,y)=Point(x,y);farbwerte im array speichern 
    Next 
  Next 
StopDrawing() 

img_out = ImageOutput(img) 
StartDrawing(img_out) 
  For x=0 To imgW 
    For y=0 To imgH 
      c=Point(x,y) ; farbe des punktes holen und in c (color) speichern 
      If  Blue(c)>90 And Green(c)<100 And Red(c)<50
        Plot(x,y,insColors(x,y)) ; auf das image mit bluebox plotten
     EndIf
    Next 
  Next  
  
 SaveImage(img, "C:\Users\Joel\Desktop\IMAGE__.BMP" , #PB_ImagePlugin_BMP)
 ElapsedTime = ElapsedMilliseconds()-StartTime 
 Debug  ElapsedTime
StopDrawing() 
End 

DataSection 
  image: IncludeBinary "image.jpg" 
  insert: IncludeBinary "insert.jpg" 
EndDataSection

Verfasst: 19.07.2009 23:18
von PMTheQuick
Hier mal ne Vorlage die 425ms braucht für 25 Vorgänge mit einem unterschiedlich belichtetem Bild (10 Pixel Genauigkeit).

Code: Alles auswählen

UseJPEGImageDecoder()
LoadImage(0, "example.jpg")

Procedure Diff(Z1, Z2)
  If(Z1 > Z2) : ProcedureReturn Z1-Z2 : Else : ProcedureReturn Z2-Z1 : EndIf
EndProcedure

#StartRed = 30 ; Startwert Rot
#StartGreen = 118 ; Startwert Grün
#StartBlue = 190 ; Startwert Blau
#MaxDifference = 170 ; Maximale Differenz von R & G & B zusammen
#StepX = 10 ; X-er Schritte
#StepY = 10 ; X-er Schritte

ST = GetTickCount_()
For i = 1 To 25
StartDrawing(ImageOutput(0))
  For x = 0 To ImageWidth(0) Step #StepX
    For y = 0 To ImageHeight(0) Step #StepY
      Color = Point(x, y)
      Difference = Diff(#StartRed, Red(Color)) + Diff(#StartGreen, Green(Color)) + Diff(#StartBlue, Blue(Color))
      If Difference < #MaxDifference
        Box(LX, LY, #StepX, #StepY, RGB(255,255,255)) 
      EndIf
      LX = X
      LY = Y
    Next y
  Next x
StopDrawing()
Next i
Debug "Zeit (25 Vorgänge): "+Str(GetTickCount_()-ST)
Debug "Durchschnittliche Zeit: "+Str((GetTickCount_()-ST)/25)

OpenWindow(0, 0, 0, 1024, 768, "Viewer")
ImageGadget(0, 0, 0, 1024, 768, ImageID(0))
Repeat : Delay(1) : Until WindowEvent() = #PB_Event_CloseWindow
Verbesserungen erwünscht... Vielform per Paint draufgekritzelt...
http://em.q-soft.ch/images/780287example.jpg
Das hier bitte noch runterladen! ;-)

Gruss
PMTheQuick :)

P.S.:

Genauigkeit -> Zeit für einen Vorgang
1Px -> 1722ms
2Px -> 486ms
3Px -> 219ms
4Px -> 129ms
5Px -> 75ms

Verfasst: 20.07.2009 10:44
von Vermilion
Eine Frage von mir wäre (abgesehen davon, dass es in PureBasic wohl nicht so einfach möglich ist): Ist es nicht einfacher, direkt selber im Speicher rumzufummeln, als Point() und überhaupt PureBasics 2D Images zu benutzen?

Man macht sich einfach ein eigenes Array für die Bilddaten und Peekt und Poket da rum wie man lustig ist. Bei der heutigen Technik müsste das jedenfalls um einiges schneller gehen. Die Frage ist bloß, wie man das dann in eine Echtzeit Vorschau verwandelt... :D Ok, man könnte es in komplett in einen Framebuffer bzw. einen Screen kopieren (mit SDL vielleicht), man müsste nur das richtige Pixelformat verwenden.

Solch eine eigene Image Library hatte ich auch mal angefangen, für prozedurale Texturgenerierung, aber schnell verging die Lust daran...

Verfasst: 20.07.2009 11:07
von Joel
Gibt es nicht eine möglichkeit, das die grafikkarte alles machen zu lassen. In 3D spielen rechnet die Grafikkarte ja auch unmengen an Daten aus, weil sie die Daten im Grafikspeicher hat und mit eigenem Chip rechnet.

Könnte man nicht einfach die Grafikkarte direkt ansprechen und die das alles machen lassen?

Verfasst: 20.07.2009 11:35
von Vermilion
Das hatte ich ja auch schon erwähnt, man könnte versuchen, etwas mit 3D und Blending Modes zu fummeln. Rein theoretisch müsste das gehen. Aber da würde ich auch auf OpenGL zurückgreifen, weil eine Standard Grafikengine für Spiele taugt dafür recht wenig. :lol:

Andernfalls... Viele Programme machen das auch ohne.

Und wenn man die Shader der Grafikkarte benutzen will... Gut, dass ist oben gesagt, 3D API. Als letzte Variante gäbe es die Möglichkeit die Grafikkarte über CUDA anzusprechen (Stichwort: GPGPU). Dann wird die GPU quasi als CPU mitbenutzt, durch nVidia PhysX bereits umgesetzt und in der nVidia Ion auch bereits vorhanden. Aber bezüglich dessen bezweifle ich, dass PureBasic die richtige Sprache dafür ist.

Verfasst: 20.07.2009 11:56
von Joel
:D Ok, aber mit OpenGL kenn ich mich überhaupt nicht aus. Hat da jemand Ansätze :mrgreen:

Verfasst: 20.07.2009 14:46
von Thorium
Vermilion hat geschrieben: Man macht sich einfach ein eigenes Array für die Bilddaten und Peekt und Poket da rum wie man lustig ist. Bei der heutigen Technik müsste das jedenfalls um einiges schneller gehen.
Wenns in nem Array liegt brauch man ja Peek und Poke auch net mehr. Blöderweise bieten die beiden Befehle keinen direkten Zugriff, sondern es finded ein Call zur Poke bzw. Peek Prozedur statt, auch wenn diese nur eine einzige Assemblerinstruktion darstellt. :roll:
Jedenfalls war das in PB 3.x noch so, vieleicht hat sichs ja mittlerweile auch geändert. Deswegen sind Pointer nochmal schneller als Peek und Poke.

Aber das wäre doch auch mal ne nette Sache zur Paralellisierung. Sollte doch recht unproblematisch sein das Bild in mehrere Jobs zu zerlegen und mehrere Kerne werkeln zu lassen.

Verfasst: 20.07.2009 14:53
von Ground0
Hallo Also ein Programm um auch Life Aufnahmen zu machen:

http://heroinewarrior.com/cinelerra_shots.php

Ansonsten noch:

http://jahshaka.org/

Gruss Ground0

PS:Weiss das es nicht mehr ganz 100% reinpasst aber es gehört noch zum anfang ;)

Verfasst: 20.07.2009 18:48
von Joel
@Vermillion: Du hast auf Seite 1 ja mal was von wegen: "Blending Modes" gesagt...

was meinst du damit genau?
was ist das genau?
wie mache ich das in PB?

Verfasst: 20.07.2009 20:10
von Little John
Warum ist das hier einklich im Offtopic-Bereich? Gehört wohl nach "Allgemein".