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 »

Also soweit läuft alles super! die bilder werden in threads auf die imagegadgets gebannt und es läuft auf jeden fall schneller! jetzt hab ich nur das problem, dass ich ständig weiße störbilder habe die zwischen drin eingestreut sind. Es blitzt sozusagen! wisst ihr an was das liegen könnte? muss ich eine abfrage einbauen, die checkt ob das bild nicht weiß ist? wobei ich natürlich auch nicht weiß ob es ein "reinweißes" bild ist!

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:jetzt hab ich nur das problem, dass ich ständig weiße störbilder habe
Egal wo ich hin schaue hier ist auch alles voll mit so komischen weißen Pixeln kommen immer von oben in das Bild rein und sammeln sich an der unteren Bildkannte. :lol:
PS. meine vielen Fehler der Rechtschreibung auf dem Forum könnt Ihr gerne ignorieren.
Benutzeravatar
jojo1541
Beiträge: 431
Registriert: 15.09.2007 17:12
Wohnort: Irgendwo im Nirgendwo

Re: 3 webcams

Beitrag von jojo1541 »

xD (srry, wollt nur was schreiben)

Noch was zum Thema: Wie wie läuft das denn mit imagegadget neu befüllen und den Bildern, die die Kameras pro sek abgeben?
Könnte ja evtl. sein, dass du "leerbilder" abgreifst, weil die Kameras grad erst noch ein neues reinstellen.
Ich verkaufe Rechtschreibfehler und jede menge GROßBUCHSTABEN. Alles unbegrenzt zu haben.
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 »

laut internet hat sie eine maximale framerate von 30fps! allerdings weiß ich nicht wie ich das synchronisieren soll! ich meine dadurch dass ich den output jetzt seperat in einem thread habe geht das wesentlich schneller! soll ech dann etwa eine abfrage machen ob sich der buffer verändert hat?
also etwas in der art
if(PokeS(*buffer,kompletteLänge) <> oldBufferContent) --> oldbufercontent = PokeS(*buffer,kompletteLänge)

oder reicht es wenn ich das verändern eines einzelnen bytes abfgrage um zu checken ob sich quasi ein pixel verändert hat?

mfg deify
Windows 7 | 64bit | PureBasic 4.51 (x64/x86)
Benutzeravatar
jojo1541
Beiträge: 431
Registriert: 15.09.2007 17:12
Wohnort: Irgendwo im Nirgendwo

Re: 3 webcams

Beitrag von jojo1541 »

Du könntest bei 30 fps jeweils im Thread einen Timer verwenden, der eben 30 mal pro Sekunde den Buffer auslesen lässt. Dann hättest du das soweit synchron gehalten.
Ich verkaufe Rechtschreibfehler und jede menge GROßBUCHSTABEN. Alles unbegrenzt zu haben.
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 »

läuft! ich habs mit elapsedmilliseconds gemacht und wenn ichs auf 25 fps also 40 milliseconds pro bild runterregel sind keine störbilder mehr da! komischerweiße werden meine buffer aber anscheinend vertauscht! immerwieder blinkt das bild von der einen cam in der anderen auf! obwohl ich extra 2 buffer definiert habe
Windows 7 | 64bit | PureBasic 4.51 (x64/x86)
Benutzeravatar
jojo1541
Beiträge: 431
Registriert: 15.09.2007 17:12
Wohnort: Irgendwo im Nirgendwo

Re: 3 webcams

Beitrag von jojo1541 »

poste mal den Code, dann können wir dir helfen.

Ansonsten kann ich nur die gute alte Zauberkugel benutzen.^^
Bild
Ich verkaufe Rechtschreibfehler und jede menge GROßBUCHSTABEN. Alles unbegrenzt zu haben.
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 »

also include ist die escapi.pbi die hier ja schon zu massen gepostet ist! und dann eben dieser code! ich habe keinen plan woran das mit de buffern liegt! vielleicht weil sie alle 3 nacheinander angelegt werden und auch gleich groß sind... wer weiß

