webcambilder streamen

Für allgemeine Fragen zur Programmierung mit PureBasic.
Moxl
Beiträge: 150
Registriert: 26.10.2012 13:19

webcambilder streamen

Beitrag von Moxl »

hallo an alle :allright:

ich bin auf der suche nach einem code der die bilder von einer webcam nimmt und sie direkt in den speicher lädt.
ich habe schon ein paar codes gefunden die die bilder von einer webcam anzeigt aber keiner lädt die bilder in den speicher.

vielleicht könnt ihr mir weiter helfen?


danke schonmal :allright:
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8807
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: webcambilder streamen

Beitrag von NicTheQuick »

Was verstehst du unter "Bilder in den Speicher laden"? Du möchtest daraus einzelne Images haben, die man mit den normalen PB-Image-Befehlen bearbeiten kann?
Moxl
Beiträge: 150
Registriert: 26.10.2012 13:19

Re: webcambilder streamen

Beitrag von Moxl »

ja genau ich möchte zB alle 2 sekunden ein bild haben das dann als image geladen wird.
Moxl
Beiträge: 150
Registriert: 26.10.2012 13:19

Re: webcambilder streamen

Beitrag von Moxl »

niemand ne idee?
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: webcambilder streamen

Beitrag von ts-soft »

Moxl hat geschrieben:niemand ne idee?
Moxl hat geschrieben:ich habe schon ein paar codes gefunden die die bilder von einer webcam anzeigt aber keiner lädt die bilder in den speicher.
Was fehlt den jetzt noch? Bilder die angezeigt werden, befinden sich auch im Speicher.

Evtl. solltest Du ein neues leeres Bild erstellen und zwischen StartDrawing() und StopDrawing() das Bild darauf malen und
bearbeiten oder was auch immer.

Was Du wirklich möchtest, kann man einfach nur raten :wink:
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Moxl
Beiträge: 150
Registriert: 26.10.2012 13:19

Re: webcambilder streamen

Beitrag von Moxl »

tut mir leid ich hätte gleich ein beispielcodes hinzufügen sollen :freak:

Code: Alles auswählen

DeclareModule CamGadget
  Interface ICamGadget
    Free()
    Resize(x, y, width, height)
    GetcaphWnd()
    DlgSettings()
    SnapImage()
  EndInterface
 
  Declare New(x, y, width, height, rate.l = 30, Text.s = "My Capture Window")
EndDeclareModule

