Seite 1 von 2

webcambilder streamen

Verfasst: 21.02.2014 15:25
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:

Re: webcambilder streamen

Verfasst: 21.02.2014 15:34
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?

Re: webcambilder streamen

Verfasst: 21.02.2014 16:12
von Moxl
ja genau ich möchte zB alle 2 sekunden ein bild haben das dann als image geladen wird.

Re: webcambilder streamen

Verfasst: 22.02.2014 13:53
von Moxl
niemand ne idee?

Re: webcambilder streamen

Verfasst: 22.02.2014 14:01
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:

Re: webcambilder streamen

Verfasst: 22.02.2014 19:03
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:

Re: webcambilder streamen

Verfasst: 22.02.2014 19:28
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?

Re: webcambilder streamen

Verfasst: 22.02.2014 19:54
von Moxl
hm joa ist leider nich ganz das was ich wollte :mrgreen:

Re: webcambilder streamen

Verfasst: 28.09.2014 09:45
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

Re: webcambilder streamen

Verfasst: 28.09.2014 12:00
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