Videocheck

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

 

Oetzicool

Betreff: Videocheck

BeitragSa, Sep 03, 2005 15:38
Antworten mit Zitat
Benutzer-Profile anzeigen
Hey also ich will gern ein Programm schreiben das eine Videodatei einliest und es dann überprüft ob sich darauf z.b. was bewegt (z.B.: ein Wagen, eine Person) und diese dann einrahmt!

So der Plan steh nur bei der Umsetzung habe ich Probleme also ich wollte es so machen das ich 2 Schleifen laufen lasse, eine für die X-Koordinaten und eine für die Y-Koordinaten. Dann will ich jeden Pixel einzeln überprüfen und wenn mehrere Pixel nebeneinander stark von den Anfangs RGB-Werten abweicht es eine bewegung gibt! Also aber als ich angefangen habe die schleifen einzubauen läuft das video nicht mehr weiter und es läuft nur einmal durch!

Kann mir vieleicht einer helfen oder mir nen Tipp geben wie ich es besser machen könnte? Danke schonmal!

Cu Oetzicool
 

Mr Hopp

BeitragSa, Sep 03, 2005 16:16
Antworten mit Zitat
Benutzer-Profile anzeigen
Haben die Schleifen auch Flip?
 

Oetzicool

BeitragSa, Sep 03, 2005 16:23
Antworten mit Zitat
Benutzer-Profile anzeigen
also so sieht der doe momentan aus...

BlitzBasic: [AUSKLAPPEN]
Graphics 640,480,16,2
AppTitle \"Videoplayer 1.0\"

Global x=0
Global y=0




