Utiliser une webcam et traiter l'image (API)

Partagez votre expérience de PureBasic avec les autres utilisateurs.
Oliv
Messages : 2117
Inscription : mer. 21/janv./2004 18:39

Utiliser une webcam et traiter l'image (API)

Message par Oliv »

Je n'étais pas très content de la DLL icamplay alors je compte m'en passer, pour le moment j'en suis au même point par moi même donc je pense que j'ai bien fait. J'ai mis source qui n'est pas totalement optimisée mais commentée et 100% fonctionelle :lol: . Comme tout apparait dans l'écran, sous le handle Image, a vous de jouer :D . Je ferais bientôt une version plein écran, sinon je pense que vous savez comment faire, et surtout cachez la fenêtre avec #PB_Window_Invisible mais ne la fermez pas !!!! Car c'est par elle que passe la vidéo.

Code : Tout sélectionner

;- Declarations
; Constantes
Enumeration
  #Principale
  #AviCap32
EndEnumeration

; Structures

; Listes

; Buffer

; Variables
Sortie.b : hWndPreview.l

Global hWndPreview, Sortie



;  *****************************               Procedures               ***********************

;Exeption pour les contstantes cap, je les mettrai en Enumeration plus tard
#WM_CAP_START = #WM_USER 

#WM_CAP_GET_CAPSTREAMPTR = #WM_CAP_START + 1 

#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_GET_USER_DATA = #WM_CAP_START + 8 
#WM_CAP_SET_USER_DATA = #WM_CAP_START + 9 
    
#WM_CAP_DRIVER_CONNECT = #WM_CAP_START + 10 
#WM_CAP_DRIVER_DISCONNECT = #WM_CAP_START + 11 
#WM_CAP_DRIVER_GET_NAME = #WM_CAP_START + 12 
#WM_CAP_DRIVER_GET_VERSION = #WM_CAP_START + 13 
#WM_CAP_DRIVER_GET_CAPS = #WM_CAP_START + 14 

#WM_CAP_FILE_SET_CAPTURE_FILE = #WM_CAP_START + 20 
#WM_CAP_FILE_GET_CAPTURE_FILE = #WM_CAP_START + 21 
#WM_CAP_FILE_ALLOCATE = #WM_CAP_START + 22 
#WM_CAP_FILE_SAVEAS = #WM_CAP_START + 23 
#WM_CAP_FILE_SET_INFOCHUNK = #WM_CAP_START + 24 
#WM_CAP_FILE_SAVEDIB = #WM_CAP_START + 25 

#WM_CAP_EDIT_COPY = #WM_CAP_START + 30 

#WM_CAP_SET_AUDIOFORMAT = #WM_CAP_START + 35 
#WM_CAP_GET_AUDIOFORMAT = #WM_CAP_START + 36 

#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_GET_VIDEOFORMAT = #WM_CAP_START + 44 
#WM_CAP_SET_VIDEOFORMAT = #WM_CAP_START + 45 
#WM_CAP_DLG_VIDEOCOMPRESSION = #WM_CAP_START + 46 

#WM_CAP_SET_PREVIEW = #WM_CAP_START + 50 
#WM_CAP_SET_OVERLAY = #WM_CAP_START + 51 
#WM_CAP_SET_PREVIEWRATE = #WM_CAP_START + 52 
#WM_CAP_SET_SCALE = #WM_CAP_START + 53 
#WM_CAP_GET_STATUS = #WM_CAP_START + 54 
#WM_CAP_SET_SCROLL = #WM_CAP_START + 55 

#WM_CAP_GRAB_FRAME = #WM_CAP_START + 60 
#WM_CAP_GRAB_FRAME_NOSTOP = #WM_CAP_START + 61 

#WM_CAP_SEQUENCE = #WM_CAP_START + 62 
#WM_CAP_SEQUENCE_NOFILE = #WM_CAP_START + 63 
#WM_CAP_SET_SEQUENCE_SETUP = #WM_CAP_START + 64 
#WM_CAP_GET_SEQUENCE_SETUP = #WM_CAP_START + 65 
#WM_CAP_SET_MCI_DEVICE = #WM_CAP_START + 66 
#WM_CAP_GET_MCI_DEVICE = #WM_CAP_START + 67 
#WM_CAP_STOP = #WM_CAP_START + 68 
#WM_CAP_ABORT = #WM_CAP_START + 69 

#WM_CAP_SINGLE_FRAME_OPEN = #WM_CAP_START + 70 
#WM_CAP_SINGLE_FRAME_CLOSE = #WM_CAP_START + 71 
#WM_CAP_SINGLE_FRAME = #WM_CAP_START + 72 

#WM_CAP_PAL_OPEN = #WM_CAP_START + 80 
#WM_CAP_PAL_SAVE = #WM_CAP_START + 81 
#WM_CAP_PAL_PASTE = #WM_CAP_START + 82 
#WM_CAP_PAL_AUTOCREATE = #WM_CAP_START + 83 
#WM_CAP_PAL_MANUALCREATE = #WM_CAP_START + 84 

;// Following added post VFW 1.1 
#WM_CAP_SET_CALLBACK_CAPCONTROL = #WM_CAP_START + 85 

;// Defines end of the message range 
#WM_CAP_END = #WM_CAP_SET_CALLBACK_CAPCONTROL 




