3 webcams

Anfängerfragen zum Programmieren mit PureBasic.
- chris -
Beiträge: 195
Registriert: 24.08.2005 19:52
Wohnort: Stadtallendorf

Re: 3 webcams

Beitrag von - chris - »

Hiermal zwei Möglichkeiten, wie man die Bilder direkt
aus dem Speicher bekommt, einmal mit einem Sprite
das zweite mit SetDIBits.

escapi.pbi

Code: Alles auswählen


; escapi.pbi
;
; http://sol.gfxile.net/escapi/index.html

Structure SimpleCapParams
  *mTargetBuf.i ; Must be at least mWidth * mHeight * SizeOf(int) of size!
  mWidth.l
  mHeight.l
EndStructure

Global escapiDLL.i

;- Prototype
PrototypeC.l ESCAPIDLLVersion()
PrototypeC.l countCaptureDevices()
PrototypeC.l deinitCapture(deviceno.l)
PrototypeC.l doCapture(deviceno.l)
PrototypeC.l getCaptureDeviceName(deviceno.l, *namebuffer.i, bufferlength.l)
PrototypeC.l initCOM()
PrototypeC.l initCapture(deviceno.l, *SimpleCapParams.i)
PrototypeC.l isCaptureDone(deviceno.l)

Procedure escapiClose()
  If escapiDLL > 0
    If IsLibrary(escapiDLL)
      CloseLibrary(escapiDLL)
    EndIf
    escapiDLL = 0
  EndIf
EndProcedure