Code: Alles auswählen

 EnableExplicit

UseTGAImageDecoder()

IncludeFile "escapi.pbi"

Structure TGA_HEADER

  identsize.a
  colourmaptype.a
  imagetype.a

  colourmapstart.u
  colourmaplength.u
  colourmapbits.a
 
  xstart.u
  ystart.u
  width.u
  height.u
  bits.a
  descriptor.a
 
  ; pixel data follows header
 
EndStructure
Global quit

Define deviceno.l, version.l, count.l, *namebuffer.i, bufferlength.l, name$
Define width, height, *pImage0.i, *pImage1.i, *pImage2.i
Define header.TGA_HEADER
Define scp0.SimpleCapParams, scp1.SimpleCapParams, scp2.SimpleCapParams

Global currentDeviceno
Global currentBuffer

deviceno = 0

width  = 320
height = 240

Procedure output0(buffer)
  Protected StartTime=-1
  Repeat
     If StartTime = -1
       StartTime = ElapsedMilliseconds()
     EndIf
    If quit = 0 And ElapsedMilliseconds()-StartTime>40
      StartTime = -1
      doCapture(0)
      CatchImage(0, buffer)
      SetGadgetState(0, ImageID(0))
    EndIf 
  Until quit
  deinitCapture(0)
EndProcedure
Procedure output1(buffer)
  Protected StartTime=-1
  Repeat
    If StartTime = -1
      StartTime = ElapsedMilliseconds()
    EndIf
    If quit = 0 And ElapsedMilliseconds()-StartTime>40
      StartTime = -1
      doCapture(1)
      CatchImage(1, buffer)
      SetGadgetState(1, ImageID(1))
      Delay(10)
    EndIf 
  Until quit
  deinitCapture(1)
EndProcedure
Procedure output2(buffer)
  Protected StartTime=-1
  Repeat
    If StartTime = -1
      StartTime = ElapsedMilliseconds()
    EndIf
    If quit = 0 And ElapsedMilliseconds()-StartTime>40
      StartTime = -1
      doCapture(2)
      CatchImage(2, buffer)
      SetGadgetState(2, ImageID(2))
      Delay(10)
    EndIf 
  Until quit
  deinitCapture(2)
EndProcedure

      

If escapiOpen()

  version = ESCAPIDLLVersion()

;   Debug "version: $" + RSet(Hex(version), 4, "0")

  initCOM()

  count = countCaptureDevices()

