Videocheck
Übersicht

OetzicoolBetreff: Videocheck |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Haben die Schleifen auch Flip? | ||
Oetzicool |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
also so sieht der doe momentan aus...
BlitzBasic: [AUSKLAPPEN] Graphics 640,480,16,2 |
||
![]() |
hecticSieger des IS Talentwettbewerb 2006 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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? | ||
![]() |
hecticSieger des IS Talentwettbewerb 2006 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ! |
![]() |
hecticSieger des IS Talentwettbewerb 2006 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group