Procedure escapiOpen()

  escapiDLL = OpenLibrary(#PB_Any, "escapi.dll")
  If escapiDLL = 0
    ProcedureReturn #False
  EndIf

  Global ESCAPIDLLVersion.ESCAPIDLLVersion=GetFunction(escapiDLL,"ESCAPIDLLVersion")
  Global countCaptureDevices.countCaptureDevices=GetFunction(escapiDLL,"countCaptureDevices")
  Global deinitCapture.deinitCapture=GetFunction(escapiDLL,"deinitCapture")
  Global doCapture.doCapture=GetFunction(escapiDLL,"doCapture")
  Global getCaptureDeviceName.getCaptureDeviceName=GetFunction(escapiDLL,"getCaptureDeviceName")
  Global initCOM.initCOM=GetFunction(escapiDLL,"initCOM")
  Global initCapture.initCapture=GetFunction(escapiDLL,"initCapture")
  Global isCaptureDone.isCaptureDone=GetFunction(escapiDLL,"isCaptureDone")

  ProcedureReturn #True
EndProcedure

Code: Alles auswählen



EnableExplicit

IncludeFile "escapi.pbi"

Define deviceno.l, version.l, count.l, *namebuffer.i, bufferlength.l, name$, quit.l
Define width, height, res.i, size.i, buffer.i, sprite.i
Define scp.SimpleCapParams

deviceno = 0

width  = 320
height = 240

If InitSprite() = 0
  End
EndIf

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

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

    If initCapture(deviceno, @scp)

      Debug "cap init successful"
            
      OpenWindow(0, 450, 200, width, height, name$, #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_TitleBar)
      OpenWindowedScreen(WindowID(0), 0, 0, width, height, 0, 0, 0)
      
      sprite = CreateSprite(#PB_Any, width, height)
           
      Repeat

        doCapture(deviceno)

        While isCaptureDone(deviceno) = 0
          If WaitWindowEvent(1) = #PB_Event_CloseWindow
            quit = 1
            Break
          EndIf
        Wend

        StartDrawing(SpriteOutput(sprite))
        buffer = DrawingBuffer()
        StopDrawing()

        CopyMemory(scp\mTargetBuf, buffer, size)

        DisplaySprite(sprite, 0, 0)
        FlipBuffers()

      Until quit = 1

      deinitCapture(deviceno)

    Else

      Debug "init capture failed!"

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

  escapiClose()

Else

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

EndIf

End

Code: Alles auswählen



EnableExplicit

IncludeFile "escapi.pbi"

Define deviceno.l, version.l, count.l, *namebuffer.i, bufferlength.l, name$, quit.l
Define width, height, size.i, image.i, hBmp.i, hdc.i
Define bmi.BITMAPINFO, scp.SimpleCapParams

deviceno = 0

width  = 320
height = 240

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

    bmi\bmiHeader\biSize        = SizeOf(BITMAPINFOHEADER)
    bmi\bmiHeader\biWidth       = width
    bmi\bmiHeader\biHeight      = - height
    bmi\bmiHeader\biPlanes      = 1
    bmi\bmiHeader\biBitCount    = 32
    bmi\bmiHeader\biCompression = #BI_RGB

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

    If initCapture(deviceno, @scp)

      Debug "cap init successful"

      image = CreateImage(#PB_Any, width, height, 32)
      hBmp  = ImageID(image)

      OpenWindow(0, 450, 200, width, height, name$, #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_TitleBar)
      ImageGadget(0, 0, 0, width, height, ImageID(image))

      Repeat

        doCapture(deviceno)

        While isCaptureDone(deviceno) = 0
          If WaitWindowEvent(1) = #PB_Event_CloseWindow
            quit = 1
            Break
          EndIf
        Wend

        hdc = StartDrawing(ImageOutput(image))
        If hdc
          SetDIBits_(hdc, hBmp, 0, height, scp\mTargetBuf, @bmi, #DIB_RGB_COLORS)
          StopDrawing()
          SetGadgetState(0, ImageID(image))
        EndIf

      Until quit = 1

      deinitCapture(deviceno)

    Else

      Debug "init capture failed!"

    EndIf

    If *namebuffer > 0
      FreeMemory(*namebuffer)
    EndIf

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

  EndIf

  escapiClose()

Else

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

EndIf

End

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 »

@Joshy: Danke für die tips! ich werde schauen ob es nötig ist, insofernmich chirs' beispiele nicht weiterbringen!

@chris: top! danke dir, allerdings weiß ich noch nicht ob es sehr viel schneller ist! ich hoffe ja! eigentlich wollte ich nämlich die startdrawing funktion loswerden und alle 3 bilder in threads gleichzeitig malen und das geht ja mit startdrawing nicht! hoffe der geschwindigkeitsunterschied reicht (: habe momentan nämlich auf meinem pc nur 18 fps und es frisst noch relastiv viele ressourcen!

hoffe es klappt! wenn nicht hoffe ich weiterhin auf eure exzelente hilfe (:

danke euch beiden!
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 »

hi leute! also ich habe die anderen beiden möglichkeiten von chris auch getestet! die sind noch langsamer :D jetzt habe ich mal eine tgaheader als structure aufgestellt! ist genau wie im internet bestätigt 18 bytes groß! so jetzt habe ich aber ein problem! ich hab KEINEN plan wie ich es vor den buffer bekommen soll!

hier mal die structure:

Code: Alles auswählen

Structure header
	idlength.b
	colourmaptype.b
	datatypecode.b
	colourmaporigin.w
	colourmaplength.w
	colourmapdepth.b
	x_origin.w
	y_origin.w
	width.w
	height.w
	bitsperpixel.b
	imagedescriptor.b
EndStructure
in einem anderen beispiel gibt es auch ein rawdata callback allerdings habe ich auch nicht geschafft dieses zu starten :D bin anscheinend zu blöd ^^

hoffe ihr könnt mir weiterhelfen!

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:bin anscheinend zu blöd ^^
oder nur "noch" etwas unwissend :lol:

"pseudo code"

Code: Alles auswählen

Structure TGA_HEADER
   idlength.b ; 1
   colourmaptype.b ;2
   datatypecode.b; 3
   colourmaporigin.w; 5
   colourmaplength.w; 7
   colourmapdepth.b; 8
   x_origin.w; 10
   y_origin.w; 12
   width.w; 14
   height.w; 16
   bitsperpixel.b ;17
   imagedescriptor.b; 18
EndStructure

pImage.l = AllocateMemory (Width * Height * 4 + SizeOf(TGA_HEADER))
scp.SimpleCapParams
scp\mWidth = Width
scp\mHeight = Height
scp\mTargetBuf = pImage + SizeOf(TGA_HEADER) ; Erste Addresse nach dem Header  

; jetzt den header mit den !!! RICHTIGEN !!! Werten füllen
pokeB pImage+0, idlength ;(byte)
pokeB pImage+1, colourmaptype ;(byte)
pokeB pImage+2, datatypecode ;(byte)
pokeW pImage+3, colourmaporigin ;(word)
pokeW pImage+5, colourmaplength ;(word)
pokeB pImage+7, colourmapdepth ;(byte)
pokeW pImage+8, x_origin ;(word)
pokeW pImage+10, y_origin ;(word)
pokeW pImage+12, width ;(word)
pokeW pImage+14, height ;(word)
pokeB pImage+16, bitsperpixel ;(byte)
pokeB pImage+17, imagedescriptor ;(byte)

; Image erstellen
; UseTGAImageDecoder() 
...
; Bilder von Kamera holen
...
CatchImage(#Image, pImage) 
...
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 »

Soetwas in der art hatte ich mir gedacht (: wusste blos nicht so recht wie ich den buffer davor bekommen sollte und welche werte ich als "offset" dazuaddieren muss um den header zu schreiben (: so gesehen ist es ja relativ klar (:

danke dir! hoffe es klappt ansonsten werde ich wohl bei der "low-fps"-methode bleiben

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 »

Ich habe keine Ahnung wie Deine PureBasic Version mit dem Alphachannel eines TGA Images umgeht.
Solltest Du nichts sehen dann kann es z.B. sein das Du nicht den gewümschnten Header "gepokt" hast
oder eine 0 für Alpha im Kamerabild Transparent ist.

Ich weiss z.Z. auch nicht ob eine 255 oder eine 0 im Alphabyte durchsichtig bzw. deckend ist.
Da hilft Dir aber bestimmt google weiter.

Kann auch sein das PB den Alphachannel völlig ignoriert bzw. nur bei Texturen benutzt.

Wie schon gesagt "ich nix wissen"

Transparente 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 »

hi! also ich hab das erstmal so umgesetzt / es versucht
dazu folgende prozedur erstellt:

Code: Alles auswählen

Procedure writeHeader(pImage)
  PokeB(pImage+0, 0) ;(byte)
  PokeB(pImage+1, 0);(byte)
  PokeB(pImage+2, 2) ;(byte)
  PokeW(pImage+3, 0) ;(word)
  PokeW(pImage+5, 0) ;(word)
  PokeB(pImage+7, 0) ;(byte)
  PokeW(pImage+8, 0) ;(word)
  PokeW(pImage+10, 0) ;(word)
  PokeW(pImage+12, 320) ;(word)
  PokeW(pImage+14, 240) ;(word)
  PokeB(pImage+16, 24) ;(byte)
  PokeB(pImage+17, 0) ;(byte)
EndProcedure
ob die richtig ist weiß ich nicht :D

dann dein oben geschriebenes allocate verwendet und schließlich das hier

Code: Alles auswählen

       writeHeader(pImage)
       UseTGAImageDecoder()
       image0 = CatchImage(#PB_Any,pImage,Width * Height * 4 + SizeOf(tgaHeader))
       SetGadgetData(0,image0)
ausführen lassen! allerdings kommt da schon bei catchimage eine fehlermeldung, und zwar ein invalid memory access ^^

hoffe das liegt nicht am header :D
Windows 7 | 64bit | PureBasic 4.51 (x64/x86)
Benutzeravatar
HeX0R
Beiträge: 2960
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win10 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2
Kontaktdaten:

Re: 3 webcams

Beitrag von HeX0R »

An welcher Stelle wird denn das Bild in deinen Puffer geschoben?
Kannst du mal deinen gegenwärtigen Stand irgendwie so kurz wie möglich in einen Code pressen?
Da blickt doch keiner mehr durch...

Ausserdem finde ich es völlig pervers, erst eine Struktur zu definieren,
und sie später überhaupt nicht zu benutzen und statt dessen wild umherzupoken...
- chris -
Beiträge: 195
Registriert: 24.08.2005 19:52
Wohnort: Stadtallendorf

Re: 3 webcams

Beitrag von - chris - »

So jetzt das ganze mit TGA_HEADER:

Code: Alles auswählen


; escapi.pbi
;
; http://sol.gfxile.net/escapi/index.html

Structure SimpleCapParams
  *mTargetBuf.i ; Must be at least mWidth * mHeight * SizeOf(int) of size!
  mWidth.l
  mHeight.l
EndStructure

Global escapiDLL.i

;- Prototype
PrototypeC.l ESCAPIDLLVersion()
PrototypeC.l countCaptureDevices()
PrototypeC.l deinitCapture(deviceno.l)
PrototypeC.l doCapture(deviceno.l)
PrototypeC.l getCaptureDeviceName(deviceno.l, *namebuffer.i, bufferlength.l)
PrototypeC.l initCOM()
PrototypeC.l initCapture(deviceno.l, *SimpleCapParams.i)
PrototypeC.l isCaptureDone(deviceno.l)

Procedure escapiClose()
  If escapiDLL > 0
    If IsLibrary(escapiDLL)
      CloseLibrary(escapiDLL)
    EndIf
    escapiDLL = 0
  EndIf
EndProcedure

Procedure escapiOpen()

  escapiDLL = OpenLibrary(#PB_Any, "escapi.dll")
  If escapiDLL = 0
    ProcedureReturn #False
  EndIf

  Global ESCAPIDLLVersion.ESCAPIDLLVersion=GetFunction(escapiDLL,"ESCAPIDLLVersion")
  Global countCaptureDevices.countCaptureDevices=GetFunction(escapiDLL,"countCaptureDevices")
  Global deinitCapture.deinitCapture=GetFunction(escapiDLL,"deinitCapture")
  Global doCapture.doCapture=GetFunction(escapiDLL,"doCapture")
  Global getCaptureDeviceName.getCaptureDeviceName=GetFunction(escapiDLL,"getCaptureDeviceName")
  Global initCOM.initCOM=GetFunction(escapiDLL,"initCOM")
  Global initCapture.initCapture=GetFunction(escapiDLL,"initCapture")
  Global isCaptureDone.isCaptureDone=GetFunction(escapiDLL,"isCaptureDone")

  ProcedureReturn #True
EndProcedure

Code: Alles auswählen


EnableExplicit

UseTGAImageDecoder()

IncludeFile "escapi.pbi"

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

  ; pixel data follows header

EndStructure

Define deviceno.l, version.l, count.l, *namebuffer.i, bufferlength.l, name$, quit.l
Define width, height, *pImage.i
Define tgaheader.TGA_HEADER, scp.SimpleCapParams

deviceno = 0

width  = 320
height = 240

If escapiOpen()

  version = ESCAPIDLLVersion()

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

  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)
      Debug "name: " + name$
    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

    ; tgaHeader\descriptor := %11110100
    ; ^^^^^^^^
    ; ||||||||
    ; |||||||+--- muss Null sein
    ; ||||||+---- muss Null sein
    ; |||||+----- vertikale Lage des
    ; ||||| Nullpunkts
    ; ||||| (0 = unten, 1 = oben)
    ; ||||+------ horizontale Lage des
    ; |||| Nullpunkts
    ; |||| (0 = links, 1 = rechts)
    ; ||||
    ; +-- Alpha Bit } Bits 1..4
    ; +--- Rot Bit } geben an ob
    ; +---- Gruen Bit } ein Bit pro
    ; +----- Blau Bit } Farbe da ist

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

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

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

    If initCapture(deviceno, @scp)

      Debug "cap init successful"

      OpenWindow(0, 450, 200, width, height, name$, #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_TitleBar)
      ImageGadget(0, 0, 0, width, height, 0)

      CreateImage(0, 320, 420)
      SetGadgetState(0, ImageID(0))

      Repeat

        doCapture(deviceno)

        While isCaptureDone(deviceno) = 0
          If WaitWindowEvent(1) = #PB_Event_CloseWindow
            quit = 1
            Break
          EndIf
        Wend

        CatchImage(0, *pImage)

        SetGadgetState(0, ImageID(0))

      Until quit = 1

      deinitCapture(deviceno)

    Else

      Debug "init capture failed!"

    EndIf

    If *namebuffer > 0
      FreeMemory(*namebuffer)
    EndIf

    If *pImage > 0
      FreeMemory(*pImage)
    EndIf

  EndIf

  escapiClose()

Else

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

EndIf

End

Zuletzt geändert von - chris - am 16.12.2010 21:28, 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 »

erstmal sry für die vielen umstände!

und dann ein DANKE and alle die mir geholfen haben (: ich weiß ich muss bezüglich vieler sachen noch einiges lernen :D aber trotz danke für eure geduld!

Denke mal den rest des projekts sollte ich noch selber schaffen (:


mfg deify
Windows 7 | 64bit | PureBasic 4.51 (x64/x86)
Antworten