;   Debug "count: " + Str(count)

  If count > 0

    *namebuffer  = AllocateMemory(1000)
    bufferlength = 1000

    getCaptureDeviceName(deviceno, *namebuffer, bufferlength)

    If *namebuffer > 0
      name$ = PeekS(*namebuffer, -1, #PB_Ascii)
;       Debug "name: " + name$
    EndIf

    header\imagetype = 2
    header\width     = width
    header\height    = height
    header\bits      = 32
    header\descriptor = %11110100

    *pImage0 = AllocateMemory(width * height * 4 + SizeOf(TGA_HEADER))
    *pImage1 = AllocateMemory(width * height * 4 + SizeOf(TGA_HEADER))
    *pImage2 = AllocateMemory(width * height * 4 + SizeOf(TGA_HEADER))

    CopyMemory(@header, *pImage0, SizeOf(TGA_HEADER))
    CopyMemory(@header, *pImage1, SizeOf(TGA_HEADER))
    CopyMemory(@header, *pImage2, SizeOf(TGA_HEADER))

    scp0\mWidth     = width
    scp0\mHeight    = height
    scp0\mTargetBuf = *pImage0 + SizeOf(TGA_HEADER)
    scp1\mWidth     = width
    scp1\mHeight    = height
    scp1\mTargetBuf = *pImage1 + SizeOf(TGA_HEADER)
    scp2\mWidth     = width
    scp2\mHeight    = height
    scp2\mTargetBuf = *pImage2 + SizeOf(TGA_HEADER)

;     If initCapture(deviceno, @scp)

;       Debug "cap init successful"

      OpenWindow(0, 450, 200, 3*width, height+50, name$, #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_TitleBar)
      ImageGadget(0, 0, 0, width, height, 0)
      ImageGadget(1, width, 0, width, height, 0)
      ImageGadget(2, 2*width, 0, width, height, 0)
      ButtonGadget(3,width/2-width/4,height+10,width/2,30,"activate cam 1")
      ButtonGadget(4,width/2-width/4+width,height+10,width/2,30,"activate cam 2")
      ButtonGadget(5,width/2-width/4+2*width,height+10,width/2,30,"activate cam 3")

      CreateImage(0, width, height)
      SetGadgetState(0, ImageID(0))
      CreateImage(1, width, height)
      SetGadgetState(1, ImageID(1))
      CreateImage(2, width, height)
      SetGadgetState(2, ImageID(2))
      
      

      Repeat
        Select WaitWindowEvent(1)
          Case #PB_Event_CloseWindow
            quit = 1
          Case #PB_Event_Gadget
            Select EventGadget()
              Case 3
                If initCapture(0,@scp0)
                  CreateThread(@output0(),*pImage0)
                EndIf
              Case 4
                If initCapture(1,@scp1)
                  CreateThread(@output1(),*pImage1)
                EndIf
              Case 5
                If initCapture(2,@scp2)
                  CreateThread(@output2(),*pImage2)
                EndIf
            EndSelect   
        EndSelect    
        Delay(10)
      Until quit = 1


;     Else
; 
;       Debug "init capture failed!"
; 
;     EndIf

    If *namebuffer > 0
      FreeMemory(*namebuffer)
    EndIf

    If *pImage0 > 0
      FreeMemory(*pImage0)
    EndIf
        If *pImage1 > 0
      FreeMemory(*pImage1)
    EndIf
        If *pImage2 > 0
      FreeMemory(*pImage2)
    EndIf

  EndIf

  escapiClose()

Else

  MessageRequester("example", "DLL 'escapi.dll' nicht vorhanden!")

EndIf

End
irgendwie ist es auch manchmal mehr manchmal weniger );
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 - »

@deify
Wenn ich deinen Code verwende flackert es und ich habe eine CPU-Belastung von 100%.

Beim Beenden des Programms kommt es manchmal zu dieser Fehlermeldung:
[11:52:02] [ERROR] test01.pb (Zeile: 55)
[11:52:02] [ERROR] Ungültiger Speicherzugriff. (Lesefehler an der Adresse 268443504)
[11:52:02] Die Programmausführung ist abgeschlossen.

Das flackern wird wohl hiermit zusammen hängen (32bit Bilder):
http://www.purebasic.fr/german/viewtopi ... e+flackern

-----------------------------------------------

Hier hab ich nochmal einen Code mit Thread,
damit komme ich auf FPS: 500 ohne Flackern.

Ich verwende aber wieder StartDrawing um
aus dem Kamerabild ein 24Bit Bild zu erstellen:

Code: Alles auswählen


EnableExplicit

UseTGAImageDecoder()

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_Gadget_0
EndEnumeration

;- Image
Enumeration
  #Image_Start
  #Image_Capture
  #Image_Copy
EndEnumeration

;- Structure
Structure TGA_HEADER
  imageid.a
  colourmaptype.a
  imagetype.a
  colourmapstart.u
  colourmaplength.u
  colourmapbits.a
  xstart.u
  ystart.u
  width.u
  height.u
  pixeldepth.a
  descriptor.a
EndStructure

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

;- Global
Global quit.i, q1.i, captureTH.i

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

Procedure FPSCounter()
  Protected t1.q
  Static fps.i, timer.i
  t1 = timeGetTime_()
  If timer < t1
    SetWindowTitle(#Window_0, "FPS: " + Str(fps))
    timer = t1 + 1000
    fps   = 0
  EndIf
  fps + 1
EndProcedure

Procedure capture(temp.i)

  Protected width.l, height.l, *pImage.i
  Protected deviceno.l, count.l, *namebuffer.i, bufferlength.l, name$
  Protected tgaheader.TGA_HEADER, scp.SimpleCapParams
  Protected depth.i

  deviceno = 0

  width  = 320
  height = 240

  If CreateImage(#Image_Start, width, height)
    SetGadgetState(#Image_Start, ImageID(#Image_Start))
  EndIf

  CreateImage(#Image_Copy, width, height, 24)
  depth = ImageDepth(#Image_Copy)
  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

    tgaHeader\imageid         = 0
    tgaHeader\colourmaptype   = 0
    tgaheader\imagetype       = 2
    tgaHeader\colourmapstart  = 0
    tgaHeader\colourmaplength = 0
    tgaheader\width           = width
    tgaheader\height          = height
    tgaHeader\xstart          = 0
    tgaHeader\ystart          = 0
    tgaheader\pixeldepth      = 32
    tgaheader\descriptor      = % 11110100

    *pImage = AllocateMemory(width * height * 4 + SizeOf(TGA_HEADER))

    If *pImage > 0

      CopyMemory(@tgaheader, *pImage, SizeOf(TGA_HEADER))

      scp\mWidth     = width
      scp\mHeight    = height
      scp\mTargetBuf = *pImage + SizeOf(TGA_HEADER)

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

      If initCapture(deviceno, @scp)

        Debug "initCapture"

        Repeat

          FPSCounter()

          doCapture(deviceno)

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

          If quit = 1
            Break
          EndIf

          If CatchImage(#Image_Capture, *pImage)

            StartDrawing(ImageOutput(#Image_Copy))

            DrawImage(ImageID(#Image_Capture), 0, 0)

            StopDrawing()

            ;CopyImage(#Image_Capture, #Image_Copy)
            SetGadgetState(#Image_Gadget_0, ImageID(#Image_Copy))

            ;depth = ImageDepth(#Image_Copy)
            ;Debug "depth: " + Str(depth)

          EndIf
          
          Delay(1)

        Until quit = 1

        deinitCapture(deviceno)

        Debug "deinitCapture"

      EndIf

    EndIf

    If *namebuffer > 0
      FreeMemory(*namebuffer)
    EndIf

    If *pImage > 0
      FreeMemory(*pImage)
    EndIf

  EndIf

EndProcedure

If OpenWindow_Window_0()

  StickyWindow(#Window_0, 1)

  captureTH = CreateThread(@capture(), 0)

  ;- Event loop
  Repeat

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

    Select Event

      Case #PB_Event_Gadget

        If EventGadget = #Image_Gadget_0
        EndIf

      Case #PB_Event_CloseWindow

        quit = 1

    EndSelect

    q1 = IsThread(captureTH)

  Until quit = 1 And q1 = 0

EndIf

escapiClose()

End

PB v5.72 x86/x64
Windows 10 Pro 64bit
Benutzeravatar
Blackskyliner
Beiträge: 532
Registriert: 28.07.2005 00:54
Wohnort: /home/Blackskyliner/

Re: 3 webcams

Beitrag von Blackskyliner »

Wenn das ganze gut läuft wäre der Code ja mal was für die Tipps und Tricks Sektion :allright:
Keine meiner Antworten ist endgültig, es kann passieren, dass ich den so eben geposteten Beitrag noch mehrmals ändere, um Doppelposts zu umgehen.
_________________
Purebasic Windows 7 x64 & Linux (Ubuntu 10.04LTS) 4.50[x64|x86] Nutzer
_________________
Projekte: YAED - Yet another Event Dispatcher
Antworten