Page 1 sur 1

Webcam sur Canvas

Publié : lun. 22/oct./2012 17:09
par Ar-S
Image

Les codes fonctionnels pour webcam ne sont pas légions,
Voilà donc un code trouvé sur le fofo anglais que j'ai bidouillé pour afficher l'image dans un canvasgadget()
ça marche plutôt bien :mrgreen:

Escapi DLL : http://stock.ldvmultimedia.com/escapi.7z

Le .PBI : escapi.pbi

Code : Tout sélectionner

;/* Extremely Simple Capture API */

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

;/* Return the number of capture devices found */
PrototypeC countCaptureDevicesProc()

; /* initCapture tries To open the video capture device.
;  * Returns 0 on failure, 1 on success.
;  * Note: Capture parameter values must Not change While capture device
;  *       is in use (i.e. between initCapture And deinitCapture).
;  *       Do *Not* free the target buffer, Or change its pointer!
;  */
PrototypeC initCaptureProc(deviceno, *aParams.SimpleCapParams)

;/* deinitCapture closes the video capture device. */
PrototypeC deinitCaptureProc(deviceno)

;/* doCapture requests video frame To be captured. */
PrototypeC doCaptureProc(deviceno)

;/* isCaptureDone returns 1 when the requested frame has been captured.*/
PrototypeC isCaptureDoneProc(deviceno)

;/* Get the user-friendly name of a capture device. */
PrototypeC getCaptureDeviceNameProc(deviceno, *namebuffer, bufferlength)

;/* Returns the ESCAPI DLL version. 0x200 For 2.0 */
PrototypeC ESCAPIDLLVersionProc()

; marked as "internal" in the example
PrototypeC initCOMProc()

Global countCaptureDevices.countCaptureDevicesProc
Global initCapture.initCaptureProc
Global deinitCapture.deinitCaptureProc
Global doCapture.doCaptureProc
Global isCaptureDone.isCaptureDoneProc
Global getCaptureDeviceName.getCaptureDeviceNameProc
Global ESCAPIDLLVersion.ESCAPIDLLVersionProc