SetBuffer BackBuffer()
movie=OpenMovie(\"test.avi\")

While Not KeyHit(1)

Repeat
x = x + 1
Until x = 639

;Video starten
If MoviePlaying(movie)=0 Then
CloseMovie movie
movie=OpenMovie(\"test.avi\")
End If
DrawMovie movie,10,10
;Infos anzeigen
Color 255,255,255
Text 0,0,\"Breite:\"+MovieWidth(movie)
Text 0,20,\"Höhe:\"+MovieHeight(movie)
Text 0,80,\"R:\"+r
Text 0,100,\"G:\"+g
Text 0,120,\"B:\"+b
Text 0,140,\"X:\"+x


GetColor x,MouseY()
r=ColorRed()
g=ColorGreen()
b=ColorBlue()

Color r,g,b
Rect 20,400,20,20,1

Flip
Wend
CloseMovie movie
End

hectic

Sieger des IS Talentwettbewerb 2006

BeitragSa, Sep 03, 2005 19:30
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo Oetzicool, habe mal was gemacht da ich das auch schon mal immer machen wollte... Hier eine Demo, zeigt dir alle Pixelveränderungen per Rect an. Weiß starke Veränderung gegenüber Bild vorher, Schwarz keine Veränderung gegenüber dem Bild vorher. Das Originalbild ist dabei durch ein Raster noch leicht sichtbar...
Code: [AUSKLAPPEN]
Graphics 640,480,16,1
SetBuffer BackBuffer()
movie=OpenMovie("data\movie.mpg")

Dim xy(63,47)   ;Zwischenspeicherung des Bildes (für Differenzbild)
ra%=0   ;Rot Alt
ga%=0   ;Grün Alt
ba%=0   ;Blau Alt
rn%=0   ;Rot Neu
gn%=0   ;Grün Neu
bn%=0   ;Blau Neu
fa%=0   ;Allgemein für Farbe
x%=0   ;Schleife X-Koordinate
y%=0   ;Schleife Y-Koordinate

While Not KeyHit(1)

 If MoviePlaying(movie)=0 Then
  CloseMovie movie
  movie=OpenMovie("data\movie.mpg")
 End If
 DrawMovie movie,0,0

 ;Differenz
 For y=0 To 47
  For x=0 To 63
   ra=(xy(x,y) And $FF0000)/$10000
   ga=(xy(x,y) And $FF00)/$100
   ba=(xy(x,y) And $FF)
   fa=ReadPixel(x*10,y*10)
   rn=(fa And $FF0000)/$10000
   gn=(fa And $FF00)/$100
   bn=(fa And $FF)
   rn=Abs(rn-ra)
   gn=Abs(gn-ga)
   bn=Abs(bn-ba)
   fa=rn+gn+bn
   If fa>255 Then fa=255
   Color fa,fa,fa
   Rect 1+x*10,1+y*10,9,9,1
  Next
 Next

 ;NeuesBild
 For y=0 To 47
  For x=0 To 63
   xy(x,y)=ReadPixelFast(x*10,y*10)
  Next
 Next

 Flip
Wend
CloseMovie movie
End
 

Oetzicool

BeitragSa, Sep 03, 2005 20:17
Antworten mit Zitat
Benutzer-Profile anzeigen
genau sowas hab ich gesucht nur kannst du mir jetzt noch sagen wie ich den äußersten punkt der person auf der rechten seite erkenne und dann um die ganze person/gegenstand ein rechteck malen kann?

hectic

Sieger des IS Talentwettbewerb 2006

BeitragSo, Sep 04, 2005 1:41
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo Oetzicool, ich denke das währe eines der schwirigeren Aufgaben die man sich so per programmieren vorstellen kann. Da würd ich selber lieber Schattenberechnungen auf 3D machen. Vielleicht hilft dir aber eine Suche nach den Funktionen über dem DivX-5-Format. Ich glaube mal gelesen zu haben das dieses Videoformat ein Großteil der Komprimierung so erledigt, indem bewegte Objekte auf stillem Hintergrund oder stille Objekte mit bewegtem Hintergrund ausfindig gemacht werden und dann als eine art 'Sprite' auf dem Bildschirm umpositioniert werden. Das ausfindigmachen und korrekt einrachmen währe dann das schwirige. Ansonsten könnte ich mir auch eine Vektorisierung der Differenzgrafik vorstellen. Wenn dann ein (nahezu) geschlossenes Objekt auftaucht, dann kann man davon ausgehen das es ein einzelnes Objekt ist. Aber auch das ist sicherlich nicht ganz einfach... Ich selber würde mir da wohl die Zähne ausbeissen und trotzdem nicht zum Erfolg kommen. Ausser ich hab ein äusserst geduldigen Brötchengeber.

Du hast da folgende Probleme dabei:

Fall 1: Kamera steht still aber ein (aber auch nur ein) Objekt bewegt sich. Dann ist die Umrahmung einfach.

Fall 2: Kamera bewegt sich aber ein Objekt steht still positioniert (das währe dann das Negativbild von Fall 1). Dann ist die Umrahmung etwas komplizierter. Würde ich aber auch noch hinbekommen.

Fall 3: Kamera und Objekt bewegen sich unterschiedlich. Führt dazu, daß auf dem Differenzbild (einzelnes Bild) nur noch undefinierte Punkte zu sehen sind. Das Gehirn erkennt sowas natürlich sofort, aber bring das mal dem Computer bei. Hier muß der Rechner dann auch noch die vorherigen Differenzbilder vergleichen und richtig interpretieren.

Fall 4: mehrere Objekte und eventuell Kamera bewegen sich in unterschiedliche Richtungen?!?! usw. usw.
 

Oetzicool

BeitragSo, Sep 04, 2005 11:49
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja ich verstehe was du meinst ich hab auch ein paar Tests versucht eben einmal mit ner Person vor nem Bluescreen wo die einrahmung sicherlich am einfachsten ist!

Ja weil eigentlich hab ich mir des als eine Art testsoftware für Überwachungskameras gedacht. Das wenn sich ein Objekt In das Kamerafeld (eine fest montierte kamera die sich nicht bewegt)bewegt, dann wird eben das Objekt umrahmt und gleichzeitig die Größe berechnet...d.h. die Maximale Größe des Kamerfelds durch die Pixel anzahl und das dann mal die (ungefähre) größe des Objektrahmens so kann z.b. entschieden werden, wenn ein Objekt nur 1m hoch ist, ein Hund ist und es vieleicht nur in einer Log-Datei vermerkt wird und bei einem Objekt über 1,60 eine Warnmeldung gibt oder sowas.

Aber da ich noch nicht der Profi bin im Programmieren lass ich das wohl noch etwas rumliegen!

Aber trotzdem Danke für eure Hilfe!

Sebastian

BeitragSo, Sep 04, 2005 13:05
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich hab sowas mal für ne Webcam geschrieben .....
Simple Pixel-Unterschiede waren kein Problem aber die Kantendetektion hab ich nie in Echtzeit ans laufen gekriegt ....

Letzt endlich zerteilt das Prog das Video-Bild in 20x20 Pixel - Quatrate und check wie viele Pixel sich in einem Quatrat wie weit verändern und lößt ab gewissen Schwellwerten Alarm aus ....
Das geht mit 30 Fps noch ganz flott von Statten ...
Seit 2 Jahren kein BlitzBasic und kein Windows mehr, und stolz darauf !

hectic

Sieger des IS Talentwettbewerb 2006

BeitragDi, Sep 06, 2005 4:16
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo Oetzicool, ich habe das Problem zwar nicht gelöst, aber ich habe eine wesentlich schnellere Routine für die Differenzfilterung erstellt. Der Code zeigt drei Bildschirme (links/oben: Das aktuelle Bild, recht/oben: Das ein Frame alte Bild, links/unten: Das Differenzbild). Die Auflösung konnte noch verbessert werden, da genügent Recourcen verfügbar waren. Alle Videos laufen bei mir jetzt ohne 'Zeitlupe'.
Code: [AUSKLAPPEN]
Graphics 640,480,32,1
SetBuffer FrontBuffer()

fn%=0   ;Farbe Neu
rn%=0   ;Rot Neu
gn%=0   ;Grün Neu
bn%=0   ;Blau Neu

fa%=0   ;Farbe Alt
ra%=0   ;Rot Alt
ga%=0   ;Grün Alt
ba%=0   ;Blau Alt

x%=0   ;Schleife X-Koordinate
y%=0   ;Schleife Y-Koordinate

movie=OpenMovie("data\movie2.avi")
fa=ReadPixel(0,0)




While Not KeyHit(1)

 If MoviePlaying(movie)=0 Then
  CloseMovie movie
  movie=OpenMovie("data\movie2.avi")
 End If
 DrawMovie movie,0,0,320,240

 ;Differenz
 LockBuffer BackBuffer()
 For y=0 To 239 Step 3
  For x=0 To 319 Step 3
   fa=ReadPixelFast(x+320,y)
   ra=(fa And $FF0000)/$10000
   ga=(fa And $FF00)/$100
   ba=(fa And $FF)
   fn=ReadPixelFast(x,y)
   rn=(fn And $FF0000)/$10000
   gn=(fn And $FF00)/$100
   bn=(fn And $FF)
   rn=Abs(rn-ra)
   gn=Abs(gn-ga)
   bn=Abs(bn-ba)

   ;Schwarz/Weiß
   fn=rn+gn+bn
   If fn>255 Then fn=255
   fn=fn*65536+fn*256+fn

;   ;Rot/Grün/Blau
;   fn=rn*65536+gn*256+bn

   WritePixelFast(x+0,y+240,fn)
   WritePixelFast(x+0,y+241,fn)
   WritePixelFast(x+0,y+242,fn)
   WritePixelFast(x+1,y+240,fn)
   WritePixelFast(x+1,y+241,fn)
   WritePixelFast(x+1,y+242,fn)
   WritePixelFast(x+2,y+240,fn)
   WritePixelFast(x+2,y+241,fn)
   WritePixelFast(x+2,y+242,fn)
  Next
 Next
 UnlockBuffer BackBuffer()

 CopyRect 0,0,320,240,320,0,0,0
Wend
CloseMovie movie
End

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group