3 webcams

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
deify
Beiträge: 141
Registriert: 29.03.2010 22:01
Computerausstattung: Win7 64bit
AMD Phenom II X4 940
NVIDIA GeForce GTS 250
4GB RAM
Kontaktdaten:

Re: 3 webcams

Beitrag von deify »

danke erstmal! jetzt muss ich noch schauen dass ich es mit allen 3 cams zum laufen bringe!

mfg deify
Windows 7 | 64bit | PureBasic 4.51 (x64/x86)
D.J.Peters
Beiträge: 87
Registriert: 28.11.2010 13:07
Computerausstattung: P4 2x3.2GKz.1GB WIXP 32Bit NVIDEA GT240 1GB DDR3, AMD XP 1.8GHz Linux 32Bit NVIDEA GT240 TIi3200
Wohnort: Germany
Kontaktdaten:

Re: 3 webcams

Beitrag von D.J.Peters »

Hallo deify,
warum fragst Du in deinen Threads nicht mal ob überhaupt ein neues "gültiges" Bild vorhanden ist ?

Grüsse Joshy
PS. meine vielen Fehler der Rechtschreibung auf dem Forum könnt Ihr gerne ignorieren.
Benutzeravatar
deify
Beiträge: 141
Registriert: 29.03.2010 22:01
Computerausstattung: Win7 64bit
AMD Phenom II X4 940
NVIDIA GeForce GTS 250
4GB RAM
Kontaktdaten:

Re: 3 webcams

Beitrag von deify »