Procedure setupESCAPI()
  
  ; load library
  capdll = OpenLibrary(#PB_Any, "escapi.dll")
  If capdll = 0
    ProcedureReturn 0
  EndIf
  
  ;/* Fetch function entry points */
  countCaptureDevices = GetFunction(capdll, "countCaptureDevices")
  initCapture = GetFunction(capdll, "initCapture")
  deinitCapture = GetFunction(capdll, "deinitCapture")
  doCapture = GetFunction(capdll, "doCapture")
  isCaptureDone = GetFunction(capdll, "isCaptureDone")
  initCOM.initCOMProc = GetFunction(capdll, "initCOM")
  getCaptureDeviceName = GetFunction(capdll, "getCaptureDeviceName")
  ESCAPIDLLVersion = GetFunction(capdll, "ESCAPIDLLVersion")
  
  If countCaptureDevices = 0 Or initCapture = 0 Or deinitCapture = 0 Or doCapture = 0 Or isCaptureDone = 0 Or initCOM = 0 Or getCaptureDeviceName = 0 Or ESCAPIDLLVersion = 0
    ProcedureReturn 0
  EndIf
  
  ;/* Verify DLL version */
  If ESCAPIDLLVersion() < $200
    ProcedureReturn 0
  EndIf
  
  ;/* Initialize COM.. */
  initCOM();
  
  ; returns number of devices found
  ProcedureReturn countCaptureDevices()
EndProcedure
; IDE Options = PureBasic 4.50 Beta 3 (Windows - x86)
; CursorPosition = 3
; FirstLine = 1


Le Code pour tester :

Code : Tout sélectionner

    IncludeFile "escapi.pbi"
    
    #WIDTH = 320 ;1280
    #HEIGHT = 240 ;#WIDTH * 0.5625 ;16:9 ASPECT RATIO -- YOU MAY ADJUST TO SUIT
    
    #WIDTHM1 = #WIDTH - 1
    #HEIGHTM1 = #HEIGHT - 1
    pixCount = (#WIDTH * #HEIGHT) - 2
    
    device = 0
    
    count = setupESCAPI()
    ;    Debug "Init: " + Str(count)
    
    If count = 0
      MessageRequester("Error", "Unable to initialize ESCAPI.")
      End
    EndIf
    
    name$ = Space(255)
    getCaptureDeviceName(device, @name$, 255)
    ;    Debug "Name: " + name$
    
    bufSize = #WIDTH * #HEIGHT * 4
    scp.SimpleCapParams
    scp\mWidth = #WIDTH
    scp\mHeight = #HEIGHT
    scp\mTargetBuf = AllocateMemory(bufSize)
    *buf = scp\mTargetBuf
    
    If initCapture(device, @scp)
      ;      Debug "Cap init successful."
      
      Image = CreateImage(0, #WIDTH, #HEIGHT, 24)
      OpenWindow(0, 50, 50, #WIDTH, #HEIGHT, name$, #PB_Window_SystemMenu)
      CanvasGadget(0, 0, 0, #WIDTH, #HEIGHT)
      If StartDrawing(CanvasOutput(0))
         DrawImage(ImageID(0), 0, 0, #WIDTH, #HEIGHT)
          StopDrawing()
      EndIf    
      
      offset = 0
      Quit = #False
      
      Repeat
        
        doCapture(device)
        While isCaptureDone(device) = #False
          If WaitWindowEvent(1) = #PB_Event_CloseWindow
            Quit = #True
            Break
          EndIf       
        Wend
        
        offset = 0       
        StartDrawing(CanvasOutput(0))   
          *writeBuffer = DrawingBuffer()
          pitch = DrawingBufferPitch()
        StopDrawing()
        
        ;NEEDS PIXEL-BY-PIXEL READING AND WRITING
        For Y = 0 To #HEIGHTM1
          hm1 = *writeBuffer + ((#HEIGHTM1 - Y) * pitch)
          
          For X = 0 To #WIDTHM1
            PokeL(hm1 + X * 3, PeekL(*buf + offset))
            offset + 4
          Next
          
        Next
        
        SetGadgetState(0, ImageID(0))
        
      Until Quit
      
      deinitCapture(device)
      FreeImage(0)
      FreeMemory(scp\mTargetBuf)
      CloseWindow(0)
    Else
      Debug "Init capture failed."
    EndIf
    
    End

Re: Webcam sur Canvas

Publié : lun. 22/oct./2012 17:22
par falsam
Merci Ar-S. Malheureusement dans un environnement Windows 7, que ce soit avec la version 1.00 ou 2.10 de la dll escarpi, je n'arrive pas à initialiser cette DLL ! Dommage.
J'ai téléchargé ces DLL sur le site http://sol.gfxile.net/escapi/index. D'aprés ce que je comprends sur ce site je ne suis pas le seul à avoir ce souci sous Windows 7.

Re: Webcam sur Canvas

Publié : lun. 22/oct./2012 17:24
par Ar-S
J'ai ajouté la DLL qui fonctionne chez moi je pense que c'est bien la 2.1

Re: Webcam sur Canvas

Publié : lun. 22/oct./2012 17:32
par falsam
Ar-S a écrit :J'ai ajouté la DLL qui fonctionne chez moi
Sous Windows 7?
La version 2.10 est fourni avec des exemples en Pure basic qui ne fonctionnent pas sous Windows 7.

Re: Webcam sur Canvas

Publié : lun. 22/oct./2012 17:34
par Ar-S
Sous W7 x64 sans soucis (test sous pb 4.61 x86) :lol:
Je l'ai ajouté en lien en début de topic

Re: Webcam sur Canvas

Publié : lun. 22/oct./2012 17:41
par falsam
Ar-S a écrit :Sous W7 x64 sans soucis (test sous pb 4.61 x86) :lol:
Ok !! Je n'avais pas vu que je compilais avec la version 64bits. Donc effectivement ça fonctionne avec la version x86 de Pure basic que ce soit avec la version 4.61 ou 5.00.

J'ai comme l'impression que tu es tombé sous le charme du canvas :)

Re: Webcam sur Canvas

Publié : lun. 22/oct./2012 17:55
par Ar-S
Ar-S a écrit : J'ai comme l'impression que tu es tombé sous le charme du canvas :)
Et c'est en grande partie par ta faute :mrgreen: ... et je t'en remercie. :wink:

Re: Webcam sur Canvas

Publié : lun. 22/oct./2012 19:28
par GallyHC
Bonjour,

Merci pour cette trouvaille et fonctionnel sur win7 x32 :) Je me demande si c'est le genre de truc a mettre aussi sur mon site, car forcement pas de moi.

Cordialement,
GallyHC

Re: Webcam sur Canvas

Publié : lun. 22/oct./2012 20:35
par Ar-S
Tu as le lien du topic anglais, demande aux concernés, je ne vois pas pourquoi il refuserait. Au contraire.

Re: Webcam sur Canvas

Publié : mar. 23/oct./2012 11:05
par Le Soldat Inconnu
j'ai ce code pour utiliser la Webcam, et la, pas de soucis de librairie avec windows 7 (viens du fofo anglais aussi, j'ai juste remis le code à ma sauce)

Code : Tout sélectionner

UseJPEGImageDecoder()
UseJPEGImageEncoder()
Fenetre = OpenWindow(#PB_Any, 0, 0, 1024, 768, "Webcam Photo", #PB_Window_Invisible)
If Fenetre
	Librairie = OpenLibrary(#PB_Any, "avicap32.dll")
	If Librairie
		*capAddress = GetFunction(Librairie, "capCreateCaptureWindowA")
		
		; Capture de la photo
		hWndC.l = CallFunctionFast(*capAddress, @" ", #WS_CHILD | #WS_VISIBLE, 0, 0, 200, 200, WindowID(Fenetre), 0)
		SendMessage_(hWndC, #WM_CAP_DRIVER_CONNECT, 0, 0)
		SendMessage_(hWndC, #WM_CAP_SET_SCALE, #True, 0)
		SendMessage_(hWndC, #WM_CAP_EDIT_COPY, 0, 0)
		Image = GetClipboardImage(#PB_Any)
		SendMessage_(hWndC, #WM_CAP_STOP, 0, 0)
		SendMessage_(hWndC, #WM_CAP_DRIVER_DISCONNECT, 0, 0)
		DestroyWindow_(hWndC)
		
		CloseLibrary(Librairie)
		
		; Sauvegarde de la photo
		Dossier.s = GetPathPart(ProgramFilename())
		Fichier.s = "Photo " + FormatDate("%yyyy-%mm-%dd %hh-%ii", Date()) + ".jpg"
		SaveImage(Image, Dossier + Fichier, #PB_ImagePlugin_JPEG, 8)
		
	EndIf
	
	CloseWindow(Fenetre)
	
EndIf

Re: Webcam sur Canvas

Publié : mar. 23/oct./2012 20:35
par graph100
mmmh, j'obtiens invariablement une image noire alors que la lumière de la cam clignote.

j'ai essayé de compiler avec Pb4.60 x86 et x84...(sous win7 64bit)

Re: Webcam sur Canvas

Publié : dim. 09/déc./2012 1:57
par Ar-S
Pour info le code avec escapi et le code de LSI fonctionnent aussi en 5.00 x86 sous windows 8 x64

Re: Webcam sur Canvas

Publié : dim. 09/déc./2012 8:44
par kernadec
Bonjour
merci à vous pour ce partage.

Cordialement