Seite 1 von 2

Bewegungserkennung bei WebCam

Verfasst: 22.04.2006 14:11
von Delle
Hallo,

angenommen man liest aller 10 Sekunden von der Webcam das Bild ein,
wie überprüft man dann ob eine Bewegung stattgefunden hat, also eine Veränderung des Bildes?

Einfach wäre ja mit dem letzten Bild zu vergleichen, wenn nicht 90% der Bytes gleich oder so, dann Bewegung.

Aber ich mein das Licht bei der Webcam verändert sich ja sowieso je nach Tageszeit...

Wie filtert man sowas raus, ohne es als Bewegung gelten zu lassen?

Verfasst: 22.04.2006 14:14
von Delle
Achso eine Idee wäre vielleicht noch, die Pixel in 10er Schritten horizontal/vertikal zu checken, inwiefern eine Veränderung der Farbe stattgefunden hat. Ansonsten würde wohl ein Vergleich zu lange dauern...

Verfasst: 17.09.2007 17:04
von Jilocasin
Ich weiß der Thread ist nun schon über ein Jahr alt, aber ich wollte deshalb keinen neuen erstellen :D

Gestern hat mich mal die Idee nach so etwas gepackt und folgendes ist (mit Such-Hilfe hier aus'm Forum) dabei rausgekommen :

Code: Alles auswählen

#WM_CAP_START = #WM_USER
#WM_CAP_SET_CALLBACK_ERROR = #WM_CAP_START + 2
#WM_CAP_SET_CALLBACK_STATUS = #WM_CAP_START + 3
#WM_CAP_SET_CALLBACK_YIELD = #WM_CAP_START + 4
#WM_CAP_SET_CALLBACK_FRAME = #WM_CAP_START + 5
#WM_CAP_SET_CALLBACK_VIDEOSTREAM = #WM_CAP_START + 6
#WM_CAP_SET_CALLBACK_WAVESTREAM = #WM_CAP_START + 7
#WM_CAP_DRIVER_CONNECT = #WM_CAP_START + 10
#WM_CAP_DRIVER_DISCONNECT = #WM_CAP_START + 11
#WM_CAP_DRIVER_GET_CAPS = #WM_CAP_START + 14
#WM_CAP_DLG_VIDEOFORMAT = #WM_CAP_START + 41
#WM_CAP_DLG_VIDEOSOURCE = #WM_CAP_START + 42
#WM_CAP_DLG_VIDEODISPLAY = #WM_CAP_START + 43
#WM_CAP_SET_PREVIEW = #WM_CAP_START + 50
#WM_CAP_SET_PREVIEWRATE = #WM_CAP_START + 52
#WM_CAP_GET_STATUS = #WM_CAP_START + 54
#WM_CAP_FILE_SAVEDIB = #WM_CAP_START + 25
#WM_CAP_SET_SCALE = #WM_CAP_START + 53
#WM_CAP_SET_CALLBACK_CAPCONTROL = #WM_CAP_START + 85
#WM_CAP_EDIT_COPY = #WM_CAP_START + 30
#WM_CAP_GRAB_FRAME = #WM_CAP_START + 60

Enumeration
  #G_Modus1
  #G_Modus2
  #G_Modus3
  #G_Modus4
  #G_Color
  #G_Grid
  #G_Stepping
  #G_SteppingText
  #G_Tolerance
  #G_ToleranceText
EndEnumeration


Tolerance = 50
Stepping = 6 ; kleiner 4 is schlecht...
SteppingDivide = Stepping * Stepping
Color = $FFFFFF
LastTime = ElapsedMilliseconds()

#ImgPerSec = 50 ; HIER EDITIEREN^^
#Time = 1000 / #ImgPerSec

If OpenLibrary(0, "AVICAP32.DLL") = 0
  MessageRequester("Error", "Cannot find AVICAP32.DLL!", 16)
  End
EndIf


Structure RGB
  Red.c
  Green.c
  Blue.c
EndStructure

Global NewList LastAverage.RGB()
Global NewList NewAverage.RGB()


OpenWindow(1, 0, 0, 240, 40, "WebCam Move Detection", #PB_Window_TitleBar | #PB_Window_ScreenCentered)
CreateGadgetList(WindowID(1))
  TextGadget(#PB_Any, 10, 12, 220, 20, "Initialisierung, bitte warten...")


OpenWindow(0, 0, 0, 368, 450, "WebCam Move Detection", #PB_Window_SystemMenu | #PB_Window_Invisible | #PB_Window_ScreenCentered)

CreateGadgetList(WindowID(0))
Frame3DGadget(#PB_Any, 10, 10, 348, 330, "Vorschau")
OptionGadget(#G_Modus1, 34, 280, 60, 20, "Modus 1")
  SetGadgetState(#G_Modus1, 1)
OptionGadget(#G_Modus2, 114, 280, 60, 20, "Modus 2")
OptionGadget(#G_Modus3, 194, 280, 60, 20, "Modus 3")
OptionGadget(#G_Modus4, 274, 280, 60, 20, "Modus 4")

ButtonGadget(#G_Color, 30, 305, 100, 22, "Farbe")

CheckBoxGadget(#G_Grid, 150, 307, 100, 20, "Gitter anzeigen")
  SetGadgetState(#G_Grid, 1)

TextGadget(#PB_Any, 10, 350, 348, 20, "Toleranz:")
TrackBarGadget(#G_Tolerance, 10, 370, 318, 22, 0, 255, %00100000)
  SetGadgetState(#G_Tolerance, Tolerance)
TextGadget(#G_ToleranceText, 328, 370, 30, 20, Str(Tolerance), #PB_Text_Right)

TextGadget(#PB_Any, 10, 400, 348, 20, "Testgröße:")
TrackBarGadget(#G_Stepping, 10, 420, 318, 22, 2, 32, %00100000)
  SetGadgetState(#G_Stepping, Stepping)
TextGadget(#G_SteppingText, 328, 420, 30, 20, Str(Stepping) + " px", #PB_Text_Right)

;hCaptureWnd = CallFunction(0, "capCreateCaptureWindowA", "Test", #WS_VISIBLE | #WS_CHILD, 0, 0, 320, 240, WindowID(0), 0)
hCaptureWnd = CallFunction(0, "capCreateCaptureWindowA", "Test", #WS_VISIBLE | #WS_CHILD, 1, 1, 1, 1, WindowID(0), 0)
If hCaptureWnd = 0
  MessageRequester("Error", "Cannot open device!", 16)
  End
EndIf

SendMessage_(hCaptureWnd, #WM_CAP_DRIVER_CONNECT, 0 , 0)

CloseWindow(1)

HideWindow(0, 0)


Repeat
  EventID = WaitWindowEvent(#Time / 2) ; Um "doppelte" Überschneidungen zu verhindern...
  
  If EventID = #PB_Event_Gadget
    Select EventGadget()
    Case #G_Tolerance
      Tolerance = GetGadgetState(#G_Tolerance)
      SetGadgetText(#G_ToleranceText, Str(Tolerance))
      
    Case #G_Stepping
      Stepping = GetGadgetState(#G_Stepping)
      SteppingDivide = Stepping * Stepping
      SetGadgetText(#G_SteppingText, Str(Stepping) + " px")
      ClearList(LastAverage())
      
    Case #G_Color
      NewColor = ColorRequester(Color)
      If NewColor <> -1
        Color = NewColor
      EndIf
      
    EndSelect
  EndIf
  
  If EventID = #WM_CLOSE
    SendMessage_(hCaptureWnd, #WM_CAP_SET_PREVIEW, 0, 0)
    SendMessage_(hCaptureWnd, #WM_CAP_DRIVER_DISCONNECT, "Test", 0)
    DestroyWindow_(hCaptureWnd)
    CloseLibrary(0)
    End
  EndIf
  
  
  If ElapsedMilliseconds() - LastTime > #Time
    SendMessage_(hCaptureWnd, #WM_CAP_GRAB_FRAME, 0, 0)
    SendMessage_(hCaptureWnd, #WM_CAP_EDIT_COPY, 0, 0)
    hImg = GetClipboardImage(0, 24)
    
    
    If hImg
      If GetObject_(ImageID(0), SizeOf(BITMAP), @ImageInfo.BITMAP) And StartDrawing(ImageOutput(0))
        If GetGadgetState(#G_Modus1)
          DrawingMode(#PB_2DDrawing_Default)
        ElseIf GetGadgetState(#G_Modus2)
          DrawingMode(#PB_2DDrawing_Outlined)
        ElseIf GetGadgetState(#G_Modus3)
          DrawingMode(#PB_2DDrawing_XOr)
        ElseIf GetGadgetState(#G_Modus4)
          DrawingMode(#PB_2DDrawing_XOr | #PB_2DDrawing_Outlined)
        EndIf
        
        ResetList(LastAverage())
        
        X = 0
        Repeat
          Y = 0
          Repeat
            CountRed.l = 0
            CountGreen.l = 0
            CountBlue.l = 0
            
            For PixelX = X To X + Stepping
              For PixelY = Y To Y + Stepping
                *ImgPointer.RGB = ImageInfo\bmBits + PixelX + PixelX + PixelX + ImageInfo\bmWidthBytes * (ImageInfo\bmHeight-PixelY)
                
                CountRed + *ImgPointer\Blue
                CountGreen + *ImgPointer\Green
                CountBlue + *ImgPointer\Red
              Next
            Next
            
            AddElement(NewAverage())
            NewAverage()\Red = CountRed / SteppingDivide
            NewAverage()\Green = CountRed / SteppingDivide
            NewAverage()\Blue = CountRed / SteppingDivide
            
            If NextElement(LastAverage())
              If Abs(LastAverage()\Red - NewAverage()\Red) > Tolerance
                Box(X, Y, Stepping, Stepping, Color)
              ElseIf Abs(LastAverage()\Green - NewAverage()\Green) > Tolerance
                Box(X, Y, Stepping, Stepping, Color)
              ElseIf Abs(LastAverage()\Blue - NewAverage()\Blue) > Tolerance
                Box(X, Y, Stepping, Stepping, Color)
              EndIf
            EndIf
            
            Y + Stepping
          Until Y > ImageInfo\bmHeight - Stepping
          
          X + Stepping
        Until X > ImageInfo\bmWidth - Stepping
        
        
        If GetGadgetState(#G_Grid)
          For PixelX = 0 To ImageInfo\bmWidth Step 4
            For PixelY = 0 To ImageInfo\bmHeight Step 32
              *ImgPointer.RGB = ImageInfo\bmBits + PixelX + PixelX + PixelX + ImageInfo\bmWidthBytes * (ImageInfo\bmHeight-PixelY)
              
              *ImgPointer\Red = 255 - *ImgPointer\Red
              *ImgPointer\Green = 255 - *ImgPointer\Green
              *ImgPointer\Blue = 255 - *ImgPointer\Blue
            Next
          Next
          
          For PixelX = 0 To ImageInfo\bmWidth Step 32
            For PixelY = 0 To ImageInfo\bmHeight Step 4
              *ImgPointer.RGB = ImageInfo\bmBits + PixelX + PixelX + PixelX + ImageInfo\bmWidthBytes * (ImageInfo\bmHeight-PixelY)
              
              *ImgPointer\Red = 255 - *ImgPointer\Red
              *ImgPointer\Green = 255 - *ImgPointer\Green
              *ImgPointer\Blue = 255 - *ImgPointer\Blue
            Next
          Next
        EndIf
        
        StopDrawing()
      EndIf
      
      
      ClearList(LastAverage())
      
      ForEach NewAverage()
        AddElement(LastAverage())
        LastAverage()\Red = NewAverage()\Red
        LastAverage()\Green = NewAverage()\Green
        LastAverage()\Blue = NewAverage()\Blue
      Next
      
      ClearList(NewAverage())
      
      If StartDrawing(WindowOutput(0))
        DrawImage(ImageID(0), 24, 32, 320, 240)
        StopDrawing()
      EndIf
      
      
      
    EndIf
    
    
    LastTime = ElapsedMilliseconds()
  EndIf
 
ForEver
Mag an manchen Stellen noch etwas holprig aussehen und die G, war relativ schnell dahinprogrammiert <)

Verbesserungen etc immer her damit, vor allem Vorschläge zur Geschwindigkeit und wie man vor dem Benutzen die Eingabequelle wählen kann^^

Verfasst: 20.09.2007 11:38
von Delle
Das funktioniert ganz gut... was machst Du aber, wenn z.B. nur eine Tür "bewacht" wird und sich da bewegungsmäßig nichts tut aber irgendwann dunkel wird?

Verfasst: 20.09.2007 12:19
von hardfalcon
Fast-Offtopic: Ich hab gestern mal versucht, meine Webcam unter Linux zum Laufen zu bringen (mit Erflog :D ), und bin dabei zufällig auf motion gestoßen (gibts leider nur für Linux). Das Programm werted laufend den Videostream der Webcam aus, und speichert jedes Mal, wenn es eine Bewegung im Bild feststellt, ein Bild ab (motion gibts leider nur für Linux, aber den Quelltext könnt ihr euch ja trotzdem mal anschauen).

Ich hab mir auch nochmal Gedanken zum Thema gemacht, eigentlich sollte es ja schon reichen, wenn man von jedem Bild einen durchschnittlichen Helligkeitswert berechnet, und bei einer Verànderung über einen bestimmten Stellenwert das Bild knipst...

Verfasst: 21.09.2007 19:14
von Jilocasin
Delle hat geschrieben:Das funktioniert ganz gut... was machst Du aber, wenn z.B. nur eine Tür "bewacht" wird und sich da bewegungsmäßig nichts tut aber irgendwann dunkel wird?
Es wird ja immer relativ zum letzten Bild gemessen, sprich.. wird es allmählich dunkel (stinknormale Nacht/Tag-Situation) sollte es das Programm wenig kümmern

Verfasst: 21.09.2007 21:41
von Thalius
Versuch mal:

http://www.videohelp.com/tools/ffmpeg

C Source gibts auch. :)

Thalius

Verfasst: 23.09.2007 17:30
von Jilocasin
Joa.. ääh.. was hat das hiermit zu tun? :?

Und was soll ich mit C Source :lol:

Verfasst: 29.09.2007 17:04
von coder
@Jilcasin
Bei mir erzeugt folgende Zeile immer einen IMA:

Code: Alles auswählen

[...]
CountRed + *ImgPointer\Blue 
CountGreen + *ImgPointer\Green 
CountBlue + *ImgPointer\Red
[...]
Wäre nett wenn du das fixen könntest :allright:

So...

Verfasst: 29.09.2007 19:11
von R4z0r1989
Da ich so ein alter "wurschtler" bin hab ich mal was gemacht dass man Log und Pics ertellen lassen kann...

Ich wünsche viel kritik und kommentare!

Code: Alles auswählen

UseJPEGImageEncoder()

#WM_CAP_START = #WM_USER
#WM_CAP_SET_CALLBACK_ERROR = #WM_CAP_START + 2
#WM_CAP_SET_CALLBACK_STATUS = #WM_CAP_START + 3
#WM_CAP_SET_CALLBACK_YIELD = #WM_CAP_START + 4
#WM_CAP_SET_CALLBACK_FRAME = #WM_CAP_START + 5
#WM_CAP_SET_CALLBACK_VIDEOSTREAM = #WM_CAP_START + 6
#WM_CAP_SET_CALLBACK_WAVESTREAM = #WM_CAP_START + 7
#WM_CAP_DRIVER_CONNECT = #WM_CAP_START + 10
#WM_CAP_DRIVER_DISCONNECT = #WM_CAP_START + 11
#WM_CAP_DRIVER_GET_CAPS = #WM_CAP_START + 14
#WM_CAP_DLG_VIDEOFORMAT = #WM_CAP_START + 41
#WM_CAP_DLG_VIDEOSOURCE = #WM_CAP_START + 42
#WM_CAP_DLG_VIDEODISPLAY = #WM_CAP_START + 43
#WM_CAP_SET_PREVIEW = #WM_CAP_START + 50
#WM_CAP_SET_PREVIEWRATE = #WM_CAP_START + 52
#WM_CAP_GET_STATUS = #WM_CAP_START + 54
#WM_CAP_FILE_SAVEDIB = #WM_CAP_START + 25
#WM_CAP_SET_SCALE = #WM_CAP_START + 53
#WM_CAP_SET_CALLBACK_CAPCONTROL = #WM_CAP_START + 85
#WM_CAP_EDIT_COPY = #WM_CAP_START + 30
#WM_CAP_GRAB_FRAME = #WM_CAP_START + 60

Enumeration
  #G_Modus1
  #G_Modus2
  #G_Modus3
  #G_Modus4
  #G_Color
  #G_Grid
  #G_Stepping
  #G_SteppingText
  #G_Tolerance
  #G_ToleranceText
  #G_Time
  #G_TimeText
  #G_Starttime
  #G_StarttimeText
  #G_Start
  #G_Stop
  #G_Quaders
  #G_Pics
  #G_Log
EndEnumeration


Tolerance = 70
Stepping = 10
time = 1000
starttime = 10000
SteppingDivide = Stepping * Stepping
Color = $FFFFFF
LastTime = ElapsedMilliseconds()

#ImgPerSec = 50 ; HIER EDITIEREN^^
#Time = 1000 / #ImgPerSec

If OpenLibrary(0, "AVICAP32.DLL") = 0
  MessageRequester("Error", "Cannot find AVICAP32.DLL!", 16)
  End
EndIf


Structure RGB
  Red.c
  Green.c
  Blue.c
EndStructure

Global NewList LastAverage.RGB()
Global NewList NewAverage.RGB()


OpenWindow(1, 0, 0, 240, 40, "Cam Motion Detectiv", #PB_Window_TitleBar | #PB_Window_ScreenCentered)
CreateGadgetList(WindowID(1))
  TextGadget(#PB_Any, 10, 12, 220, 20, "Initialisierung, bitte warten...")


OpenWindow(0, 0, 0, 368, 650, "Cam Motion Detectiv", #PB_Window_SystemMenu | #PB_Window_Invisible | #PB_Window_ScreenCentered)

CreateGadgetList(WindowID(0))
Frame3DGadget(#PB_Any, 10, 10, 348, 330, "Vorschau")
OptionGadget(#G_Modus1, 34, 280, 60, 20, "Modus 1")
  SetGadgetState(#G_Modus1, 1)
OptionGadget(#G_Modus2, 114, 280, 60, 20, "Modus 2")
OptionGadget(#G_Modus3, 194, 280, 60, 20, "Modus 3")
OptionGadget(#G_Modus4, 274, 280, 60, 20, "Modus 4")

ButtonGadget(#G_Color, 30, 305, 100, 22, "Farbe")

CheckBoxGadget(#G_Grid, 150, 307, 100, 20, "Gitter anzeigen")
  SetGadgetState(#G_Grid, 1)

TextGadget(#PB_Any, 10, 350, 348, 20, "Toleranz:")
TrackBarGadget(#G_Tolerance, 10, 370, 318, 22, 0, 255, %00100000)
  SetGadgetState(#G_Tolerance, Tolerance)
TextGadget(#G_ToleranceText, 328, 370, 30, 20, Str(Tolerance), #PB_Text_Right)

TextGadget(#PB_Any, 10, 400, 348, 20, "Testgröße:")
TrackBarGadget(#G_Stepping, 10, 420, 318, 22, 2, 32, %00100000)
  SetGadgetState(#G_Stepping, Stepping)
TextGadget(#G_SteppingText, 328, 420, 30, 20, Str(Stepping) + " px", #PB_Text_Right)

TextGadget(#PB_Any, 10, 450, 348, 20, "Time:")
TrackBarGadget(#G_Time, 10, 470, 318, 22, 1, 10, %00100000)
  SetGadgetState(#G_Time, time/1000)
TextGadget(#G_TimeText, 328, 470, 30, 20, Str(time/1000), #PB_Text_Right)

TextGadget(#PB_Any, 10, 500, 348, 20, "Starttime:")
TrackBarGadget(#G_Starttime, 10, 520, 318, 22, 10, 60, %00100000)
  SetGadgetState(#G_Starttime, starttime/1000)
TextGadget(#G_StarttimeText, 328, 520, 30, 20, Str(starttime/1000), #PB_Text_Right)

ButtonGadget(#G_Start, 10, 550, 50, 20, "Start")
ButtonGadget(#G_Stop , 70, 550, 50, 20, "Stop" )
CheckBoxGadget(#G_Quaders, 130, 550, 60, 20, "Quaders") 
CheckBoxGadget(#G_Pics, 200, 550, 40, 20, "Pics")
CheckBoxGadget(#G_Log, 250, 550, 40, 20, "Log") 

;hCaptureWnd = CallFunction(0, "capCreateCaptureWindowA", "Test", #WS_VISIBLE | #WS_CHILD, 0, 0, 320, 240, WindowID(0), 0)
hCaptureWnd = CallFunction(0, "capCreateCaptureWindowA", "Test", #WS_VISIBLE | #WS_CHILD, 1, 1, 1, 1, WindowID(0), 0)
If hCaptureWnd = 0
  MessageRequester("Error", "Cannot open device!", 16)
  End
EndIf

SendMessage_(hCaptureWnd, #WM_CAP_DRIVER_CONNECT, 0 , 0)

CloseWindow(1)

HideWindow(0, 0)

elapsed = ElapsedMilliseconds() + starttime

DisableGadget(#g_stop,1)

Repeat
  EventID = WaitWindowEvent(#Time / 2) ; Um "doppelte" Überschneidungen zu verhindern...
 
  If EventID = #PB_Event_Gadget
    Select EventGadget()
    Case #G_Tolerance
      Tolerance = GetGadgetState(#G_Tolerance)
      SetGadgetText(#G_ToleranceText, Str(Tolerance))
     
    Case #G_Stepping
      Stepping = GetGadgetState(#G_Stepping)
      SteppingDivide = Stepping * Stepping
      SetGadgetText(#G_SteppingText, Str(Stepping) + " px")
      ClearList(LastAverage())
      
    Case #G_Time
      time = GetGadgetState(#G_Time)*1000
      SetGadgetText(#G_TimeText, Str(time/1000))
      
    Case #G_Starttime
      starttime = GetGadgetState(#G_Starttime)*1000
      SetGadgetText(#G_StarttimeText, Str(starttime/1000))
     
    Case #G_Color
      NewColor = ColorRequester(Color)
      If NewColor <> -1
        Color = NewColor
      EndIf
      
    Case #G_Start
      Start = 1
      DisableGadget(#G_Start,1)
      DisableGadget(#G_Stop ,0)
      elapsed = ElapsedMilliseconds() + starttime - time
      DisableGadget(#G_Modus1,1)
      DisableGadget(#G_Modus2,1)
      DisableGadget(#G_Modus3,1)
      DisableGadget(#G_Modus4,1)
      DisableGadget(#G_Color,1)
      DisableGadget(#G_Grid,1)
      DisableGadget(#G_Stepping,1)
      DisableGadget(#G_Tolerance,1)
      DisableGadget(#G_Time,1)
      DisableGadget(#G_Starttime,1)
      DisableGadget(#G_Quaders,1)
      DisableGadget(#G_Pics,1)
      DisableGadget(#G_Log,1)
      
    Case #G_Stop
      Start = 0
      DisableGadget(#G_Start,0)
      DisableGadget(#G_Stop ,1)
      elapsed = ElapsedMilliseconds() + starttime - time
      DisableGadget(#G_Modus1,0)
      DisableGadget(#G_Modus2,0)
      DisableGadget(#G_Modus3,0)
      DisableGadget(#G_Modus4,0)
      DisableGadget(#G_Color,0)
      DisableGadget(#G_Grid,0)
      DisableGadget(#G_Stepping,0)
      DisableGadget(#G_Tolerance,0)
      DisableGadget(#G_Time,0)
      DisableGadget(#G_Starttime,0)
      DisableGadget(#G_Quaders,0)
      DisableGadget(#G_Pics,0)
      DisableGadget(#G_Log,0)
      
     
    EndSelect
  EndIf
 
  If EventID = #WM_CLOSE
    SendMessage_(hCaptureWnd, #WM_CAP_SET_PREVIEW, 0, 0)
    SendMessage_(hCaptureWnd, #WM_CAP_DRIVER_DISCONNECT, "Test", 0)
    DestroyWindow_(hCaptureWnd)
    CloseLibrary(0)
    End
  EndIf
 
 
  If ElapsedMilliseconds() - LastTime > #Time
    SendMessage_(hCaptureWnd, #WM_CAP_GRAB_FRAME, 0, 0)
    SendMessage_(hCaptureWnd, #WM_CAP_EDIT_COPY, 0, 0)
    hImg = GetClipboardImage(0, 24)
   
   
    If hImg
      If GetObject_(ImageID(0), SizeOf(BITMAP), @ImageInfo.BITMAP) And StartDrawing(ImageOutput(0))
        If GetGadgetState(#G_Modus1)
          DrawingMode(#PB_2DDrawing_Default)
        ElseIf GetGadgetState(#G_Modus2)
          DrawingMode(#PB_2DDrawing_Outlined)
        ElseIf GetGadgetState(#G_Modus3)
          DrawingMode(#PB_2DDrawing_XOr)
        ElseIf GetGadgetState(#G_Modus4)
          DrawingMode(#PB_2DDrawing_XOr | #PB_2DDrawing_Outlined)
        EndIf
       
        ResetList(LastAverage())
       
        X = 0
        Repeat
          Y = 0
          Repeat
            CountRed.l = 0
            CountGreen.l = 0
            CountBlue.l = 0
           
            For PixelX = X To X + Stepping
              For PixelY = Y To Y + Stepping
                *ImgPointer.RGB = ImageInfo\bmBits + PixelX + PixelX + PixelX + ImageInfo\bmWidthBytes * (ImageInfo\bmHeight-PixelY)
               
                CountRed + *ImgPointer\Blue
                CountGreen + *ImgPointer\Green
                CountBlue + *ImgPointer\Red
              Next
            Next
           
            AddElement(NewAverage())
            NewAverage()\Red = CountRed / SteppingDivide
            NewAverage()\Green = CountRed / SteppingDivide
            NewAverage()\Blue = CountRed / SteppingDivide
           
            If NextElement(LastAverage())
              If Abs(LastAverage()\Red - NewAverage()\Red) > Tolerance
                If GetGadgetState(#G_Quaders) = 1
                  Box(X, Y, Stepping, Stepping, Color)
                EndIf
                motion = 1
              ElseIf Abs(LastAverage()\Green - NewAverage()\Green) > Tolerance
                If GetGadgetState(#G_Quaders) = 1
                  Box(X, Y, Stepping, Stepping, Color)
                EndIf
                motion = 1
              ElseIf Abs(LastAverage()\Blue - NewAverage()\Blue) > Tolerance
                If GetGadgetState(#G_Quaders) = 1
                  Box(X, Y, Stepping, Stepping, Color)
                EndIf
                motion = 1
              EndIf
            EndIf
           
            Y + Stepping
          Until Y > ImageInfo\bmHeight - Stepping
         
          X + Stepping
        Until X > ImageInfo\bmWidth - Stepping
       
       
        If GetGadgetState(#G_Grid)
          For PixelX = 0 To ImageInfo\bmWidth Step 4
            For PixelY = 0 To ImageInfo\bmHeight Step 32
              *ImgPointer.RGB = ImageInfo\bmBits + PixelX + PixelX + PixelX + ImageInfo\bmWidthBytes * (ImageInfo\bmHeight-PixelY)
              *ImgPointer\Red = 255 - *ImgPointer\Red
              *ImgPointer\Green = 255 - *ImgPointer\Green
              *ImgPointer\Blue = 255 - *ImgPointer\Blue
            Next
          Next
         
          For PixelX = 0 To ImageInfo\bmWidth Step 32
            For PixelY = 0 To ImageInfo\bmHeight Step 4
              *ImgPointer.RGB = ImageInfo\bmBits + PixelX + PixelX + PixelX + ImageInfo\bmWidthBytes * (ImageInfo\bmHeight-PixelY)
             
              *ImgPointer\Red = 255 - *ImgPointer\Red
              *ImgPointer\Green = 255 - *ImgPointer\Green
              *ImgPointer\Blue = 255 - *ImgPointer\Blue
            Next
          Next
        EndIf
       
        StopDrawing()
      EndIf
     
     
      ClearList(LastAverage())
     
      ForEach NewAverage()
        AddElement(LastAverage())
        LastAverage()\Red = NewAverage()\Red
        LastAverage()\Green = NewAverage()\Green
        LastAverage()\Blue = NewAverage()\Blue
      Next
     
      ClearList(NewAverage())
      
      If motion = 1 And ElapsedMilliseconds() >= elapsed + time And start = 1
        If Day(Date()) < 10
          Day$ = "0"+Str(Day(Date()))
        Else
          Day$ = Str(Day(Date()))
        EndIf
        If Month(Date()) < 10
          Month$ = "0"+Str(Month(Date()))
        Else
          Month$ = Str(Month(Date()))
        EndIf
        If Hour(Date()) < 10
          Hour$ = "0"+Str(Hour(Date()))
        Else
          Hour$ = Str(Hour(Date()))
        EndIf
        If Minute(Date()) < 10
          Minute$ = "0"+Str(Minute(Date()))
        Else
          Minute$ = Str(Minute(Date()))
        EndIf
        If Second(Date()) < 10
          Second$ = "0"+Str(Second(Date()))
        Else
          Second$ = Str(Second(Date()))
        EndIf
        Debug "move"
        If GetGadgetState(#G_Pics) = 1
          CreateDirectory("MotionPics")
          CreateDirectory("MotionPics/"+Day$+Month$)
          SaveImage(0,"MotionPics/"+Day$+Month$+"/"+Hour$+Minute$+Second$+".jpg",#PB_ImagePlugin_JPEG)
        EndIf
        If GetGadgetState(#G_Log) = 1
          CreateDirectory("MotionLogs")
          OpenFile(0,"MotionLogs/"+Day$+Month$+".log")
          FileSeek(0,Lof(0))
          WriteStringN(0, "New Motion @ "+Hour$+":"+Minute$+":"+Second$)
        EndIf
        motion = 0
        elapsed = ElapsedMilliseconds()
      EndIf
      
      If StartDrawing(WindowOutput(0))
        DrawImage(ImageID(0), 24, 32, 320, 240)
        StopDrawing()
      EndIf
     
     
     
    EndIf
   
   
    LastTime = ElapsedMilliseconds()
  EndIf
 
ForEver
PS: Ich hab mal den Namen vom Prog geändert wenns dich ned stört lass ich ihn so!

Ahja und ich wollt sagen dass ich durch den Code irgendwie ned durchblick aber trozdem erweitert hab xP