das war ja eine meiner fragen (: wie soll ich das machen? sobald es ein image lesen kann ist es ja "gültig" oder?
gibt es da etwa eine methode um das zu prüfen?

mfg deify
Windows 7 | 64bit | PureBasic 4.51 (x64/x86)
D.J.Peters
Beiträge: 87
Registriert: 28.11.2010 13:07
Computerausstattung: P4 2x3.2GKz.1GB WIXP 32Bit NVIDEA GT240 1GB DDR3, AMD XP 1.8GHz Linux 32Bit NVIDEA GT240 TIi3200
Wohnort: Germany
Kontaktdaten:

Re: 3 webcams

Beitrag von D.J.Peters »

deify hat geschrieben:...gibt es da etwa eine methode um das zu prüfen?
Ja sicher aber die kennst Du doch!

Grüsse Joshy
pseudo code:

Code: Alles auswählen

proc CaptureThread(...)
  ; start capturing     
  While Quit=False and doCapture(deviceno)=Ok
    ; warte auf fertiges Bild
    While Quit=False and isCaptureDone(deviceno) = 0
      Delay(5)
    Wend
    ; get fresh image data
    ; ...
  Wend
end proc
PS. meine vielen Fehler der Rechtschreibung auf dem Forum könnt Ihr gerne ignorieren.
Benutzeravatar
deify
Beiträge: 141
Registriert: 29.03.2010 22:01
Computerausstattung: Win7 64bit
AMD Phenom II X4 940
NVIDIA GeForce GTS 250
4GB RAM
Kontaktdaten:

Re: 3 webcams

Beitrag von deify »

ah ja! :D ich habe gedacht du meinst ob der buffer nachträglich kontrolliert werden kann! ich habe diese funktion komplett vergessen weil ich sie zu testzwecken kurzzeitig mal rausgelöscht hatte (:

danke dir für den tip
Windows 7 | 64bit | PureBasic 4.51 (x64/x86)
Benutzeravatar
deify
Beiträge: 141
Registriert: 29.03.2010 22:01
Computerausstattung: Win7 64bit
AMD Phenom II X4 940
NVIDIA GeForce GTS 250
4GB RAM
Kontaktdaten:

Re: 3 webcams

Beitrag von deify »

hey jungs! Frohe Weihnachten euch allen erstmal (:

ich konnte in letzter zeit nicht weiter am projekt arbeiten! aber ich habe festgestellt, dass das flackern des bildes nicht am code lag! wenn ich den von chris verwende flackert es nicht! (liegt wahrscheinlich am drawing) veränder ich den code aber so, dass er mit catchimage direkt auf das gadget zeichnet, so flackert es auch! leider ist der code mit startdrawing aber nicht "multithread fähig" da ich ja wie schon erwähnt alle 3 cambilder brauche!

noch irgendjemand eine idee woher es dann kommt? oder muss ich in seinen code auch wieder eine bildüberprüfung mit max 30fps einbauen? wenn ich die iscapturedone funktion verwende erhalte ich leider auch nur eine maximale fpszahl von 17fps...

EDIT:
des weiteren bin ich auch zu dumm irgendetwas zu finden, mit dem ich die einzelbilder als video aus dem buffer speichern kann... ich weiß dass es mit avicap bzw der api geht, da ich aber 2 verschiedene methoden zum aufnehmen verwende (sonst gehen nicht alle 3) und die avicap nicht darunter fällt, bin ich ratlos.... wäre ich auch bei der avicap :D

hoffe ihr könnt mit helfen

mfg deify
Windows 7 | 64bit | PureBasic 4.51 (x64/x86)
- chris -
Beiträge: 195
Registriert: 24.08.2005 19:52
Wohnort: Stadtallendorf

Re: 3 webcams

Beitrag von - chris - »

Hier das ganze mal mit 2 Kameras und mit zwei Thread's,
mit startdrawing.

Code: Alles auswählen


EnableExplicit

IncludeFile "escapi.pbi"

If escapiOpen() = 0
  MessageRequester("Kamera", "DLL 'escapi.dll' nicht vorhanden!")
  End
EndIf

;- Enumerations / DataSections
;- Windows
Enumeration
  #Window_0
EndEnumeration

;- Gadgets
Enumeration
  #Image_0
  #Image_1
EndEnumeration

;- Define
Define Event.l, EventWindow.l, EventGadget.l, EventType.l, EventMenu.l

;- Global
Global quit.i, q1.i, q2.i, capture01TH.i, capture02TH.i
Global mx.i, my.i

Procedure OpenWindow_Window_0()
  Protected res.i
  res = #False
  If OpenWindow(#Window_0, 0, 0, 640, 240, "Kamera", #PB_Window_ScreenCentered | #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_TitleBar)
    ImageGadget(#Image_0, 0, 0, 320, 240, 0)
    ImageGadget(#Image_1, 320, 0, 320, 240, 0)
    res = #True
  EndIf
  ProcedureReturn res
EndProcedure

Procedure.i gray(color.i, method.i = 0)
  Protected R.i, G.i, B.i, gray.i
  R = Red(color)
  G = Green(color)
  B = Blue(color)
  If method = 1
    gray = (R + G + B) / 3
  Else
    gray = 0.299 * R + 0.587 * G + 0.114 * B
  EndIf
  ProcedureReturn RGB(gray, gray, gray)
EndProcedure

Procedure capture01(temp.i)

  Protected width.l, height.l, image.i
  Protected deviceno.l, count.l, *namebuffer.i, bufferlength.l, name$
  Protected scp.SimpleCapParams
  Protected y.i, x.i, pixel.i, rgb.i
  Protected depth.i, fps_soll.i, delay.i
  Protected t1.q, t2.q, time.q

  Static fps_counter.i, fps_timer.i, fps_res.i

  deviceno = 0

  width  = 320
  height = 240

  fps_soll = 30
  delay    = 1000 / fps_soll

  image = CreateImage(#PB_Any, width, height, 24)
  SetGadgetState(#Image_0, ImageID(image))

  depth = ImageDepth(image)
  Debug "depth: " + Str(depth)

  initCOM()

  count = countCaptureDevices()

  Debug "count: " + Str(count)

  If count > 0

    bufferlength = 1000
    *namebuffer  = AllocateMemory(bufferlength)

    If *namebuffer > 0
      getCaptureDeviceName(deviceno, *namebuffer, bufferlength)
      name$ = PeekS(*namebuffer, -1, #PB_Ascii)
      If name$ <> ""
        Debug "name: " + name$
        SetWindowTitle(#Window_0, name$)
      EndIf
    EndIf

    scp\mWidth     = width
    scp\mHeight    = height
    scp\mTargetBuf = AllocateMemory(scp\mWidth * scp\mHeight * 4)

    Debug "memory: " + Str(scp\mWidth * scp\mHeight * 4)

    If scp\mTargetBuf > 0

      If initCapture(deviceno, @scp)

        Debug "initCapture"

        Repeat

          t1 = timeGetTime_()

          If fps_timer < t1
            fps_res     = fps_counter
            fps_timer   = t1 + 1000
            fps_counter = 0
          Else
            fps_counter + 1
          EndIf

          doCapture(deviceno)

          ;While isCaptureDone(deviceno) = 0
          ;  If quit = 1
          ;    Break
          ;  EndIf
          ;  Delay(1)
          ;Wend

          If quit = 1
            Break
          EndIf

          If StartDrawing(ImageOutput(image))

            For y = 0 To scp\mHeight - 1
              For x = 0 To scp\mWidth - 1
                pixel = PeekL(scp\mTargetBuf + (y*scp\mWidth + x) * 4)
                rgb   = RGB((pixel >> 16) & $FF, (pixel >> 8) & $FF, pixel & $FF)
                ;rgb   = gray(rgb)
                Plot(x, y, rgb)
              Next
            Next

            If mx > -1 And my > -1
              Circle(mx, my, 10, RGB(255, 0, 0))
            EndIf

            DrawText(10, 10, "FPS: " + Str(fps_res), RGB(255, 0, 0))

            StopDrawing()

            SetGadgetState(#Image_0, ImageID(image))

          EndIf

          t2 = timeGetTime_()

          time = t2 - t1
          
          If time < delay
            Delay(delay - time)
          Else
            Delay(1)
          EndIf  

        Until quit = 1

        deinitCapture(deviceno)

        Debug "deinitCapture"

      EndIf

    EndIf

    If *namebuffer > 0
      FreeMemory(*namebuffer)
    EndIf

    If scp\mTargetBuf > 0
      FreeMemory(scp\mTargetBuf)
    EndIf

  EndIf

EndProcedure

Procedure capture02(temp.i)

  Protected width.l, height.l, image.i
  Protected deviceno.l, count.l, *namebuffer.i, bufferlength.l, name$
  Protected scp.SimpleCapParams
  Protected y.i, x.i, pixel.i, rgb.i
  Protected depth.i, fps_soll.i, delay.i
  Protected t1.q, t2.q, time.q

  Static fps_counter.i, fps_timer.i, fps_res.i

  deviceno = 1

  width  = 320
  height = 240

  fps_soll = 30
  delay    = 1000 / fps_soll

  image = CreateImage(#PB_Any, width, height, 24)
  SetGadgetState(#Image_1, ImageID(image))

  depth = ImageDepth(image)
  Debug "depth: " + Str(depth)

  initCOM()

  count = countCaptureDevices()

  Debug "count: " + Str(count)

  If count > 1

    bufferlength = 1000
    *namebuffer  = AllocateMemory(bufferlength)

    If *namebuffer > 0
      getCaptureDeviceName(deviceno, *namebuffer, bufferlength)
      name$ = PeekS(*namebuffer, -1, #PB_Ascii)
      If name$ <> ""
        Debug "name: " + name$
        name$ = GetWindowTitle(#Window_0) + " | " + name$
        SetWindowTitle(#Window_0, name$)
      EndIf
    EndIf

    scp\mWidth     = width
    scp\mHeight    = height
    scp\mTargetBuf = AllocateMemory(scp\mWidth * scp\mHeight * 4)

    Debug "memory: " + Str(scp\mWidth * scp\mHeight * 4)

    If scp\mTargetBuf > 0

      If initCapture(deviceno, @scp)

        Debug "initCapture"

        Repeat

          t1 = timeGetTime_()

          If fps_timer < t1
            fps_res     = fps_counter
            fps_timer   = t1 + 1000
            fps_counter = 0
          Else
            fps_counter + 1
          EndIf

          doCapture(deviceno)

          ;While isCaptureDone(deviceno) = 0
          ;  If quit = 1
          ;    Break
          ;  EndIf
          ;  Delay(1)
          ;Wend

          If quit = 1
            Break
          EndIf

          If StartDrawing(ImageOutput(image))

            For y = 0 To scp\mHeight - 1
              For x = 0 To scp\mWidth - 1
                pixel = PeekL(scp\mTargetBuf + (y*scp\mWidth + x) * 4)
                rgb   = RGB((pixel >> 16) & $FF, (pixel >> 8) & $FF, pixel & $FF)
                ;rgb   = gray(rgb)
                Plot(x, y, rgb)
              Next
            Next

            If mx > -1 And my > -1
              Circle(mx - 320, my, 10, RGB(255, 0, 0))
            EndIf

            DrawText(10, 10, "FPS: " + Str(fps_res), RGB(255, 0, 0))

            StopDrawing()

            SetGadgetState(#Image_1, ImageID(image))

          EndIf

          t2 = timeGetTime_()

          time = t2 - t1

          If time < delay
            Delay(delay - time)
          Else
            Delay(1)
          EndIf  

        Until quit = 1

        deinitCapture(deviceno)

        Debug "deinitCapture"

      EndIf

    EndIf

    If *namebuffer > 0
      FreeMemory(*namebuffer)
    EndIf

    If scp\mTargetBuf > 0
      FreeMemory(scp\mTargetBuf)
    EndIf

  EndIf

EndProcedure

If OpenWindow_Window_0()

  StickyWindow(#Window_0, 1)

  capture01TH = CreateThread(@capture01(), 0)
  capture02TH = CreateThread(@capture02(), 0)

  ;- Event loop
  Repeat

    Event       = WaitWindowEvent(100)
    EventGadget = EventGadget()
    EventType   = EventType()
    EventWindow = EventWindow()

    mx = WindowMouseX(#Window_0)
    my = WindowMouseY(#Window_0)

    Select Event

      Case #PB_Event_Gadget

        If EventGadget = #Image_0
        EndIf

      Case #PB_Event_CloseWindow

        quit = 1

    EndSelect

    q1 = IsThread(capture01TH)
    q2 = IsThread(capture02TH)

  Until quit = 1 And q1 = 0

EndIf

escapiClose()

End

Zuletzt geändert von - chris - am 25.12.2010 20:47, insgesamt 1-mal geändert.
PB v5.72 x86/x64
Windows 10 Pro 64bit
Benutzeravatar
deify
Beiträge: 141
Registriert: 29.03.2010 22:01
Computerausstattung: Win7 64bit
AMD Phenom II X4 940
NVIDIA GeForce GTS 250
4GB RAM
Kontaktdaten:

Re: 3 webcams

Beitrag von deify »

:o seltsam! wieso kam dann bei mir eigentlich immer eine fehlermeldung, dass startdrawing nicht vor stopdrawing aufgerufen werden kann?
Windows 7 | 64bit | PureBasic 4.51 (x64/x86)
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8675
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 32 GB DDR4-3200
Ubuntu 22.04.3 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken
Kontaktdaten:

Re: 3 webcams

Beitrag von NicTheQuick »

Zweimal fast die selbe Procedure ist ein bisschen unnötig. Normalerweise sollte da eine Allround-Procedure reichen, der man nur den entsprechenden Parameter mit gibt.
Bild
- chris -
Beiträge: 195
Registriert: 24.08.2005 19:52
Wohnort: Stadtallendorf

Re: 3 webcams

Beitrag von - chris - »

Mit drei verschieden Kameras geht es auch:

Code: Alles auswählen


EnableExplicit

IncludeFile "escapi.pbi"

If escapiOpen() = 0
  MessageRequester("Kamera", "DLL 'escapi.dll' nicht vorhanden!")
  End
EndIf

;- Enumerations / DataSections
;- Windows
Enumeration
  #Window_0
EndEnumeration

;- Gadgets
Enumeration
  #Image_0
  #Image_1
  #Image_2
EndEnumeration

;- Images
Enumeration
  #Image_Image_0
EndEnumeration

;- Define
Define Event.l, EventWindow.l, EventGadget.l, EventType.l, EventMenu.l

;- Global
Global quit.i, q1.i, q2.i, q3.i, capture01TH.i, capture02TH.i, capture03TH.i
Global mx.i, my.i

Procedure OpenWindow_Window_0()
  Protected res.i
  res = #False
  If OpenWindow(#Window_0, 0, 0, 640, 480, "Kamera", #PB_Window_ScreenCentered | #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_TitleBar)
    ImageGadget(#Image_0, 0, 0, 320, 240, 0)
    ImageGadget(#Image_1, 320, 0, 320, 240, 0)
    ImageGadget(#Image_2, 0, 240, 320, 240, 0)
    res = #True
  EndIf
  ProcedureReturn res
EndProcedure

Procedure.i gray(color.i, method.i = 0)
  Protected R.i, G.i, B.i, gray.i
  R = Red(color)
  G = Green(color)
  B = Blue(color)
  If method = 1
    gray = (R + G + B) / 3
  Else
    gray = 0.299 * R + 0.587 * G + 0.114 * B
  EndIf
  ProcedureReturn RGB(gray, gray, gray)
EndProcedure

Procedure capture01(temp.i)

  Protected width.l, height.l, image.i
  Protected deviceno.l, count.l, *namebuffer.i, bufferlength.l, name$
  Protected scp.SimpleCapParams
  Protected y.i, x.i, pixel.i, rgb.i
  Protected depth.i, fps_soll.i, delay.i
  Protected t1.q, t2.q, time.q

  Static fps_counter.i, fps_timer.i, fps_res.i

  deviceno = 0

  width  = 320
  height = 240

  fps_soll = 30
  delay    = 1000 / fps_soll

  image = CreateImage(#PB_Any, width, height, 24)
  SetGadgetState(#Image_0, ImageID(image))

  depth = ImageDepth(image)
  Debug "depth: " + Str(depth)

  initCOM()

  count = countCaptureDevices()

  Debug "count: " + Str(count)

  If count > 0

    bufferlength = 1000
    *namebuffer  = AllocateMemory(bufferlength)

    If *namebuffer > 0
      getCaptureDeviceName(deviceno, *namebuffer, bufferlength)
      name$ = PeekS(*namebuffer, -1, #PB_Ascii)
      If name$ <> ""
        Debug "name: " + name$
        SetWindowTitle(#Window_0, name$)
      EndIf
    EndIf

    scp\mWidth     = width
    scp\mHeight    = height
    scp\mTargetBuf = AllocateMemory(scp\mWidth * scp\mHeight * 4)

    Debug "memory: " + Str(scp\mWidth * scp\mHeight * 4)

    If scp\mTargetBuf > 0

      If initCapture(deviceno, @scp)

        Debug "initCapture"

        Repeat

          t1 = timeGetTime_()

          If fps_timer < t1
            fps_res     = fps_counter
            fps_timer   = t1 + 1000
            fps_counter = 0
          Else
            fps_counter + 1
          EndIf

          doCapture(deviceno)

          ;While isCaptureDone(deviceno) = 0
          ;  If quit = 1
          ;    Break
          ;  EndIf
          ;  Delay(1)
          ;Wend

          If quit = 1
            Break
          EndIf

          If StartDrawing(ImageOutput(image))

            For y = 0 To scp\mHeight - 1
              For x = 0 To scp\mWidth - 1
                pixel = PeekL(scp\mTargetBuf + (y*scp\mWidth + x) * 4)
                rgb   = RGB((pixel >> 16) & $FF, (pixel >> 8) & $FF, pixel & $FF)
                ;rgb   = gray(rgb)
                Plot(x, y, rgb)
              Next
            Next

            If mx > -1 And my > -1
              Circle(mx, my, 10, RGB(255, 0, 0))
            EndIf

            DrawText(10, 10, "FPS: " + Str(fps_res), RGB(255, 0, 0))

            StopDrawing()

            SetGadgetState(#Image_0, ImageID(image))

          EndIf

          t2 = timeGetTime_()

          time = t2 - t1
          
          If time < delay
            Delay(delay - time)
          Else
            Delay(1)
          EndIf  

        Until quit = 1

        deinitCapture(deviceno)

        Debug "deinitCapture"

      EndIf

    EndIf

    If *namebuffer > 0
      FreeMemory(*namebuffer)
    EndIf

    If scp\mTargetBuf > 0
      FreeMemory(scp\mTargetBuf)
    EndIf

  EndIf

EndProcedure

Procedure capture02(temp.i)

  Protected width.l, height.l, image.i
  Protected deviceno.l, count.l, *namebuffer.i, bufferlength.l, name$
  Protected scp.SimpleCapParams
  Protected y.i, x.i, pixel.i, rgb.i
  Protected depth.i, fps_soll.i, delay.i
  Protected t1.q, t2.q, time.q

  Static fps_counter.i, fps_timer.i, fps_res.i

  deviceno = 1

  width  = 320
  height = 240

  fps_soll = 30
  delay    = 1000 / fps_soll

  image = CreateImage(#PB_Any, width, height, 24)
  SetGadgetState(#Image_1, ImageID(image))

  depth = ImageDepth(image)
  Debug "depth: " + Str(depth)

  initCOM()

  count = countCaptureDevices()

  Debug "count: " + Str(count)

  If count > 1

    bufferlength = 1000
    *namebuffer  = AllocateMemory(bufferlength)

    If *namebuffer > 0
      getCaptureDeviceName(deviceno, *namebuffer, bufferlength)
      name$ = PeekS(*namebuffer, -1, #PB_Ascii)
      If name$ <> ""
        Debug "name: " + name$
        name$ = GetWindowTitle(#Window_0) + " | " + name$
        SetWindowTitle(#Window_0, name$)
      EndIf
    EndIf

    scp\mWidth     = width
    scp\mHeight    = height
    scp\mTargetBuf = AllocateMemory(scp\mWidth * scp\mHeight * 4)

    Debug "memory: " + Str(scp\mWidth * scp\mHeight * 4)

    If scp\mTargetBuf > 0

      If initCapture(deviceno, @scp)

        Debug "initCapture"

        Repeat

          t1 = timeGetTime_()

          If fps_timer < t1
            fps_res     = fps_counter
            fps_timer   = t1 + 1000
            fps_counter = 0
          Else
            fps_counter + 1
          EndIf

          doCapture(deviceno)

          ;While isCaptureDone(deviceno) = 0
          ;  If quit = 1
          ;    Break
          ;  EndIf
          ;  Delay(1)
          ;Wend

          If quit = 1
            Break
          EndIf

          If StartDrawing(ImageOutput(image))

            For y = 0 To scp\mHeight - 1
              For x = 0 To scp\mWidth - 1
                pixel = PeekL(scp\mTargetBuf + (y*scp\mWidth + x) * 4)
                rgb   = RGB((pixel >> 16) & $FF, (pixel >> 8) & $FF, pixel & $FF)
                ;rgb   = gray(rgb)
                Plot(x, y, rgb)
              Next
            Next

            If mx > -1 And my > -1
              Circle(mx - 320, my, 10, RGB(255, 0, 0))
            EndIf

            DrawText(10, 10, "FPS: " + Str(fps_res), RGB(255, 0, 0))

            StopDrawing()

            SetGadgetState(#Image_1, ImageID(image))

          EndIf

          t2 = timeGetTime_()

          time = t2 - t1

          If time < delay
            Delay(delay - time)
          Else
            Delay(1)
          EndIf  

        Until quit = 1

        deinitCapture(deviceno)

        Debug "deinitCapture"

      EndIf

    EndIf

    If *namebuffer > 0
      FreeMemory(*namebuffer)
    EndIf

    If scp\mTargetBuf > 0
      FreeMemory(scp\mTargetBuf)
    EndIf

  EndIf

EndProcedure

Procedure capture03(temp.i)

  Protected width.l, height.l, image.i
  Protected deviceno.l, count.l, *namebuffer.i, bufferlength.l, name$
  Protected scp.SimpleCapParams
  Protected y.i, x.i, pixel.i, rgb.i
  Protected depth.i, fps_soll.i, delay.i
  Protected t1.q, t2.q, time.q

  Static fps_counter.i, fps_timer.i, fps_res.i

  deviceno = 2

  width  = 320
  height = 240

  fps_soll = 30
  delay    = 1000 / fps_soll

  image = CreateImage(#PB_Any, width, height, 24)
  SetGadgetState(#Image_2, ImageID(image))

  depth = ImageDepth(image)
  Debug "depth: " + Str(depth)

  initCOM()

  count = countCaptureDevices()

  Debug "count: " + Str(count)

  If count > 2

    bufferlength = 1000
    *namebuffer  = AllocateMemory(bufferlength)

    If *namebuffer > 0
      getCaptureDeviceName(deviceno, *namebuffer, bufferlength)
      name$ = PeekS(*namebuffer, -1, #PB_Ascii)
      If name$ <> ""
        Debug "name: " + name$
        name$ = GetWindowTitle(#Window_0) + " | " + name$
        SetWindowTitle(#Window_0, name$)
      EndIf
    EndIf

    scp\mWidth     = width
    scp\mHeight    = height
    scp\mTargetBuf = AllocateMemory(scp\mWidth * scp\mHeight * 4)

    Debug "memory: " + Str(scp\mWidth * scp\mHeight * 4)

    If scp\mTargetBuf > 0

      If initCapture(deviceno, @scp)

        Debug "initCapture"

        Repeat

          t1 = timeGetTime_()

          If fps_timer < t1
            fps_res     = fps_counter
            fps_timer   = t1 + 1000
            fps_counter = 0
          Else
            fps_counter + 1
          EndIf

          doCapture(deviceno)

          ;While isCaptureDone(deviceno) = 0
          ;  If quit = 1
          ;    Break
          ;  EndIf
          ;  Delay(1)
          ;Wend

          If quit = 1
            Break
          EndIf

          If StartDrawing(ImageOutput(image))

            For y = 0 To scp\mHeight - 1
              For x = 0 To scp\mWidth - 1
                pixel = PeekL(scp\mTargetBuf + (y*scp\mWidth + x) * 4)
                rgb   = RGB((pixel >> 16) & $FF, (pixel >> 8) & $FF, pixel & $FF)
                ;rgb   = gray(rgb)
                Plot(x, y, rgb)
              Next
            Next

            If mx > -1 And my > -1
              Circle(mx, my - 240, 10, RGB(255, 0, 0))
            EndIf

            DrawText(10, 10, "FPS: " + Str(fps_res), RGB(255, 0, 0))

            StopDrawing()

            SetGadgetState(#Image_2, ImageID(image))

          EndIf

          t2 = timeGetTime_()

          time = t2 - t1

          If time < delay
            Delay(delay - time)
          Else
            Delay(1)
          EndIf  

        Until quit = 1

        deinitCapture(deviceno)

        Debug "deinitCapture"

      EndIf

    EndIf

    If *namebuffer > 0
      FreeMemory(*namebuffer)
    EndIf

    If scp\mTargetBuf > 0
      FreeMemory(scp\mTargetBuf)
    EndIf

  EndIf

EndProcedure

If OpenWindow_Window_0()

  StickyWindow(#Window_0, 1)

  capture01TH = CreateThread(@capture01(), 0)
  capture02TH = CreateThread(@capture02(), 0)
  capture03TH = CreateThread(@capture03(), 0)
  
  ;- Event loop
  Repeat

    Event       = WaitWindowEvent(100)
    EventGadget = EventGadget()
    EventType   = EventType()
    EventWindow = EventWindow()

    mx = WindowMouseX(#Window_0)
    my = WindowMouseY(#Window_0)

    Select Event

      Case #PB_Event_Gadget

        If EventGadget = #Image_0
        EndIf

      Case #PB_Event_CloseWindow

        quit = 1

    EndSelect

    q1 = IsThread(capture01TH)
    q2 = IsThread(capture02TH)
    q3 = IsThread(capture03TH)

  Until quit = 1 And q1 = 0 And q2 = 0 And q3 = 0

EndIf

escapiClose()

End

PB v5.72 x86/x64
Windows 10 Pro 64bit
Antworten