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 + PixelY * ImageInfo\bmWidthBytes
               
                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-1 Step 4
            For PixelY = 0 To ImageInfo\bmHeight-1 Step 32
              *ImgPointer.RGB = ImageInfo\bmBits + PixelX + PixelY * ImageInfo\bmWidthBytes
              *ImgPointer\Red = 255 - *ImgPointer\Red
              *ImgPointer\Green = 255 - *ImgPointer\Green
              *ImgPointer\Blue = 255 - *ImgPointer\Blue
            Next
          Next
         
          For PixelX = 0 To ImageInfo\bmWidth-1 Step 32
            For PixelY = 0 To ImageInfo\bmHeight-1 Step 4
              *ImgPointer.RGB = ImageInfo\bmBits + PixelX + PixelY * ImageInfo\bmWidthBytes
             
              *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