Seite 4 von 7

Re: 3 webcams

Verfasst: 17.12.2010 12:25
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

Re: 3 webcams

Verfasst: 17.12.2010 17:24
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:

Re: 3 webcams

Verfasst: 17.12.2010 20:07
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.

Re: 3 webcams

Verfasst: 18.12.2010 10:25
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

Re: 3 webcams

Verfasst: 18.12.2010 18:58
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.

Re: 3 webcams

Verfasst: 18.12.2010 19:29
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

Re: 3 webcams

Verfasst: 18.12.2010 22:57
von jojo1541
poste mal den Code, dann können wir dir helfen.

Ansonsten kann ich nur die gute alte Zauberkugel benutzen.^^
Bild

Re: 3 webcams

Verfasst: 19.12.2010 11:29
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 );

Re: 3 webcams

Verfasst: 19.12.2010 12:33
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


Re: 3 webcams

Verfasst: 19.12.2010 13:19
von Blackskyliner
Wenn das ganze gut läuft wäre der Code ja mal was für die Tipps und Tricks Sektion :allright: