Webcam sur Canvas

Partagez votre expérience de PureBasic avec les autres utilisateurs.
Avatar de l’utilisateur
Ar-S
Messages : 9539
Inscription : dim. 09/oct./2005 16:51
Contact :

Webcam sur Canvas

Message 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
Dernière modification par Ar-S le lun. 22/oct./2012 17:33, modifié 2 fois.
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Avatar de l’utilisateur
falsam
Messages : 7317
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Webcam sur Canvas

Message 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.
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
Ar-S
Messages : 9539
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Webcam sur Canvas

Message par Ar-S »

J'ai ajouté la DLL qui fonctionne chez moi je pense que c'est bien la 2.1
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Avatar de l’utilisateur
falsam
Messages : 7317
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Webcam sur Canvas

Message 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.
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
Ar-S
Messages : 9539
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Webcam sur Canvas

Message 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
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Avatar de l’utilisateur
falsam
Messages : 7317
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Webcam sur Canvas

Message 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 :)
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
Ar-S
Messages : 9539
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Webcam sur Canvas

Message 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:
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Avatar de l’utilisateur
GallyHC
Messages : 1708
Inscription : lun. 17/déc./2007 12:44

Re: Webcam sur Canvas

Message 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
Configuration : Tower: Windows 10 (Processeur: i7 "x64") (Mémoire: 16Go) (GeForce GTX 760 - 2Go) - PureBasic 5.72 (x86 et x64)
Avatar de l’utilisateur
Ar-S
Messages : 9539
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Webcam sur Canvas

Message par Ar-S »

Tu as le lien du topic anglais, demande aux concernés, je ne vois pas pourquoi il refuserait. Au contraire.
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Re: Webcam sur Canvas

Message 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
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?

[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
Avatar de l’utilisateur
graph100
Messages : 1318
Inscription : sam. 21/mai/2005 17:50

Re: Webcam sur Canvas

Message 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)
_________________________________________________
Mon site : CeriseCode (Attention Chantier perpétuel ;))
Avatar de l’utilisateur
Ar-S
Messages : 9539
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Webcam sur Canvas

Message par Ar-S »

Pour info le code avec escapi et le code de LSI fonctionnent aussi en 5.00 x86 sous windows 8 x64
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Avatar de l’utilisateur
kernadec
Messages : 1606
Inscription : ven. 25/avr./2008 11:14

Re: Webcam sur Canvas

Message par kernadec »

Bonjour
merci à vous pour ce partage.

Cordialement
Répondre