Webcam

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
Xaby
Beiträge: 2144
Registriert: 12.11.2005 11:29
Wohnort: Berlin + Zehdenick
Kontaktdaten:

Beitrag von Xaby »

Wieso kann ich die 2D-Befehle nicht benutzen?

Scheinbar liefert

Code: Alles auswählen

 Link = GetClipboardData(#PB_ClipboardImage)
kein reines Image zurück. DrawImage() geht gerade noch, aber
IsImage() meint als antwort NULL

und alle anderen Operationen aus dem 2D-Zeichenbereich bringen mein Programm zum Absturz.

Ich würd gern aus dem Bild von der Kamera ein Sprite machen und später auch DrawingBuffer() und so nutzen können.
Ich glaub, mein Vorhaben wird sonst zu langsam.

Helft ihr mir bitte? Wäre lieb :roll:
Kinder an die Macht http://scratch.mit.edu/
Benutzeravatar
Falko
Admin
Beiträge: 3535
Registriert: 29.08.2004 11:27
Computerausstattung: PC: MSI-Z590-GC; 32GB-DDR4, ICore9; 2TB M2 + 2x3TB-SATA2 HDD; Intel ICore9 @ 3600MHZ (Win11 Pro. 64-Bit),
Acer Aspire E15 (Win11 Home X64). Purebasic LTS 6.11b1
HP255G8 Notebook @AMD Ryzen 5 5500U with Radeon Graphics 2.10 GHz 3.4GHz, 32GB_RAM, 3TB_SSD (Win11 Pro 64-Bit)
Kontaktdaten:

Beitrag von Falko »

Sorry, das ich mich nach deiner PN noch nicht gemeldet habe.
Ich versuche schon die ganze Zeit das Idiotensichere IsImage() zu verstehen.
Theoretisch sollte das Ergebnis @Link eine gültige ImageID sein. Warum
aber IsImage mit "0" darauf reagiert wundert mich auch. Obwohl ich damit alles machen kann, wenn ich DrawImage() benutze.

Gruß Falko
Bild
Win11 Pro 64-Bit, PB_6.11b1
Benutzeravatar
Falko
Admin
Beiträge: 3535
Registriert: 29.08.2004 11:27
Computerausstattung: PC: MSI-Z590-GC; 32GB-DDR4, ICore9; 2TB M2 + 2x3TB-SATA2 HDD; Intel ICore9 @ 3600MHZ (Win11 Pro. 64-Bit),
Acer Aspire E15 (Win11 Home X64). Purebasic LTS 6.11b1
HP255G8 Notebook @AMD Ryzen 5 5500U with Radeon Graphics 2.10 GHz 3.4GHz, 32GB_RAM, 3TB_SSD (Win11 Pro 64-Bit)
Kontaktdaten:

Beitrag von Falko »

So könnte man ein gültiges Image bekommen. (PB4Beta10)

Code: Alles auswählen

#WM_CAP_START = #WM_USER
#WM_CAP_UNICODE_START = #WM_USER +100
#WM_CAP_PAL_SAVEA = #WM_CAP_START + 81
#WM_CAP_PAL_SAVEW = #WM_CAP_UNICODE_START + 81
#WM_CAP_UNICODE_END = #WM_CAP_PAL_SAVEW
#WM_CAP_ABORT = #WM_CAP_START + 69
#WM_CAP_DLG_VIDEOCOMPRESSION = #WM_CAP_START + 46
#WM_CAP_DLG_VIDEODISPLAY = #WM_CAP_START + 43
#WM_CAP_DLG_VIDEOFORMAT = #WM_CAP_START + 41
#WM_CAP_DLG_VIDEOSOURCE = #WM_CAP_START + 42
#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_DRIVER_GET_NAMEA = #WM_CAP_START + 12
#WM_CAP_DRIVER_GET_NAMEW = #WM_CAP_UNICODE_START + 12
#WM_CAP_DRIVER_GET_VERSIONA = #WM_CAP_START + 13
#WM_CAP_DRIVER_GET_VERSIONW = #WM_CAP_UNICODE_START + 13
#WM_CAP_EDIT_COPY = #WM_CAP_START + 30
#WM_CAP_END = #WM_CAP_UNICODE_END
#WM_CAP_FILE_ALLOCATE = #WM_CAP_START + 22
#WM_CAP_FILE_GET_CAPTURE_FILEA = #WM_CAP_START + 21
#WM_CAP_FILE_GET_CAPTURE_FILEW = #WM_CAP_UNICODE_START + 21
#WM_CAP_FILE_SAVEASA = #WM_CAP_START + 23
#WM_CAP_FILE_SAVEASW = #WM_CAP_UNICODE_START + 23
#WM_CAP_FILE_SAVEDIBA = #WM_CAP_START + 25
#WM_CAP_FILE_SAVEDIBW = #WM_CAP_UNICODE_START + 25
#WM_CAP_FILE_SET_CAPTURE_FILEA = #WM_CAP_START + 20
#WM_CAP_FILE_SET_CAPTURE_FILEW = #WM_CAP_UNICODE_START + 20
#WM_CAP_FILE_SET_INFOCHUNK = #WM_CAP_START + 24
#WM_CAP_GET_AUDIOFORMAT = #WM_CAP_START + 36
#WM_CAP_GET_CAPSTREAMPTR = #WM_CAP_START + 1
#WM_CAP_GET_MCI_DEVICEA = #WM_CAP_START + 67
#WM_CAP_GET_MCI_DEVICEW = #WM_CAP_UNICODE_START + 67
#WM_CAP_GET_SEQUENCE_SETUP = #WM_CAP_START + 65
#WM_CAP_GET_STATUS = #WM_CAP_START + 54
#WM_CAP_GET_USER_DATA = #WM_CAP_START + 8
#WM_CAP_GET_VIDEOFORMAT = #WM_CAP_START + 44
#WM_CAP_GRAB_FRAME = #WM_CAP_START + 60
#WM_CAP_GRAB_FRAME_NOSTOP = #WM_CAP_START + 61
#WM_CAP_PAL_AUTOCREATE = #WM_CAP_START + 83
#WM_CAP_PAL_MANUALCREATE = #WM_CAP_START + 84
#WM_CAP_PAL_OPENA = #WM_CAP_START + 80
#WM_CAP_PAL_OPENW = #WM_CAP_UNICODE_START + 80
#WM_CAP_PAL_PASTE = #WM_CAP_START + 82
#WM_CAP_SEQUENCE = #WM_CAP_START + 62
#WM_CAP_SEQUENCE_NOFILE = #WM_CAP_START + 63
#WM_CAP_SET_AUDIOFORMAT = #WM_CAP_START + 35
#WM_CAP_SET_CALLBACK_CAPCONTROL = #WM_CAP_START + 85
#WM_CAP_SET_CALLBACK_ERRORA = #WM_CAP_START + 2
#WM_CAP_SET_CALLBACK_ERRORW = #WM_CAP_UNICODE_START + 2
#WM_CAP_SET_CALLBACK_FRAME = #WM_CAP_START + 5
#WM_CAP_SET_CALLBACK_STATUSA = #WM_CAP_START + 3
#WM_CAP_SET_CALLBACK_STATUSW = #WM_CAP_UNICODE_START + 3
#WM_CAP_SET_CALLBACK_VIDEOSTREAM = #WM_CAP_START + 6
#WM_CAP_SET_CALLBACK_WAVESTREAM = #WM_CAP_START + 7
#WM_CAP_SET_CALLBACK_YIELD = #WM_CAP_START + 4
#WM_CAP_SET_MCI_DEVICEA = #WM_CAP_START + 66
#WM_CAP_SET_MCI_DEVICEW = #WM_CAP_UNICODE_START + 66
#WM_CAP_SET_OVERLAY = #WM_CAP_START + 51
#WM_CAP_SET_PREVIEW = #WM_CAP_START + 50
#WM_CAP_SET_PREVIEWRATE = #WM_CAP_START + 52
#WM_CAP_SET_SCALE = #WM_CAP_START + 53
#WM_CAP_SET_SCROLL = #WM_CAP_START + 55
#WM_CAP_SET_SEQUENCE_SETUP = #WM_CAP_START + 64
#WM_CAP_SET_USER_DATA = #WM_CAP_START + 9
#WM_CAP_SET_VIDEOFORMAT = #WM_CAP_START + 45
#WM_CAP_SINGLE_FRAME = #WM_CAP_START + 72
#WM_CAP_SINGLE_FRAME_CLOSE = #WM_CAP_START + 71
#WM_CAP_SINGLE_FRAME_OPEN = #WM_CAP_START + 70
#WM_CAP_STOP = #WM_CAP_START + 68
;#WM_CAP_UNICODE_START = #WM_USER+100
;#WM_CAP_SET_MCI_DEVICEW = #WM_CAP_UNICODE_START+ 66

Structure VIDEOHDR
  lpData.l
  dwBufferLength.l
  dwBytesUsed.l
  dwTimeCaptured.l
  dwUser.l
  dwFlags.l
  dwReserved.l[3]
EndStructure
Structure CAPTUREPARMS
    dwRequestMicroSecPerFrame.l 
    fMakeUserHitOKToCapture.l 
    wPercentDropForError.l 
    fYield.l
    dwIndexSize.l
    wChunkGranularity.l
    fUsingDOSMemory.l
    wNumVideoRequested.l
    fCaptureAudio.l
    wNumAudioRequested.l
    vKeyAbort.l 
    fAbortLeftMous.l 
    fAbortRightMouse.l 
    fLimitEnabled.l 
    wTimeLimit.l 
    fMCIControl.l 
    fStepMCIDevice.l 
    dwMCIStartTime.l 
    dwMCIStopTime.l
    fStepCaptureAt2x.l 
    wStepCaptureAverageFrames.l 
    dwAudioBufferSize.l 
    fDisableWriteCache.l 
    AVStreamMaster.l 
EndStructure
Structure CAPDRIVERCAPS
    wDeviceIndex.l
    fHasOverlay.l
    fHasDlgVideoSource.l
    fHasDlgVideoFormat.l
    fHasDlgVideoDisplay.l
    fCaptureInitialized.l
    fDriverSuppliesPalettes.l
    hVideoIn.l 
    hVideoOut.l
    hVideoExtIn.l
    hVideoExtOut.l
  EndStructure 

Structure CAPSTATUS
  uiImageWidth.l
  uiImageHeight.l
  fLiveWindow.l
  fOverlayWindow.l
  FSCALE.l
  ptScroll.Point
  fUsingDefaultPalette.l
  fAudioHardware.l
  fCapFileExists.l
  dwCurrentVideoFrame.l
  dwCurrentVideoFramesDropped.l
  dwCurrentWaveSamples.l
  dwCurrentTimeElapsedMS.l
  hPalCurrent.l
  fCapturingNow.l
  dwReturn.l
  wNumVideoAllocated.l
  wNumAudioAllocated.l
EndStructure
;-Image Constants
#MyImage=0

hWnd = OpenWindow(0, 0, 0, 400, 400, #PB_Window_SystemMenu, "WebCamTest") 

CreateGadgetList(WindowID()) 

If OpenLibrary(0, "AVICAP32.DLL") 
  
  hWebcam = CallFunction(0, "capCreateCaptureWindowA", "BLUBBER", #WS_VISIBLE + #WS_CHILD, 10, 10, 380, 380, hWnd, 0) 
  
SendMessage_(hWebcam, #WM_CAP_DRIVER_CONNECT          , 0 , 0) ;<- da halt auf den entsprechenden treiber(0-9) ändern 
SendMessage_(hWebcam, #WM_CAP_SET_SCALE               , 1 , 0) 
SendMessage_(hWebcam, #WM_CAP_SET_PREVIEWRATE         , 50, 0) 
SendMessage_(hWebcam, #WM_CAP_SET_PREVIEW             , 1 , 0) 
SendMessage_(hWebcam, #WM_CAP_EDIT_COPY   ,0,0); kopiert Bild ins Clipboard

If CreateImage(#MyImage,300,200)
   If StartDrawing(ImageOutput())
      link=GetClipboardData(#PB_ClipboardImage)
      UseImage(IMG)
      DrawImage(link,0,0,300,200) 
      StopDrawing()
  EndIf
EndIf

If OpenWindow(1,100,100,600,400,#PB_Window_SystemMenu,"Mein erstes Bild")And CreateGadgetList(WindowID(1))
  ImageGadget(0, 0, 0, 300,200,#MyImage )
If IsImage(IMG)
 SetGadgetState(0,UseImage(IMG)) 
EndIf
EndIf
Repeat 
  Event = WindowEvent() 
  Select Event 
    Case #PB_Event_CloseWindow 
      Quit = 1 
  EndSelect 
Until Quit = 1 
SendMessage_(hWebcam, #WM_CAP_SET_PREVIEW       , 0, 0) 
SendMessage_(hWebcam, #WM_CAP_DRIVER_DISCONNECT, "BLUBBER", 0) 
CloseWindow(0) 
CloseLibrary(0) 
EndIf 
End
Bild
Win11 Pro 64-Bit, PB_6.11b1
Benutzeravatar
Xaby
Beiträge: 2144
Registriert: 12.11.2005 11:29
Wohnort: Berlin + Zehdenick
Kontaktdaten:

Beitrag von Xaby »

Mein Code zu diesem Thema abgewandelt und auch schon recht schnell

Code: Alles auswählen

{- Information
; Folker Linstedt
; 
;}/
;aus "capture.pb" und "inc.pb"
Enumeration
#Link2
#Link3
#Sprite3D
#Sprite3D2
EndEnumeration

Dim Farbe.b(4)


;- Window Constants 
Global hWnd 
Enumeration 
  #Window_0 
EndEnumeration 

;- Gadget Constants 
Enumeration 
  #Button_0 
EndEnumeration 

Procedure Open_Window_0() 
  hWnd=OpenWindow(#Window_0, 0, 0, 410, 410,  #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar , "(c) Folker Linstedt 2006 - Desktop muss: 32 Bit BGR sein") 
  
EndProcedure 


#WM_CAP_START = #WM_USER 
#WM_CAP_SET_CALLBACK_ERROR = #WM_CAP_START + 2 
#WM_CAP_SET_CALLBACK_STATUS = #WM_CAP_START + 3 
#WM_CAP_SET_CALLBACK_YIELD = #WM_CAP_START + 4 
#WM_CAP_SET_CALLBACK_FRAME = #WM_CAP_START + 5 
#WM_CAP_SET_CALLBACK_VIDEOSTREAM = #WM_CAP_START + 6 
#WM_CAP_SET_CALLBACK_WAVESTREAM = #WM_CAP_START + 7 
#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_DLG_VIDEOFORMAT = #WM_CAP_START + 41 
#WM_CAP_DLG_VIDEOSOURCE = #WM_CAP_START + 42 
#WM_CAP_DLG_VIDEODISPLAY = #WM_CAP_START + 43 
#WM_CAP_SET_PREVIEW = #WM_CAP_START + 50 
#WM_CAP_SET_PREVIEWRATE = #WM_CAP_START + 52 
#WM_CAP_GET_STATUS = #WM_CAP_START + 54 
#WM_CAP_FILE_SAVEDIB = #WM_CAP_START + 25 
#WM_CAP_SET_SCALE = #WM_CAP_START + 53 
#WM_CAP_SET_CALLBACK_CAPCONTROL = #WM_CAP_START + 85 

#WM_CAP_EDIT_COPY = #WM_CAP_START + 30 
#WM_CAP_GRAB_FRAME = #WM_CAP_START+60 

InitSprite() 
InitSprite3D()
Rotate=0

Open_Window_0() 
OpenWindowedScreen(WindowID(),0,0,400,400,0,0,0)

OpenLibrary(0, "AVICAP32.DLL") 

hRobby = CallFunction(0, "capCreateCaptureWindowA", "Test",  #WS_CHILD, 0, 0, 384, 288, hWnd, 0) 
SendMessage_(hRobby, #WM_CAP_DRIVER_CONNECT, 0 , 0) 

Sprite3DQuality(1)

CreateSprite(#Link2,128,128,#PB_Sprite_Texture)
 
*Pointer =AllocateMemory(128*128*4)
*Pointer2=AllocateMemory(128*128*4)

Rausch=20
Repeat
  
  Event = WindowEvent() ; This line waits until an event is received from Windows 
  ; WaitWindowEvent()
  WindowID = EventWindowID() ; The Window where the event is generated, can be used in the gadget procedures 
  GadgetID = EventGadgetID() ; Is it a gadget event? 
  EventType = EventType() ; The event type 
  
  Link = GetClipboardData(#PB_ClipboardImage) 
       
      If Link <> 0        
       ClearScreen(0,0,0) ; Schwarz
        
        StartDrawing(SpriteOutput(#Link2))
        DrawImage(Link,0,0,128, 128)
         
        *Bild=DrawingBuffer()
        CopyMemory(*Bild, *Pointer, 128*128*4)
        If DrawingBufferPixelFormat() =  #PB_PixelFormat_32Bits_BGR : DrawText("32 Bit BGR") : EndIf
        
        StopDrawing()
        
        CopySprite(#Link2, #Link3, #PB_Sprite_Texture)
        CreateSprite3D(#Sprite3D, #Link3)
        
        ;{- Berechnungen
        ;R=-10+Random(Rausch)
        For i2=0 To 126 ; Bei 127 gibts noch ungeklärte Probleme
        For i=0 To 127
        
          P=127-i
          Farbe(0)=PeekB(*Pointer+i2*128*4+P*4+0)
          Farbe(1)=PeekB(*Pointer+i2*128*4+P*4+1)
          Farbe(2)=PeekB(*Pointer+i2*128*4+P*4+2)
          Farbe(3)=PeekB(*Pointer+i2*128*4+P*4+3)
        
          Farbe(4)=(Farbe(0)+Farbe(1)+Farbe(2))/3 ; Grau ... aber irgendwie nicht richtig
           ;R=Random(Rausch) 
          PokeB(*Pointer2+i2*128*4+i*4+0, Farbe(2)+R) ; Blue
          PokeB(*Pointer2+i2*128*4+i*4+1, Farbe(2)+R); Green
          PokeB(*Pointer2+i2*128*4+i*4+2, Farbe(2)+R); Red ... Rot ist am hellsten
          PokeB(*Pointer2+i2*128*4+i*4+3, Farbe(3)) ; Alpha
          
        Next i
        Next i2
        ;}- Ende Berechnungen
        
        CopyMemory(*Pointer2, *Bild, 128*128*4)
        
        CreateSprite3D(#Sprite3D2, #Link2)
        
        Rotate=(Rotate+3)%360
        ZoomSprite3D(#Sprite3D2,192,144)
       ; RotateSprite3D(#Sprite3D,Rotate,0)
        Start3D()
         DisplaySprite3D(#Sprite3D, 60, 60)
         DisplaySprite3D(#Sprite3D2, 180, 180)
        Stop3D()
    
      EndIf 
 ;/ 
  SendMessage_(hRobby, #WM_CAP_GRAB_FRAME, 0 , 0) 
  SendMessage_(hRobby, #WM_CAP_EDIT_COPY, 0 , 0) ; SendMessage_(hRobby, #WM_CAP_EDIT_COPY   ,0,0); kopiert Bild ins Clipboard
  
  Delay(10) ; Prozessorauslastung verhindern ... vielleicht ;-) 
  FlipBuffers()
  
Until Event = #PB_Event_CloseWindow ; End of the event loop 

SendMessage_(hRobby, #WM_CAP_SET_PREVIEW, 0, 0) 
SendMessage_(hRobby, #WM_CAP_DRIVER_DISCONNECT, "Test", 0) 
CloseWindow(0) 
CloseLibrary(0) 

End
Wenn man nur den DrawImage()-Befehl nutzen kann, muss man ihn wohl auf ein eigenes Bild anwenden, dieses besitzt dann alle Optionen zum 2D-Zeichnen.
Ich würd gern noch wissen, ob ich irgendwie an die Bilder der Kamera komme, ohne sie in den Clipboard-Speicher zu schreiben.
Kenn mich nur mit den ganzen WM_ ... Konstanten nicht so aus.

Und cool wäre auch ein Ansatz, wie ich meinen Code oben in der Schleife umwandeln kann, so dass ich z.B. Linien ermitteln kann in einem Bild und dessen Winkel bestimmen und deren Länge ...

Gibt's da schon was? :shock:
Kinder an die Macht http://scratch.mit.edu/
Benutzeravatar
Falko
Admin
Beiträge: 3535
Registriert: 29.08.2004 11:27
Computerausstattung: PC: MSI-Z590-GC; 32GB-DDR4, ICore9; 2TB M2 + 2x3TB-SATA2 HDD; Intel ICore9 @ 3600MHZ (Win11 Pro. 64-Bit),
Acer Aspire E15 (Win11 Home X64). Purebasic LTS 6.11b1
HP255G8 Notebook @AMD Ryzen 5 5500U with Radeon Graphics 2.10 GHz 3.4GHz, 32GB_RAM, 3TB_SSD (Win11 Pro 64-Bit)
Kontaktdaten:

Beitrag von Falko »

Interessanter Source. Ich sehe, das du versuchst einzelnen Streifen zu erstellen und diese dann gestreckt hast. Ich hoffe das ist richtig. Um den einen fehlenden Streifen zu bekommen habe ich da etwas geändert. Wegen der Farbe suche ich noch ;).
Ich hoffe, das sollte so gemeint sein.

Code: Alles auswählen

CopyMemory(*Bild, *Pointer, 127*127*8) ; hier geändert
        If DrawingBufferPixelFormat() =  #PB_PixelFormat_32Bits_BGR : DrawText("32 Bit BGR") : EndIf 
        
        StopDrawing() 
        
        CopySprite(#Link2, #Link3, #PB_Sprite_Texture) 
        CreateSprite3D(#Sprite3D, #Link3) 
        
        ;{- Berechnungen 
        ;R=-10+Random(Rausch) 
        For i2=0 To 127 ; Bei 127 gibts noch ungeklärte Probleme (jetzt nicht mehr)
        For i=0 To 127 
[Edit] Wegen den Farben habe ich herausgefunden, das es mit der 4 zusammen hängt. Also 4 Bits, die ich auf 8 gesetzt habe. Dann ist es nicht
mehr grau.

Code: Alles auswählen

P=127-i 
          Farbe(0)=PeekB(*Pointer+i2*128*4+P*8+0) 
          Farbe(1)=PeekB(*Pointer+i2*128*4+P*8+1) 
          Farbe(2)=PeekB(*Pointer+i2*128*4+P*8+2) 
          Farbe(3)=PeekB(*Pointer+i2*128*4+P*8+3) 
        
          Farbe(4)=(Farbe(0)+Farbe(1)+Farbe(2))/3 ; Grau ... aber irgendwie nicht richtig 
           ;R=Random(Rausch) 
          PokeB(*Pointer2+i2*128*4+i*8+0, Farbe(2)+R) ; Blue 
          PokeB(*Pointer2+i2*128*4+i*8+1, Farbe(2)+R); Green 
          PokeB(*Pointer2+i2*128*4+i*8+2, Farbe(2)+R); Red ... Rot ist am hellsten 
          PokeB(*Pointer2+i2*128*4+i*8+3, Farbe(3)) ; Alpha 
Gruß Falko
Bild
Win11 Pro 64-Bit, PB_6.11b1
myself
Beiträge: 67
Registriert: 18.03.2006 12:48

Beitrag von myself »

Gibts auch eine möglichkeit ohne das Clipboard zu verwenden? is ja ärgerlich wenn man was wichtiges im clipboard hat und das dan nach benutzen des programmes weg ist. Kann man irgendwie schnell und einfach 1 pic machen, und auf die festplatte speichern?
Benutzeravatar
Xaby
Beiträge: 2144
Registriert: 12.11.2005 11:29
Wohnort: Berlin + Zehdenick
Kontaktdaten:

Beitrag von Xaby »

Das würde mich auch interessieren und ich mach einen neuen Thread auf, weil sich das Problem nun ändert.

Ich meine, wie wir die Kamera ansprechen und die Daten bekommen ist irgendwie klar.

:roll: Aber für hier und da noch Probleme wie die Farben, die Ränder und das ClipBoard sollte es ruhig hier weiter gehen.

Auch, wo genau muss ich einstellen, wenn ich z.B. statt der ersten WebCam am Rechner meine Videokamera über IEEE1394 benutzen will?

Schaut mal in das Thema LEGO-Stein Orakel
Kinder an die Macht http://scratch.mit.edu/
Benutzeravatar
Falko
Admin
Beiträge: 3535
Registriert: 29.08.2004 11:27
Computerausstattung: PC: MSI-Z590-GC; 32GB-DDR4, ICore9; 2TB M2 + 2x3TB-SATA2 HDD; Intel ICore9 @ 3600MHZ (Win11 Pro. 64-Bit),
Acer Aspire E15 (Win11 Home X64). Purebasic LTS 6.11b1
HP255G8 Notebook @AMD Ryzen 5 5500U with Radeon Graphics 2.10 GHz 3.4GHz, 32GB_RAM, 3TB_SSD (Win11 Pro 64-Bit)
Kontaktdaten:

Beitrag von Falko »

myself hat geschrieben:Gibts auch eine möglichkeit ohne das Clipboard zu verwenden? is ja ärgerlich wenn man was wichtiges im clipboard hat und das dan nach benutzen des programmes weg ist. Kann man irgendwie schnell und einfach 1 pic machen, und auf die festplatte speichern?
Das steht eigendlich in der MSDN. Aber probiert mal dieses um ein BMP zu speichern. :mrgreen:

SendMessage_(hWebcam, #WM_CAP_FILE_SAVEDIBA ,0,"NewName.bmp") ; hier wird ein BMP gespeichert

MfG Falko
Bild
Win11 Pro 64-Bit, PB_6.11b1
Benutzeravatar
Falko
Admin
Beiträge: 3535
Registriert: 29.08.2004 11:27
Computerausstattung: PC: MSI-Z590-GC; 32GB-DDR4, ICore9; 2TB M2 + 2x3TB-SATA2 HDD; Intel ICore9 @ 3600MHZ (Win11 Pro. 64-Bit),
Acer Aspire E15 (Win11 Home X64). Purebasic LTS 6.11b1
HP255G8 Notebook @AMD Ryzen 5 5500U with Radeon Graphics 2.10 GHz 3.4GHz, 32GB_RAM, 3TB_SSD (Win11 Pro 64-Bit)
Kontaktdaten:

Beitrag von Falko »

@Xaby

Vielleicht kannst du es für Dich umsetzen.
Habs mal so aus einem Beispiel umgeformt.
Mit Getpixel könntest du dann nach bestimmten Farben vergleichen ob da
Linien usw. festzustellen sind. Aber viel mehr kann ich dazu nicht
erklären, da ich es selbst alles erst ausprobieren muss. :D

Code: Alles auswählen

#WM_CAP_START = #WM_USER
#WM_CAP_UNICODE_START = #WM_USER +100
#WM_CAP_PAL_SAVEA = #WM_CAP_START + 81
#WM_CAP_PAL_SAVEW = #WM_CAP_UNICODE_START + 81
#WM_CAP_UNICODE_END = #WM_CAP_PAL_SAVEW
#WM_CAP_ABORT = #WM_CAP_START + 69
#WM_CAP_DLG_VIDEOCOMPRESSION = #WM_CAP_START + 46
#WM_CAP_DLG_VIDEODISPLAY = #WM_CAP_START + 43
#WM_CAP_DLG_VIDEOFORMAT = #WM_CAP_START + 41
#WM_CAP_DLG_VIDEOSOURCE = #WM_CAP_START + 42
#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_DRIVER_GET_NAMEA = #WM_CAP_START + 12
#WM_CAP_DRIVER_GET_NAMEW = #WM_CAP_UNICODE_START + 12
#WM_CAP_DRIVER_GET_VERSIONA = #WM_CAP_START + 13
#WM_CAP_DRIVER_GET_VERSIONW = #WM_CAP_UNICODE_START + 13
#WM_CAP_EDIT_COPY = #WM_CAP_START + 30
#WM_CAP_END = #WM_CAP_UNICODE_END
#WM_CAP_FILE_ALLOCATE = #WM_CAP_START + 22
#WM_CAP_FILE_GET_CAPTURE_FILEA = #WM_CAP_START + 21
#WM_CAP_FILE_GET_CAPTURE_FILEW = #WM_CAP_UNICODE_START + 21
#WM_CAP_FILE_SAVEASA = #WM_CAP_START + 23
#WM_CAP_FILE_SAVEASW = #WM_CAP_UNICODE_START + 23
#WM_CAP_FILE_SAVEDIBA = #WM_CAP_START + 25
#WM_CAP_FILE_SAVEDIBW = #WM_CAP_UNICODE_START + 25
#WM_CAP_FILE_SET_CAPTURE_FILEA = #WM_CAP_START + 20
#WM_CAP_FILE_SET_CAPTURE_FILEW = #WM_CAP_UNICODE_START + 20
#WM_CAP_FILE_SET_INFOCHUNK = #WM_CAP_START + 24
#WM_CAP_GET_AUDIOFORMAT = #WM_CAP_START + 36
#WM_CAP_GET_CAPSTREAMPTR = #WM_CAP_START + 1
#WM_CAP_GET_MCI_DEVICEA = #WM_CAP_START + 67
#WM_CAP_GET_MCI_DEVICEW = #WM_CAP_UNICODE_START + 67
#WM_CAP_GET_SEQUENCE_SETUP = #WM_CAP_START + 65
#WM_CAP_GET_STATUS = #WM_CAP_START + 54
#WM_CAP_GET_USER_DATA = #WM_CAP_START + 8
#WM_CAP_GET_VIDEOFORMAT = #WM_CAP_START + 44
#WM_CAP_GRAB_FRAME = #WM_CAP_START + 60
#WM_CAP_GRAB_FRAME_NOSTOP = #WM_CAP_START + 61
#WM_CAP_PAL_AUTOCREATE = #WM_CAP_START + 83
#WM_CAP_PAL_MANUALCREATE = #WM_CAP_START + 84
#WM_CAP_PAL_OPENA = #WM_CAP_START + 80
#WM_CAP_PAL_OPENW = #WM_CAP_UNICODE_START + 80
#WM_CAP_PAL_PASTE = #WM_CAP_START + 82
#WM_CAP_SEQUENCE = #WM_CAP_START + 62
#WM_CAP_SEQUENCE_NOFILE = #WM_CAP_START + 63
#WM_CAP_SET_AUDIOFORMAT = #WM_CAP_START + 35
#WM_CAP_SET_CALLBACK_CAPCONTROL = #WM_CAP_START + 85
#WM_CAP_SET_CALLBACK_ERRORA = #WM_CAP_START + 2
#WM_CAP_SET_CALLBACK_ERRORW = #WM_CAP_UNICODE_START + 2
#WM_CAP_SET_CALLBACK_FRAME = #WM_CAP_START + 5
#WM_CAP_SET_CALLBACK_STATUSA = #WM_CAP_START + 3
#WM_CAP_SET_CALLBACK_STATUSW = #WM_CAP_UNICODE_START + 3
#WM_CAP_SET_CALLBACK_VIDEOSTREAM = #WM_CAP_START + 6
#WM_CAP_SET_CALLBACK_WAVESTREAM = #WM_CAP_START + 7
#WM_CAP_SET_CALLBACK_YIELD = #WM_CAP_START + 4
#WM_CAP_SET_MCI_DEVICEA = #WM_CAP_START + 66
#WM_CAP_SET_MCI_DEVICEW = #WM_CAP_UNICODE_START + 66
#WM_CAP_SET_OVERLAY = #WM_CAP_START + 51
#WM_CAP_SET_PREVIEW = #WM_CAP_START + 50
#WM_CAP_SET_PREVIEWRATE = #WM_CAP_START + 52
#WM_CAP_SET_SCALE = #WM_CAP_START + 53
#WM_CAP_SET_SCROLL = #WM_CAP_START + 55
#WM_CAP_SET_SEQUENCE_SETUP = #WM_CAP_START + 64
#WM_CAP_SET_USER_DATA = #WM_CAP_START + 9
#WM_CAP_SET_VIDEOFORMAT = #WM_CAP_START + 45
#WM_CAP_SINGLE_FRAME = #WM_CAP_START + 72
#WM_CAP_SINGLE_FRAME_CLOSE = #WM_CAP_START + 71
#WM_CAP_SINGLE_FRAME_OPEN = #WM_CAP_START + 70
#WM_CAP_STOP = #WM_CAP_START + 68
;#WM_CAP_UNICODE_START = #WM_USER+100
;#WM_CAP_SET_MCI_DEVICEW = #WM_CAP_UNICODE_START+ 66

Structure VIDEOHDR
  lpData.l
  dwBufferLength.l
  dwBytesUsed.l
  dwTimeCaptured.l
  dwUser.l
  dwFlags.l
  dwReserved.l[3]
EndStructure
Structure CAPTUREPARMS
    dwRequestMicroSecPerFrame.l 
    fMakeUserHitOKToCapture.l 
    wPercentDropForError.l 
    fYield.l
    dwIndexSize.l
    wChunkGranularity.l
    fUsingDOSMemory.l
    wNumVideoRequested.l
    fCaptureAudio.l
    wNumAudioRequested.l
    vKeyAbort.l 
    fAbortLeftMous.l 
    fAbortRightMouse.l 
    fLimitEnabled.l 
    wTimeLimit.l 
    fMCIControl.l 
    fStepMCIDevice.l 
    dwMCIStartTime.l 
    dwMCIStopTime.l
    fStepCaptureAt2x.l 
    wStepCaptureAverageFrames.l 
    dwAudioBufferSize.l 
    fDisableWriteCache.l 
    AVStreamMaster.l 
EndStructure
Structure CAPDRIVERCAPS
    wDeviceIndex.l
    fHasOverlay.l
    fHasDlgVideoSource.l
    fHasDlgVideoFormat.l
    fHasDlgVideoDisplay.l
    fCaptureInitialized.l
    fDriverSuppliesPalettes.l
    hVideoIn.l 
    hVideoOut.l
    hVideoExtIn.l
    hVideoExtOut.l
  EndStructure 

Structure CAPSTATUS
  uiImageWidth.l
  uiImageHeight.l
  fLiveWindow.l
  fOverlayWindow.l
  FSCALE.l
  ptScroll.Point
  fUsingDefaultPalette.l
  fAudioHardware.l
  fCapFileExists.l
  dwCurrentVideoFrame.l
  dwCurrentVideoFramesDropped.l
  dwCurrentWaveSamples.l
  dwCurrentTimeElapsedMS.l
  hPalCurrent.l
  fCapturingNow.l
  dwReturn.l
  wNumVideoAllocated.l
  wNumAudioAllocated.l
EndStructure

Name.s = Space(80)
Description.s = Space(80)

If OpenLibrary(0, "AVICAP32.DLL")
*capAddress = IsFunction(0, "capGetDriverDescriptionA")

For i = 0 To 9
  
  If CallFunctionFast(*capAddress, i , Name , Len(Name), Description , Len(Description))
     Debug Str(i) + " : " + Name + " - " + Description
  EndIf 
Next i
myCap.CAPDRIVERCAPS
If OpenWindow(0, 0, 0, 600, 400, #PB_Window_SystemMenu,"WebCamTest")And  CreateGadgetList(WindowID(0))
hWebcam = CallFunction(0, "capCreateCaptureWindowA", "My Video", #WS_VISIBLE + #WS_CHILD, 10, 10, 80, 60,WindowID(0), 1)

SendMessage_(hWebcam, #WM_CAP_DRIVER_CONNECT    , 0, 1); hier wird die Indexnummer der Kamera eingestellt (Im Moment manuell)
SendMessage_(hWebcam, #WM_CAP_SET_SCALE               , 1 , 0)
SendMessage_(hWebcam, #WM_CAP_SET_PREVIEWRATE  , 15, 0)
SendMessage_(hWebcam, #WM_CAP_SET_OVERLAY  , 1,0)
SendMessage_(hWebcam, #WM_CAP_SET_PREVIEW  , 1 , 0)
SendMessage_(hWebcam, #WM_CAP_FILE_SAVEDIBA  ,0,"NewName.bmp") ; hier wird ein BMP gespeichert
LoadImage(0,"NewName.bmp")
ResizeImage(0,400,300)
hwnd.l=ImageGadget(1,200,0,400,200,UseImage(0))
EndIf
;-- hier die Farbausgabe vom betreffenden Pixel an Position 0,0
hdc.l=GetDC_(hwnd)
c=GetPixel_(hdc,0,0)
ReleaseDC_(hwnd, hdc)
r=c & $FF
g=(c >> 8)& $FF
b=(c>>16)& $FF
MessageRequester("Pixelwerte", "ROT: "+Str(r)+"  GRÜN: "+Str(g)+"  BLAU: "+Str(b))
 Repeat
   Event = WindowEvent()
   Select Event
     Case #PB_Event_CloseWindow
       Quit = 1
   EndSelect
 Until Quit = 1
SendMessage_(hWebcam, #WM_CAP_SET_PREVIEW       , 0, 0)
SendMessage_(hWebcam, #WM_CAP_DRIVER_DISCONNECT, "My Video", 0)
CloseWindow(0)
CloseLibrary(0)
EndIf
;End
Bild
Win11 Pro 64-Bit, PB_6.11b1
Antworten