Module CamGadget
  EnableExplicit
 
  Structure Class
    *vTable
    ID.i
    hWndC.i
  EndStructure
   
  Define DLL

  Prototype capCreateCaptureWindow(lpszWindowName.p-Unicode, dwStyle.l, x.l, y.l, nWith.l, nHeigth.l, hWnd.i, nID.l)
 
  Global capCreateCaptureWindow.capCreateCaptureWindow
 
  DLL = OpenLibrary(#PB_Any, "avicap32.dll")
 
  If DLL
    capCreateCaptureWindow =  GetFunction(DLL, "capCreateCaptureWindowW")
  EndIf
 
  Procedure New(x, y, width, height, rate.l = 30, Text.s = "My Capture Window")
    Protected *obj.Class
   
    *obj = AllocateMemory(SizeOf(Class))
    If *obj
      With *obj
        \vTable = ?vTable
        \ID = ContainerGadget(#PB_Any, x, y, width, height)
        CloseGadgetList()
        HideGadget(\ID, #True)
        \hWndC = capCreateCaptureWindow(Text,  #WS_CHILD | #WS_VISIBLE, 0, 0, width, height, GadgetID(\ID), \ID)
        If \hWndC
          SendMessage_(\hWndC, #WM_CAP_DRIVER_CONNECT, 0, 0)
          SendMessage_(\hWndC, #WM_CAP_SET_PREVIEWRATE, rate, 0)
          SendMessage_(\hWndC, #WM_CAP_SET_PREVIEW, #True, 0)
          SendMessage_(\hWndC, #WM_CAP_SET_SCALE, #True, 0)
          HideGadget(\ID, #False)
         
          ProcedureReturn *obj
        Else
          FreeGadget(\ID)
          FreeMemory(*obj)
         
          ProcedureReturn #False
        EndIf
      EndWith
    EndIf
  EndProcedure
   
  Procedure Free(*obj.Class)
      If *obj
        With *obj
          SendMessage_(\hWndC, #WM_CAP_STOP, 0, 0)
          SendMessage_(\hWndC, #WM_CAP_DRIVER_DISCONNECT, 0, 0)
          DestroyWindow_(\hWndC)
          FreeGadget(\ID)
        EndWith
        FreeMemory(*obj)
      EndIf
  EndProcedure

  Procedure Resize(*obj.Class, x, y, width, height)
    If *obj
      With *obj
        ResizeGadget(\ID, x, y, width, height)
        MoveWindow_(\hWndC, 0, 0, width, height, #True)
      EndWith
    EndIf
  EndProcedure
 
  Procedure GetcaphWnd(*obj.Class)
    If *obj
      ProcedureReturn *obj\hWndC
    EndIf
  EndProcedure
 
  Procedure DlgSettings(*obj.Class)
    If *obj
      SendMessage_(*obj\hWndC, #WM_CAP_DLG_VIDEOSOURCE, 0, 0)
    EndIf
  EndProcedure
 
  Procedure SnapImage(*obj.Class)
    If *obj
      SendMessage_(*obj\hWndC, #WM_CAP_EDIT_COPY, 0, 0)
      ProcedureReturn GetClipboardImage(#PB_Any, 32)
    EndIf
  EndProcedure
 
  DataSection
    vTable:
    Data.i @Free()
    Data.i @Resize()
    Data.i @GetcaphWnd()
    Data.i @DlgSettings()
    Data.i @SnapImage()
  EndDataSection
EndModule

CompilerIf #PB_Compiler_IsMainFile
  EnableExplicit
 
  Enumeration
    #btnSettings
    #btnSnap
    #imgSnap
  EndEnumeration
 
  Define myCam.CamGadget::ICamGadget
  Define img
   
  OpenWindow(0, #PB_Ignore, #PB_Ignore, 800, 410, "Webcam Example", #PB_Window_SizeGadget | #PB_Window_SystemMenu)
  myCam = CamGadget::New(10, 10, 640, 360)
 
  ButtonGadget(#btnSettings, 10, 380, 80, 20, "Settings")
  ButtonGadget(#btnSnap, 100, 380, 80, 20, "Snapshot")
  ImageGadget(#imgSnap, WindowWidth(0) - 105, 10, 100, 100, 0, #PB_Image_Border)
 
  Repeat
    Select WaitWindowEvent()
      Case #PB_Event_CloseWindow
        myCam\Free()
        Break
     
      Case #PB_Event_SizeWindow
        myCam\Resize(#PB_Ignore, #PB_Ignore, WindowWidth(0) - 120, WindowHeight(0) - 50)
        ResizeGadget(#btnSettings, #PB_Ignore, WindowHeight(0) - 30, #PB_Ignore, #PB_Ignore)
        ResizeGadget(#btnSnap, #PB_Ignore, WindowHeight(0) - 30, #PB_Ignore, #PB_Ignore)
        ResizeGadget(#imgSnap, WindowWidth(0) - 105, #PB_Ignore, #PB_Ignore, #PB_Ignore)
       
      Case #PB_Event_Gadget
       
        Select EventGadget()
          Case #btnSettings
            myCam\DlgSettings()
           
          Case #btnSnap
            img = myCam\SnapImage()
            ResizeImage(img, 100, 100)
            SetGadgetState(#imgSnap, ImageID(img))
           
        EndSelect
    EndSelect
  ForEver
CompilerEndIf
das ist jetzt ein code den ich gefunden habe wo mein webcam bild direkt angezeigt wird... aber leider finde ich dort nirgends die möglichkeit wie man das fenster quasi gar nicht erst aufruft um die bilder dort anzuzeigen sondern das die bilder in einer speicheradresse aufgerufen werden.

Vielleicht kann mir das einer einfacher umschreiben weil ich blick da nich wirklich durch :freak:
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: webcambilder streamen

Beitrag von ts-soft »

Moxl hat geschrieben:Vielleicht kann mir das einer einfacher umschreiben weil ich blick da nich wirklich durch :freak:
Ich blick da auch nicht durch :mrgreen:
Wie wäre es mit HideWindow?
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Moxl
Beiträge: 150
Registriert: 26.10.2012 13:19

Re: webcambilder streamen

Beitrag von Moxl »

hm joa ist leider nich ganz das was ich wollte :mrgreen:
Benutzeravatar
langinagel
Beiträge: 30
Registriert: 03.08.2005 21:06
Computerausstattung: AMD-Krücke 8GB / Lubuntu 18.04
core i3 / 4GB / 1TB / Ubuntu 16.04
und noch paar alte Schinken
Wohnort: Germ-any
Kontaktdaten:

Re: webcambilder streamen

Beitrag von langinagel »

Ich habe hier im Forum schon vor einiger Zeit gesucht und einen Code gefunden, der unter Windows funktionierte.
Der hat die Webcam aufgerufen, die Daten in den Zwischenspeicher geladen und von dort als JPEG abgespeichert.
Zugegeben: ich suchte eher einen einfachen Framegrabber, das funktionierte auch ganz gut.
Fuer den Code muss ich im anderen Windows-Rechner schauen, welcher Code derjenige funzende war.
Kommt noch.
Wie du eine dauerhafte Abtastung mit stream-output hinbekommst ueberlasse ich dann Dir.

VG
LN
https://www.doerpsoft.org

Boost. Work. Efficiency.

AMD-Krücke mit Lubuntu-18.04 / iCore7 mit Win10-64
Benutzeravatar
langinagel
Beiträge: 30
Registriert: 03.08.2005 21:06
Computerausstattung: AMD-Krücke 8GB / Lubuntu 18.04
core i3 / 4GB / 1TB / Ubuntu 16.04
und noch paar alte Schinken
Wohnort: Germ-any
Kontaktdaten:

Re: webcambilder streamen

Beitrag von langinagel »

Nach einiger Suche und etwas Herumprobieren:

Code: Alles auswählen

#WM_CAP_START = #WM_USER
#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_EDIT_COPY = #WM_CAP_START + 30
#WM_CAP_FILE_SAVEDIBA = #WM_CAP_START + 25
#WM_CAP_GRAB_FRAME = #WM_CAP_START + 60
#WM_CAP_SET_PREVIEW = #WM_CAP_START + 50
#WM_CAP_SET_PREVIEWRATE = #WM_CAP_START + 52
#WM_CAP_STOP = #WM_CAP_START + 68

Global hWndC

Procedure snapshot(number.w)
  Protected nu.s
  nu = RSet(Str(number),4,"0")
  SendMessage_(hWndC, #WM_CAP_GRAB_FRAME, 0, 0)
  SendMessage_(hWndC, #WM_CAP_FILE_SAVEDIBA, 0, "C:\Users\Thorsten\Documents\snapshot"+nu+".bmp")
EndProcedure

If OpenWindow(0, 0, 0, 660, 500, "Video capture", #PB_Window_ScreenCentered | #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget)
 
  ; to hide the window use HideWindow(0, 1)
  ;HideWindow(0, 1)
 
  ; to run minimized in taskbar use  ShowWindow_(WindowID(0),#SW_SHOWMINIMIZED)
  ;ShowWindow_(WindowID(0),#SW_SHOWMINIMIZED)
 
  If OpenLibrary(0, "C:\WINDOWS\system32\avicap32.dll")
    *capAddress = GetFunction(0, "capCreateCaptureWindowA")
    hWndC = CallFunctionFast(*capAddress, 0, #WS_CHILD, 10, 10, 640, 480, WindowID(0),1)
    SendMessage_(hWndC, #WM_CAP_DRIVER_CONNECT, 0, 0)
    SendMessage_(hWndC, #WM_CAP_SET_PREVIEW, #False, 0)
    SendMessage_(hWndC, #WM_CAP_SET_PREVIEWRATE, 15, 0)
    ; for saving in other formats
    ;CreateImage(0, 320, 240);
  EndIf
EndIf

; get initial snapshot
snapshot(0)

; get starting point for time count
startCount = GetTickCount_()

; frequency of snapshot in milliseconds (I'll use 10 seconds here)
snapFrequency = 5000

; run progarm for 30 seconds
endCount = startCount + 30000
I=0
Repeat
  Event = WaitWindowEvent()
 I=I+1
  currentTick = GetTickCount_()
 
  If currentTick > endCount ; end program
    ; take final snapshot before closing
    snapshot(I)
    quit = #True
  ElseIf currentTick > startCount + snapFrequency ; take snapshot
    startCount = currentTick
    snapshot(I)
  EndIf
 
  If Event = #PB_Event_CloseWindow
        quit = #True
  EndIf
 
Until quit = #True

SendMessage_(hWndC, #WM_CAP_STOP, 0, 0)
SendMessage_(hWndC, #WM_CAP_DRIVER_DISCONNECT, 0, 0)
DestroyWindow_(hWndC)
CloseLibrary(0)

End
Dieser Code verwendet hauptsächlich die #WM_CAP_FILE_SAVEDIBA Funktion, die #WM_CAP_GRAB_FRAME funktionierte bei mir in einem Code vom Oktober 2012 auch mit DrawImage.
Im Moment macht jener Code Zicken bei mir mit Imageoutput. Könnte an der Weiterentwicklung des Compilers liegen oder am Wetter oder was weiß ich jetzt.

Viele Grüße
LN
https://www.doerpsoft.org

Boost. Work. Efficiency.

AMD-Krücke mit Lubuntu-18.04 / iCore7 mit Win10-64
Antworten