Procedure Cap_Stop()
  ProcedureReturn SendMessage_(hWndPreview,#WM_CAP_STOP,0,0)
EndProcedure


Procedure CAP_DRIVER_DISCONNECT()
  ProcedureReturn SendMessage_(hWndPreview,#WM_CAP_DRIVER_DISCONNECT,0,0)
EndProcedure

Procedure capCreateCaptureWindowA(lpszWindowName.s,dwStyle.l,x.l,y.l,Width.l,Height.l,hWndParent.l,nId.l) 
    ProcedureReturn CallFunction(#AviCap32,"capCreateCaptureWindowA", lpszWindowName, dwStyle, x, y,Width,Height,hWndParent,nId) 
EndProcedure


Procedure capDriverConnect(i.b) 
   ProcedureReturn SendMessage_(hWndPreview,#WM_CAP_DRIVER_CONNECT,i,0) 
EndProcedure 


Procedure capPreviewRate(Rate.b) 
   ProcedureReturn SendMessage_(hWndPreview,#WM_CAP_SET_PREVIEWRATE,Rate,0) 
EndProcedure


Procedure capPreview(Flag.b) 
   ProcedureReturn SendMessage_(hWndPreview,#WM_CAP_SET_PREVIEW,Flag,0) 
EndProcedure 


Procedure capCaptureStop() 
   ProcedureReturn SendMessage_(hWndPreview,#WM_CAP_STOP,0,0) 
EndProcedure


Procedure capDriverDisconnect() 
   ProcedureReturn SendMessage_(hWndPreview,#WM_CAP_DRIVER_DISCONNECT,0,0) 
EndProcedure 


Procedure capGrabFrameNoStop() 
   ProcedureReturn SendMessage_(hWndPreview,#WM_CAP_GRAB_FRAME_NOSTOP,0,0) 
EndProcedure


Procedure capEditCopy() 
   ProcedureReturn SendMessage_(hWndPreview,#WM_CAP_EDIT_COPY,0,0) 
EndProcedure


Procedure Affichage()
  StartDrawing(ScreenOutput())
    DrawText("Text")
  StopDrawing()
  FlipBuffers()
  ClearScreen(170,170,170)
EndProcedure


Procedure Clavier()
  ExamineKeyboard()
  If KeyboardPushed(#PB_Key_Escape) : Sortie = 1 : EndIf
EndProcedure


Procedure Webcam()
  capGrabFrameNoStop() 
  capEditCopy()
  ImageID.l = GetClipboardData(#PB_ClipboardImage)
  StartDrawing(ScreenOutput()) 
    DrawImage(ImageID,0,0) 
  StopDrawing()
EndProcedure








; Initialisations
If InitSprite() = 0 Or InitKeyboard() = 0
  MessageRequester("Erreur","Le DirectX ne peux pas être initialisé.",#MB_ICONError)
EndIf


; Ouverture de la DLL
If OpenLibrary(#AviCap32,"avicap32.dll") = 0 
  MessageRequester("Erreur","La DLL avicap32.dll ne peut pas être ouverte.",#MB_ICONError)
EndIf


; Création de la fenêtre pour la preview
OpenWindow(#Principale,0,0,340,260,#PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_TitleBar | #PB_Window_ScreenCentered,"WebCam - Preview")
;  | #WS_VISIBLE

; Creation de la fenêtre de preview
hWndPreview = capCreateCaptureWindowA("Preview",#WS_CHILD,0,0,320,240,WindowID(#Principale),0); Le denier paramètre celon le MSDN est "Window identifier", je ne vois pas à quoi il sert.
; On "se connecte" au driver
capDriverConnect(0)
; On active la preview
capPreview(#True)
; On met le le nombre de rafarichissemnt/seconde de la preview, mettre 15 si vous avez une caméra 15 images seconde max.
capPreviewRate(30) 
  


; Création de la fenêtre
; OpenWindow(#Principale,0,0,100,100,#PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_TitleBar | #PB_Window_ScreenCentered,"")

; Ouverture de l'écran
OpenWindowedScreen(WindowID(#Principale),10,10,320,240,0,0,0)

Repeat
  ClearScreen(150,150,150)
  Select WindowEvent()
    Case #PB_Event_CloseWindow
      Sortie = 1
  EndSelect
  
  
  ; Gère le clavier
  Clavier() 
  
  ; Gère la WebCam
  WebCam()
  
  ; Gère l'affichage
  Affichage()
  
  Delay(5)
Until Sortie = 1

; On arrête la fenêtre de capture
capCaptureStop()
; On libère la caméra : très important pour la réutiliser après et fermer l'EXE rapidement
capDriverDisconnect()
; On ferme les fenêtres
DestroyWindow_(hWndPreview)
CloseWindow(#Principale)
; On freme la DLL
CloseLibrary(#AviCap32)


End
Oliv
Messages : 2117
Inscription : mer. 21/janv./2004 18:39

Message par Oliv »

Pour ceux qui on la librairie effects du Soldat Inconnu, l'image se remet à l'endroit :D

Code : Tout sélectionner

; Utilise la librairie effect du Soldat Inconnu pour gagner du temps.

;- Declarations 
; Constantes 
Enumeration 
  #Principale 
  #AviCap32 
EndEnumeration 

; Structures 

; Listes 

; Buffer 

; Variables 
Sortie.b : hWndPreview.l 

Global hWndPreview, Sortie 



;  *****************************               Procedures               *********************** 

;Exeption pour les contstantes cap, je les mettrai en Enumeration plus tard 
#WM_CAP_START = #WM_USER 

#WM_CAP_GET_CAPSTREAMPTR = #WM_CAP_START + 1 

#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_GET_USER_DATA = #WM_CAP_START + 8 
#WM_CAP_SET_USER_DATA = #WM_CAP_START + 9 
    
#WM_CAP_DRIVER_CONNECT = #WM_CAP_START + 10 
#WM_CAP_DRIVER_DISCONNECT = #WM_CAP_START + 11 
#WM_CAP_DRIVER_GET_NAME = #WM_CAP_START + 12 
#WM_CAP_DRIVER_GET_VERSION = #WM_CAP_START + 13 
#WM_CAP_DRIVER_GET_CAPS = #WM_CAP_START + 14 

#WM_CAP_FILE_SET_CAPTURE_FILE = #WM_CAP_START + 20 
#WM_CAP_FILE_GET_CAPTURE_FILE = #WM_CAP_START + 21 
#WM_CAP_FILE_ALLOCATE = #WM_CAP_START + 22 
#WM_CAP_FILE_SAVEAS = #WM_CAP_START + 23 
#WM_CAP_FILE_SET_INFOCHUNK = #WM_CAP_START + 24 
#WM_CAP_FILE_SAVEDIB = #WM_CAP_START + 25 

#WM_CAP_EDIT_COPY = #WM_CAP_START + 30 

#WM_CAP_SET_AUDIOFORMAT = #WM_CAP_START + 35 
#WM_CAP_GET_AUDIOFORMAT = #WM_CAP_START + 36 

#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_GET_VIDEOFORMAT = #WM_CAP_START + 44 
#WM_CAP_SET_VIDEOFORMAT = #WM_CAP_START + 45 
#WM_CAP_DLG_VIDEOCOMPRESSION = #WM_CAP_START + 46 

#WM_CAP_SET_PREVIEW = #WM_CAP_START + 50 
#WM_CAP_SET_OVERLAY = #WM_CAP_START + 51 
#WM_CAP_SET_PREVIEWRATE = #WM_CAP_START + 52 
#WM_CAP_SET_SCALE = #WM_CAP_START + 53 
#WM_CAP_GET_STATUS = #WM_CAP_START + 54 
#WM_CAP_SET_SCROLL = #WM_CAP_START + 55 

#WM_CAP_GRAB_FRAME = #WM_CAP_START + 60 
#WM_CAP_GRAB_FRAME_NOSTOP = #WM_CAP_START + 61 

#WM_CAP_SEQUENCE = #WM_CAP_START + 62 
#WM_CAP_SEQUENCE_NOFILE = #WM_CAP_START + 63 
#WM_CAP_SET_SEQUENCE_SETUP = #WM_CAP_START + 64 
#WM_CAP_GET_SEQUENCE_SETUP = #WM_CAP_START + 65 
#WM_CAP_SET_MCI_DEVICE = #WM_CAP_START + 66 
#WM_CAP_GET_MCI_DEVICE = #WM_CAP_START + 67 
#WM_CAP_STOP = #WM_CAP_START + 68 
#WM_CAP_ABORT = #WM_CAP_START + 69 

#WM_CAP_SINGLE_FRAME_OPEN = #WM_CAP_START + 70 
#WM_CAP_SINGLE_FRAME_CLOSE = #WM_CAP_START + 71 
#WM_CAP_SINGLE_FRAME = #WM_CAP_START + 72 

#WM_CAP_PAL_OPEN = #WM_CAP_START + 80 
#WM_CAP_PAL_SAVE = #WM_CAP_START + 81 
#WM_CAP_PAL_PASTE = #WM_CAP_START + 82 
#WM_CAP_PAL_AUTOCREATE = #WM_CAP_START + 83 
#WM_CAP_PAL_MANUALCREATE = #WM_CAP_START + 84 

;// Following added post VFW 1.1 
#WM_CAP_SET_CALLBACK_CAPCONTROL = #WM_CAP_START + 85 

;// Defines end of the message range 
#WM_CAP_END = #WM_CAP_SET_CALLBACK_CAPCONTROL 




Procedure Cap_Stop() 
  ProcedureReturn SendMessage_(hWndPreview,#WM_CAP_STOP,0,0) 
EndProcedure 


Procedure CAP_DRIVER_DISCONNECT() 
  ProcedureReturn SendMessage_(hWndPreview,#WM_CAP_DRIVER_DISCONNECT,0,0) 
EndProcedure 

Procedure capCreateCaptureWindowA(lpszWindowName.s,dwStyle.l,x.l,y.l,Width.l,Height.l,hWndParent.l,nId.l) 
    ProcedureReturn CallFunction(#AviCap32,"capCreateCaptureWindowA", lpszWindowName, dwStyle, x, y,Width,Height,hWndParent,nId) 
EndProcedure 


Procedure capDriverConnect(i.b) 
   ProcedureReturn SendMessage_(hWndPreview,#WM_CAP_DRIVER_CONNECT,i,0) 
EndProcedure 


Procedure capPreviewRate(Rate.b) 
   ProcedureReturn SendMessage_(hWndPreview,#WM_CAP_SET_PREVIEWRATE,Rate,0) 
EndProcedure 


Procedure capPreview(Flag.b) 
   ProcedureReturn SendMessage_(hWndPreview,#WM_CAP_SET_PREVIEW,Flag,0) 
EndProcedure 


Procedure capCaptureStop() 
   ProcedureReturn SendMessage_(hWndPreview,#WM_CAP_STOP,0,0) 
EndProcedure 


Procedure capDriverDisconnect() 
   ProcedureReturn SendMessage_(hWndPreview,#WM_CAP_DRIVER_DISCONNECT,0,0) 
EndProcedure 


Procedure capGrabFrameNoStop() 
   ProcedureReturn SendMessage_(hWndPreview,#WM_CAP_GRAB_FRAME_NOSTOP,0,0) 
EndProcedure 


Procedure capEditCopy() 
   ProcedureReturn SendMessage_(hWndPreview,#WM_CAP_EDIT_COPY,0,0) 
EndProcedure 


Procedure Affichage() 
  StartDrawing(ScreenOutput()) 
    DrawText("Text") 
  StopDrawing() 
  FlipBuffers() 
  ClearScreen(170,170,170) 
EndProcedure 


Procedure Clavier() 
  ExamineKeyboard() 
  If KeyboardPushed(#PB_Key_Escape) : Sortie = 1 : EndIf 
EndProcedure 


Procedure Webcam() 
  capGrabFrameNoStop() 
  capEditCopy() 
  ImageID.l = GetClipboardData(#PB_ClipboardImage)
  ImageID = ImageSymmetryV(ImageID) 
  StartDrawing(ScreenOutput()) 
    DrawImage(ImageID,0,0) 
  StopDrawing() 
EndProcedure 








; Initialisations 
If InitSprite() = 0 Or InitKeyboard() = 0 
  MessageRequester("Erreur","Le DirectX ne peux pas être initialisé.",#MB_ICONError) 
EndIf 


; Ouverture de la DLL 
If OpenLibrary(#AviCap32,"avicap32.dll") = 0 
  MessageRequester("Erreur","La DLL avicap32.dll ne peut pas être ouverte.",#MB_ICONError) 
EndIf 


; Création de la fenêtre pour la preview 
OpenWindow(#Principale,0,0,340,260,#PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_TitleBar | #PB_Window_ScreenCentered,"WebCam - Preview") 
;  | #WS_VISIBLE 

; Creation de la fenêtre de preview 
hWndPreview = capCreateCaptureWindowA("Preview",#WS_CHILD,0,0,320,240,WindowID(#Principale),0); Le denier paramètre celon le MSDN est "Window identifier", je ne vois pas à quoi il sert. 
; On "se connecte" au driver 
capDriverConnect(0) 
; On active la preview 
capPreview(#True) 
; On met le le nombre de rafarichissemnt/seconde de la preview, mettre 15 si vous avez une caméra 15 images seconde max. 
capPreviewRate(30) 
  


; Création de la fenêtre 
; OpenWindow(#Principale,0,0,100,100,#PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_TitleBar | #PB_Window_ScreenCentered,"") 

; Ouverture de l'écran 
OpenWindowedScreen(WindowID(#Principale),10,10,320,240,0,0,0) 

Repeat 
  ClearScreen(150,150,150) 
  Select WindowEvent() 
    Case #PB_Event_CloseWindow 
      Sortie = 1 
  EndSelect 
  
  
  ; Gère le clavier 
  Clavier() 
  
  ; Gère la WebCam 
  WebCam() 
  
  ; Gère l'affichage 
  Affichage() 
  
  Delay(5) 
Until Sortie = 1 

; On arrête la fenêtre de capture 
capCaptureStop() 
; On libère la caméra : très important pour la réutiliser après et fermer l'EXE rapidement 
capDriverDisconnect() 
; On ferme les fenêtres 
DestroyWindow_(hWndPreview) 
CloseWindow(#Principale) 
; On freme la DLL 
CloseLibrary(#AviCap32) 


End 
Avatar de l’utilisateur
Thyphoon
Messages : 2706
Inscription : mer. 25/août/2004 6:31
Localisation : Eragny
Contact :

Message par Thyphoon »

c'est trop genial !!! je t'embrasserais presque !! :lol:
manque plus que la detection de mouvement :wink:
Avatar de l’utilisateur
Thyphoon
Messages : 2706
Inscription : mer. 25/août/2004 6:31
Localisation : Eragny
Contact :

Message par Thyphoon »

c'est trop genial !!! je t'embrasserais presque !! :lol:
manque plus que le plein ecran et la detection de mouvement :wink:
Avatar de l’utilisateur
Thyphoon
Messages : 2706
Inscription : mer. 25/août/2004 6:31
Localisation : Eragny
Contact :

Message par Thyphoon »

je ne sais pas si tu as remarqué mais si tu laisse tourné au bout de quelques secondes il plante et te dit que l'imageID est null
en mettant un debug j'ai remarqué que 'limageiD était a chaque fois différent ... est ce que par hasard il ne garderait pas chaque image en mémoire jusqu'a ce que la mémoire sois pleine .....
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Message par Le Soldat Inconnu »

avec ma lib, oui, vaut mieux penser à faire un DestroyImage (si je me trompe pas de nom) pour supprimer l'image crée par la symétrie.

Ma symétrie créant une nouvelle image.

Je sais pas comment utiliser le même handle d'image quand on change la taille pour la rotation de 90° ou -90°
du coup j'ai tout mis comme ça pour uniformiser rotation et symétrie dans le fonctionnement (car la symétrie, on peu utiliser la même image, la taille change pas)
c'est vrai que si c'était sur la même (avec à la rigueur une option pour créer une nouvelle image) ce serait mieux

Je vais voir pour améliorer ce point
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
Thyphoon
Messages : 2706
Inscription : mer. 25/août/2004 6:31
Localisation : Eragny
Contact :

Message par Thyphoon »

apparement ça vient bien de ta lib
la fonction pour libérer l'image d'une mémoire est freeimage(#image) or on a l'id del 'image mais pas un n°....
Oliv
Messages : 2117
Inscription : mer. 21/janv./2004 18:39

Message par Oliv »

Je vais voir ça ce soir, mais sinon Régis, quand tu as juste le pointeur du tableau, comment on fait pour connaitre l'adresse de la case ? :oops:
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Message par Le Soldat Inconnu »

c'est pas compliqué :

si on a un Tableau.l(100)

@Tableau renvoie l'élément Tableau(0)
@Tableau + 4 renvoie Tableau(1) car un long est sur 4 octects
etc...

si on a un Tableau.Truc(100) avec une structure Truc

@Tableau renvoie l'élément Tableau(0)
@Tableau + SizeOf(Truc) renvoie Tableau(1)
etc...



Pour ma lib, je vais modifier pour pouvoir renvoyer l'identifiant PB de l'image (comme avec un #PB_Any) ça sera plus simple à gérer et je mettrais une option pour créer une nouvelle image (uniquement pour les symétries)

Sinon, j'ai peut-être trouvé un truc pour optimiser, je vais testé ça.
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)]
Oliv
Messages : 2117
Inscription : mer. 21/janv./2004 18:39

Message par Oliv »

Ok :D , je vais te faire un detection du tonnaire grace à ta lib :D [/code]
Oliv
Messages : 2117
Inscription : mer. 21/janv./2004 18:39

Message par Oliv »

Avec une détection à l'intérieur du carré blanc :D :D 8) . On peut mieux faire mais c'est déjà pas mal :D

Edit, petite accélération grace à typhoon :D

Code : Tout sélectionner

; Utilise la librairie effect du Soldat Inconnu pour gagnger du temps


;- Declarations
; Constantes
Enumeration
  #Principale
  #AviCap32
EndEnumeration

; Structures

; Listes

; Buffer

; Tableaux
Dim Image(320 - 1,240 - 1) : Dim TDetection(50,50)

; Variables
Sortie.b : hWndPreview.l

Global hWndPreview,Sortie,a.l,Test.l



;  *****************************               Procedures               ***********************

;Exeption pour les contstantes cap, je les mettrai en Enumeration plus tard
#WM_CAP_START = #WM_USER 

#WM_CAP_GET_CAPSTREAMPTR = #WM_CAP_START + 1 

#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_GET_USER_DATA = #WM_CAP_START + 8 
#WM_CAP_SET_USER_DATA = #WM_CAP_START + 9 
    
#WM_CAP_DRIVER_CONNECT = #WM_CAP_START + 10 
#WM_CAP_DRIVER_DISCONNECT = #WM_CAP_START + 11 
#WM_CAP_DRIVER_GET_NAME = #WM_CAP_START + 12 
#WM_CAP_DRIVER_GET_VERSION = #WM_CAP_START + 13 
#WM_CAP_DRIVER_GET_CAPS = #WM_CAP_START + 14 

#WM_CAP_FILE_SET_CAPTURE_FILE = #WM_CAP_START + 20 
#WM_CAP_FILE_GET_CAPTURE_FILE = #WM_CAP_START + 21 
#WM_CAP_FILE_ALLOCATE = #WM_CAP_START + 22 
#WM_CAP_FILE_SAVEAS = #WM_CAP_START + 23 
#WM_CAP_FILE_SET_INFOCHUNK = #WM_CAP_START + 24 
#WM_CAP_FILE_SAVEDIB = #WM_CAP_START + 25 

#WM_CAP_EDIT_COPY = #WM_CAP_START + 30 

#WM_CAP_SET_AUDIOFORMAT = #WM_CAP_START + 35 
#WM_CAP_GET_AUDIOFORMAT = #WM_CAP_START + 36 

#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_GET_VIDEOFORMAT = #WM_CAP_START + 44 
#WM_CAP_SET_VIDEOFORMAT = #WM_CAP_START + 45 
#WM_CAP_DLG_VIDEOCOMPRESSION = #WM_CAP_START + 46 

#WM_CAP_SET_PREVIEW = #WM_CAP_START + 50 
#WM_CAP_SET_OVERLAY = #WM_CAP_START + 51 
#WM_CAP_SET_PREVIEWRATE = #WM_CAP_START + 52 
#WM_CAP_SET_SCALE = #WM_CAP_START + 53 
#WM_CAP_GET_STATUS = #WM_CAP_START + 54 
#WM_CAP_SET_SCROLL = #WM_CAP_START + 55 

#WM_CAP_GRAB_FRAME = #WM_CAP_START + 60 
#WM_CAP_GRAB_FRAME_NOSTOP = #WM_CAP_START + 61 

#WM_CAP_SEQUENCE = #WM_CAP_START + 62 
#WM_CAP_SEQUENCE_NOFILE = #WM_CAP_START + 63 
#WM_CAP_SET_SEQUENCE_SETUP = #WM_CAP_START + 64 
#WM_CAP_GET_SEQUENCE_SETUP = #WM_CAP_START + 65 
#WM_CAP_SET_MCI_DEVICE = #WM_CAP_START + 66 
#WM_CAP_GET_MCI_DEVICE = #WM_CAP_START + 67 
#WM_CAP_STOP = #WM_CAP_START + 68 
#WM_CAP_ABORT = #WM_CAP_START + 69 

#WM_CAP_SINGLE_FRAME_OPEN = #WM_CAP_START + 70 
#WM_CAP_SINGLE_FRAME_CLOSE = #WM_CAP_START + 71 
#WM_CAP_SINGLE_FRAME = #WM_CAP_START + 72 

#WM_CAP_PAL_OPEN = #WM_CAP_START + 80 
#WM_CAP_PAL_SAVE = #WM_CAP_START + 81 
#WM_CAP_PAL_PASTE = #WM_CAP_START + 82 
#WM_CAP_PAL_AUTOCREATE = #WM_CAP_START + 83 
#WM_CAP_PAL_MANUALCREATE = #WM_CAP_START + 84 

;// Following added post VFW 1.1 
#WM_CAP_SET_CALLBACK_CAPCONTROL = #WM_CAP_START + 85 

;// Defines end of the message range 
#WM_CAP_END = #WM_CAP_SET_CALLBACK_CAPCONTROL 




Procedure Cap_Stop()
  ProcedureReturn SendMessage_(hWndPreview,#WM_CAP_STOP,0,0)
EndProcedure


Procedure CAP_DRIVER_DISCONNECT()
  ProcedureReturn SendMessage_(hWndPreview,#WM_CAP_DRIVER_DISCONNECT,0,0)
EndProcedure

Procedure capCreateCaptureWindowA(lpszWindowName.s,dwStyle.l,x.l,y.l,Width.l,Height.l,hWndParent.l,nId.l) 
    ProcedureReturn CallFunction(#AviCap32,"capCreateCaptureWindowA", lpszWindowName, dwStyle, x, y,Width,Height,hWndParent,nId) 
EndProcedure


Procedure capDriverConnect(i.b) 
   ProcedureReturn SendMessage_(hWndPreview,#WM_CAP_DRIVER_CONNECT,i,0) 
EndProcedure 


Procedure capPreviewRate(Rate.b) 
   ProcedureReturn SendMessage_(hWndPreview,#WM_CAP_SET_PREVIEWRATE,Rate,0) 
EndProcedure


Procedure capPreview(Flag.b) 
   ProcedureReturn SendMessage_(hWndPreview,#WM_CAP_SET_PREVIEW,Flag,0) 
EndProcedure 


Procedure capCaptureStop() 
   ProcedureReturn SendMessage_(hWndPreview,#WM_CAP_STOP,0,0) 
EndProcedure


Procedure capDriverDisconnect() 
   ProcedureReturn SendMessage_(hWndPreview,#WM_CAP_DRIVER_DISCONNECT,0,0) 
EndProcedure 


Procedure capGrabFrameNoStop() 
   ProcedureReturn SendMessage_(hWndPreview,#WM_CAP_GRAB_FRAME_NOSTOP,0,0) 
EndProcedure


Procedure capEditCopy() 
   ProcedureReturn SendMessage_(hWndPreview,#WM_CAP_EDIT_COPY,0,0) 
EndProcedure

; Action à 0 reprends une nouvelle image et à 1 compare
; Differents est le nombre de pixels qui doivent êtres différents pour que la détection soit faite


Procedure Affichage()
  StartDrawing(ScreenOutput())
    DrawImage(1,0,0)
    LineXY(0,0,0,100,$FFFFFF)
    LineXY(0,100,100,100,$FFFFFF)
    LineXY(100,100,100,0,$FFFFFF)
    LineXY(100,0,0,0,$FFFFFF)
  StopDrawing()
  FlipBuffers()
  ClearScreen(170,170,170)
EndProcedure


Procedure Clavier()
  ExamineKeyboard()
  If KeyboardPushed(#PB_Key_Escape) : Sortie = 1 : EndIf
EndProcedure


Procedure Detection(X.l,Y.l,Largeur.l,Hauteur.l,Action.b)
  Couleur.l
  If Action = 1
    For n = X To Largeur
      For nn = Y To Hauteur
        TDetection(n,nn) = ColorGrey(Image(n,nn))
      Next nn
    Next n
  Else
    For n = X To Largeur
      For nn = Y To Hauteur
        Couleur.l = ColorGrey(Image(n,nn))
        Rouge = Abs(Red(TDetection(n,nn)) - Red(Couleur))
        Vert = Abs(Green(TDetection(n,nn)) - Green(Couleur))
        Bleu = Abs(Blue(TDetection(n,nn)) - Blue(Couleur))
        If Rouge + Vert + Bleu < 40 ; Jouer sur ce paramètre
          id + 1
        Else
          dif + 1
        EndIf
      Next nn
    Next n
  EndIf
  If dif > 800 : Debug "Detection" : EndIf ; et celui ci pour modifier la détection
EndProcedure


Procedure Webcam()
  Shared Test
  capGrabFrameNoStop() 
  capEditCopy()
  ImageID.l = GetClipboardData(#PB_ClipboardImage)
  ; ImageID = ImageSymmetryV(ImageID)
  GetImageBits(ImageID,@Image())
  StartDrawing(ScreenOutput()) 
    DrawImage(ImageID,0,0) 
  StopDrawing()
  If Test = 0
    Test = 1
    Detection(0,0,50,50,1)
  Else
    Detection(0,0,50,50,0)
  EndIf
EndProcedure








; Initialisations
If InitSprite() = 0 Or InitKeyboard() = 0
  MessageRequester("Erreur","Le DirectX ne peux pas être initialisé.",#MB_ICONError)
EndIf


; Ouverture de la DLL
If OpenLibrary(#AviCap32,"avicap32.dll") = 0 
  MessageRequester("Erreur","La DLL avicap32.dll ne peut pas être ouverte.",#MB_ICONError)
EndIf


; Création de la fenêtre pour la preview
OpenWindow(#Principale,0,0,340,260,#PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_TitleBar | #PB_Window_ScreenCentered,"WebCam - Preview")
;  | #WS_VISIBLE

; Creation de la fenêtre de preview
hWndPreview = capCreateCaptureWindowA("Preview",#WS_CHILD,0,0,320,240,WindowID(#Principale),0); Le denier paramètre celon le MSDN est "Window identifier", je ne vois pas à quoi il sert.
; On "se connecte" au driver
capDriverConnect(0)
; On active la preview
capPreview(#True)
; On met le le nombre de rafarichissemnt/seconde de la preview, mettre 15 si vous avez une caméra 15 images seconde max.
capPreviewRate(30) 
  
; Ouverture de l'écran
OpenWindowedScreen(WindowID(#Principale),10,10,320,240,0,0,0)

Delay(5000) ; attend que la caméra fasse le réglage des couleurs
Repeat
  ClearScreen(150,150,150)
  Select WindowEvent()
    Case #PB_Event_CloseWindow
      Sortie = 1
  EndSelect
  
  
  ; Gère le clavier
  Clavier() 
  
  ; Gère la WebCam
  WebCam()
  
  ; Gère l'affichage
  Affichage()
  
  Delay(5)
Until Sortie = 1

; On arrête la fenêtre de capture
capCaptureStop()
; On libère la caméra : très important pour la réutiliser après et fermer l'EXE rapidement
capDriverDisconnect()
; On ferme les fenêtres
DestroyWindow_(hWndPreview)
CloseWindow(#Principale)
; On freme la DLL
CloseLibrary(#AviCap32)


End
Avatar de l’utilisateur
Thyphoon
Messages : 2706
Inscription : mer. 25/août/2004 6:31
Localisation : Eragny
Contact :

Message par Thyphoon »

j'ai fait quelques modifications
Une fonction pour faire une symetrie de l'image !
Et la possibilité de traité la detection par un multiple !
1, 2 ou 4

mais ce n'est pas parfait car le seuil de detection est apparement lié a la taille du tableau de detection ....
Enfin voilà c'est déjà une piste ...

Code : Tout sélectionner

hdc.l = GetDC_(0) 
ReleaseDC_(0, hdc) 

Procedure MirrorImage(image.l, Direction.l) 
UseImage(image)
  hdc = StartDrawing(ImageOutput()) 
    Height = ImageHeight() 
    Width = ImageWidth() 
    If Direction 
      StretchBlt_(hdc, 0, Height-1, Width, -Height, hdc, 0, 0, Width, Height, #SRCCOPY) 
    Else 
      StretchBlt_(hdc, Width-1, 0, -Width, Height, hdc, 0, 0, Width, Height, #SRCCOPY) 
    EndIf 
  StopDrawing() 
EndProcedure 

; Utilise la librairie effect du Soldat Inconnu pour gagnger du temps 


;- Declarations 
; Constantes 
Enumeration 
  #Principale 
  #AviCap32 
EndEnumeration 

; Structures 

; Listes 

; Buffer 

; Tableaux 
Dim Image(320 - 1,240 - 1) : Dim TDetection(100,100) 

; Variables 
Sortie.b : hWndPreview.l 

Global hWndPreview,Sortie,a.l,Test.l 



;  *****************************               Procedures               *********************** 

;Exeption pour les contstantes cap, je les mettrai en Enumeration plus tard 
#WM_CAP_START = #WM_USER 

#WM_CAP_GET_CAPSTREAMPTR = #WM_CAP_START + 1 

#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_GET_USER_DATA = #WM_CAP_START + 8 
#WM_CAP_SET_USER_DATA = #WM_CAP_START + 9 
    
#WM_CAP_DRIVER_CONNECT = #WM_CAP_START + 10 
#WM_CAP_DRIVER_DISCONNECT = #WM_CAP_START + 11 
#WM_CAP_DRIVER_GET_NAME = #WM_CAP_START + 12 
#WM_CAP_DRIVER_GET_VERSION = #WM_CAP_START + 13 
#WM_CAP_DRIVER_GET_CAPS = #WM_CAP_START + 14 

#WM_CAP_FILE_SET_CAPTURE_FILE = #WM_CAP_START + 20 
#WM_CAP_FILE_GET_CAPTURE_FILE = #WM_CAP_START + 21 
#WM_CAP_FILE_ALLOCATE = #WM_CAP_START + 22 
#WM_CAP_FILE_SAVEAS = #WM_CAP_START + 23 
#WM_CAP_FILE_SET_INFOCHUNK = #WM_CAP_START + 24 
#WM_CAP_FILE_SAVEDIB = #WM_CAP_START + 25 

#WM_CAP_EDIT_COPY = #WM_CAP_START + 30 

#WM_CAP_SET_AUDIOFORMAT = #WM_CAP_START + 35 
#WM_CAP_GET_AUDIOFORMAT = #WM_CAP_START + 36 

#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_GET_VIDEOFORMAT = #WM_CAP_START + 44 
#WM_CAP_SET_VIDEOFORMAT = #WM_CAP_START + 45 
#WM_CAP_DLG_VIDEOCOMPRESSION = #WM_CAP_START + 46 

#WM_CAP_SET_PREVIEW = #WM_CAP_START + 50 
#WM_CAP_SET_OVERLAY = #WM_CAP_START + 51 
#WM_CAP_SET_PREVIEWRATE = #WM_CAP_START + 52 
#WM_CAP_SET_SCALE = #WM_CAP_START + 53 
#WM_CAP_GET_STATUS = #WM_CAP_START + 54 
#WM_CAP_SET_SCROLL = #WM_CAP_START + 55 

#WM_CAP_GRAB_FRAME = #WM_CAP_START + 60 
#WM_CAP_GRAB_FRAME_NOSTOP = #WM_CAP_START + 61 

#WM_CAP_SEQUENCE = #WM_CAP_START + 62 
#WM_CAP_SEQUENCE_NOFILE = #WM_CAP_START + 63 
#WM_CAP_SET_SEQUENCE_SETUP = #WM_CAP_START + 64 
#WM_CAP_GET_SEQUENCE_SETUP = #WM_CAP_START + 65 
#WM_CAP_SET_MCI_DEVICE = #WM_CAP_START + 66 
#WM_CAP_GET_MCI_DEVICE = #WM_CAP_START + 67 
#WM_CAP_STOP = #WM_CAP_START + 68 
#WM_CAP_ABORT = #WM_CAP_START + 69 

#WM_CAP_SINGLE_FRAME_OPEN = #WM_CAP_START + 70 
#WM_CAP_SINGLE_FRAME_CLOSE = #WM_CAP_START + 71 
#WM_CAP_SINGLE_FRAME = #WM_CAP_START + 72 

#WM_CAP_PAL_OPEN = #WM_CAP_START + 80 
#WM_CAP_PAL_SAVE = #WM_CAP_START + 81 
#WM_CAP_PAL_PASTE = #WM_CAP_START + 82 
#WM_CAP_PAL_AUTOCREATE = #WM_CAP_START + 83 
#WM_CAP_PAL_MANUALCREATE = #WM_CAP_START + 84 

;// Following added post VFW 1.1 
#WM_CAP_SET_CALLBACK_CAPCONTROL = #WM_CAP_START + 85 

;// Defines end of the message range 
#WM_CAP_END = #WM_CAP_SET_CALLBACK_CAPCONTROL 




Procedure Cap_Stop() 
  ProcedureReturn SendMessage_(hWndPreview,#WM_CAP_STOP,0,0) 
EndProcedure 


Procedure CAP_DRIVER_DISCONNECT() 
  ProcedureReturn SendMessage_(hWndPreview,#WM_CAP_DRIVER_DISCONNECT,0,0) 
EndProcedure 

Procedure capCreateCaptureWindowA(lpszWindowName.s,dwStyle.l,x.l,y.l,Width.l,Height.l,hWndParent.l,nId.l) 
    ProcedureReturn CallFunction(#AviCap32,"capCreateCaptureWindowA", lpszWindowName, dwStyle, x, y,Width,Height,hWndParent,nId) 
EndProcedure 


Procedure capDriverConnect(i.b) 
   ProcedureReturn SendMessage_(hWndPreview,#WM_CAP_DRIVER_CONNECT,i,0) 
EndProcedure 


Procedure capPreviewRate(Rate.b) 
   ProcedureReturn SendMessage_(hWndPreview,#WM_CAP_SET_PREVIEWRATE,Rate,0) 
EndProcedure 


Procedure capPreview(Flag.b) 
   ProcedureReturn SendMessage_(hWndPreview,#WM_CAP_SET_PREVIEW,Flag,0) 
EndProcedure 


Procedure capCaptureStop() 
   ProcedureReturn SendMessage_(hWndPreview,#WM_CAP_STOP,0,0) 
EndProcedure 


Procedure capDriverDisconnect() 
   ProcedureReturn SendMessage_(hWndPreview,#WM_CAP_DRIVER_DISCONNECT,0,0) 
EndProcedure 


Procedure capGrabFrameNoStop() 
   ProcedureReturn SendMessage_(hWndPreview,#WM_CAP_GRAB_FRAME_NOSTOP,0,0) 
EndProcedure 


Procedure capEditCopy() 
   ProcedureReturn SendMessage_(hWndPreview,#WM_CAP_EDIT_COPY,0,0) 
EndProcedure 

; Action à 0 reprends une nouvelle image et à 1 compare 
; Differents est le nombre de pixels qui doivent êtres différents pour que la détection soit faite 


Procedure Affichage() 
  StartDrawing(ScreenOutput()) 
    DrawImage(1,0,0) 
    LineXY(0,0,0,100,$FFFFFF) 
    LineXY(0,100,100,100,$FFFFFF) 
    LineXY(100,100,100,0,$FFFFFF) 
    LineXY(100,0,0,0,$FFFFFF) 
  StopDrawing() 
  FlipBuffers() 
  ClearScreen(170,170,170) 
EndProcedure 


Procedure Clavier() 
  ExamineKeyboard() 
  If KeyboardPushed(#PB_Key_Escape) : Sortie = 1 : EndIf 
EndProcedure 


Procedure Detection(X.l,Y.l,Largeur.l,Hauteur.l,Action.b,Mult.l) 
  Couleur.l 
  If Action = 1 
    n= X
    While n< Largeur
      n=n+Mult
      nn = Y
      While nn<Hauteur
      nn=nn+Mult
        TDetection(n,nn) = ColorGrey(Image(n,nn)) 
      Wend
    Wend 
  Else 
    a.l = ElapsedMilliseconds() 
    n= X
    While n< Largeur
      n=n+Mult
      nn = Y
      While nn<Hauteur
      nn=nn+Mult

        Couleur.l = ColorGrey(Image(n,nn)) 
        Rouge = Abs(Red(TDetection(n,nn)) - Red(Couleur)) 
        Vert = Abs(Green(TDetection(n,nn)) - Green(Couleur)) 
        Bleu = Abs(Blue(TDetection(n,nn)) - Blue(Couleur)) 
        If Rouge + Vert + Bleu < 40 ; Jouer sur ce paramètre 
          id + 1 
        Else 
          dif + 1 * Mult
        EndIf 
      Wend
    Wend
    a = ElapsedMilliseconds() - a 
    Debug dif
  EndIf 
  If dif > 800 : Debug "Detection" : EndIf ; et celui ci pour modifier la détection 
EndProcedure 


Procedure Webcam() 
  Shared Test 
  capGrabFrameNoStop() 
  capEditCopy() 
  ImageID.l = GetClipboardData(#PB_ClipboardImage) 
  ; ImageID = ImageSymmetryV(ImageID) 
  

  ImageID2=UseImage(0)
  StartDrawing(ImageOutput()) 
    DrawImage(ImageID,0,0) 
  StopDrawing()   
 MirrorImage(0, 0)
 ImageID=ImageID2
   GetImageBits(ImageID,@Image())
 
  StartDrawing(ScreenOutput()) 
    DrawImage(ImageID,0,0) 
  StopDrawing() 
  If Test = 0 
    Test = 1 
    Detection(0,0,50,50,1,4) 
  Else 
    Detection(0,0,50,50,0,4) 
  EndIf 
EndProcedure 








; Initialisations 
If InitSprite() = 0 Or InitKeyboard() = 0 
  MessageRequester("Erreur","Le DirectX ne peux pas être initialisé.",#MB_ICONError) 
EndIf 


; Ouverture de la DLL 
If OpenLibrary(#AviCap32,"avicap32.dll") = 0 
  MessageRequester("Erreur","La DLL avicap32.dll ne peut pas être ouverte.",#MB_ICONError) 
EndIf 


; Création de la fenêtre pour la preview 
OpenWindow(#Principale,0,0,340,260,#PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_TitleBar | #PB_Window_ScreenCentered,"WebCam - Preview") 
;  | #WS_VISIBLE 

; Creation de la fenêtre de preview 
hWndPreview = capCreateCaptureWindowA("Preview",#WS_CHILD,0,0,320,240,WindowID(#Principale),0); Le denier paramètre celon le MSDN est "Window identifier", je ne vois pas à quoi il sert. 
; On "se connecte" au driver 
capDriverConnect(0) 
; On active la preview 
capPreview(#True) 
; On met le le nombre de rafarichissemnt/seconde de la preview, mettre 15 si vous avez une caméra 15 images seconde max. 
capPreviewRate(0) 
  
; Ouverture de l'écran 
OpenWindowedScreen(WindowID(#Principale),10,10,320,240,0,0,0) 

CreateImage(0,320,240) ; On créer l'image pour faire la symetrie
Delay(5000) ; attend que la caméra fasse le réglage des couleurs 
Repeat 
  ClearScreen(150,150,150) 
  Select WindowEvent() 
    Case #PB_Event_CloseWindow 
      Sortie = 1 
  EndSelect 
  
  
  ; Gère le clavier 
  Clavier() 
  
  ; Gère la WebCam 
  WebCam() 
  
  ; Gère l'affichage 
  Affichage() 
  
  Delay(5) 
Until Sortie = 1 

; On arrête la fenêtre de capture 
capCaptureStop() 
; On libère la caméra : très important pour la réutiliser après et fermer l'EXE rapidement 
capDriverDisconnect() 
; On ferme les fenêtres 
DestroyWindow_(hWndPreview) 
CloseWindow(#Principale) 
; On freme la DLL 
CloseLibrary(#AviCap32) 


End 
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Message par Le Soldat Inconnu »

j'ai noté une erreur dans ton code, voir tes MP
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
Thyphoon
Messages : 2706
Inscription : mer. 25/août/2004 6:31
Localisation : Eragny
Contact :

Message par Thyphoon »

petite obtimisation
vu qu'on est en niveau de gris alors le rouge=vert=bleu

donc on peu remplasser

Code : Tout sélectionner

 Couleur.l = ColorGrey(Image(n,nn)) 
        Rouge = Abs(Red(TDetection(n,nn)) - Red(Couleur)) 
        Vert = Abs(Green(TDetection(n,nn)) - Green(Couleur)) 
        Bleu = Abs(Blue(TDetection(n,nn)) - Blue(Couleur)) 
        If Rouge + Vert + Bleu < 40 ; Jouer sur ce paramètre 
par

Code : Tout sélectionner

  Couleur.l = ColorGrey(Image(n,nn)) 
        Rouge = Abs(Red(TDetection(n,nn)) - Red(Couleur)) 
        If Rouge*3 < 40 ; Jouer sur ce paramètre 
parcontre je comprend pas trop d'ou vient le 800 de la ligne

Code : Tout sélectionner

If dif > 800 : Debug "Detection" : EndIf
j'ai l'impression qu'il est lié a la taille de la zone a detecté et non pas a un pourcentage de cette zone bougé ! Non ?
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Message par Le Soldat Inconnu »

Code : Tout sélectionner

If Rouge < 40 / 3 ; Jouer sur ce paramètre
c'est mieux car 40 / 3 sera directement simplifié par le compilo et on supprime un calcul.
c'est une des remarque que j'ai fais dans mon MP :wink:

l'autre erreur est la (dans le code d'Oliv)
For n = X To Largeur + X
For nn = Y To Hauteur + Y
TDetection(n,nn) = ColorGrey(Image(n,nn))
Next nn
Next n
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)]
Répondre