[..] Webcam Snap
Règles du forum
- Merci de consulter la section "Règles du forum" et plus particulièrement "Règles et Mentions Légales du site autoitscript.fr" avant d'écrire un message.
- TommyDDR
- Modérateur
- Messages : 2109
- Enregistré le : mar. 22 juil. 2008 21:55
- Localisation : Nantes
- Status : Hors ligne
[..] Webcam Snap
Bonjour,
Je cherche récupérer une image de la webcam mais sans passer par un fichier, je veux récupérer un bitmap ou un handle de bitmap
J'utilise l'UDF Webcam.au3 mais il me permet seulement de prendre une image en l'enregistrant dans un fichier (http://www.autoitscript.com/forum/topic ... ebcam-udf/)
Merci.
Je cherche récupérer une image de la webcam mais sans passer par un fichier, je veux récupérer un bitmap ou un handle de bitmap
J'utilise l'UDF Webcam.au3 mais il me permet seulement de prendre une image en l'enregistrant dans un fichier (http://www.autoitscript.com/forum/topic ... ebcam-udf/)
Merci.
3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679
- moi
- Niveau 7
- Messages : 370
- Enregistré le : sam. 09 juil. 2011 22:14
- Localisation : devant sont ordinateur
- Status : Hors ligne
Re: [..] Webcam Snap
est ce que l'UDF sur le forum us et le meme que celui poster sur ce forum?
le problème ce n'est pas un problème, le seul problème ici c'est nous.
j'aime NYAN CAT
j'aime NYAN CAT

- Tlem
- Site Admin
- Messages : 11798
- Enregistré le : ven. 20 juil. 2007 21:00
- Localisation : Bordeaux
- Status : Hors ligne
Re: [..] Webcam Snap
A première vue, _WebcamOpen() permet l'overlay de l'image dans une GUI, donc on peut imaginer une GUI 'non visible' et la capture de l'image directement à partir de cette GUI.
Par contre, comme la GUI serait 'non visible', je ne suis pas du tout persuadé que cela fonctionne.
Une autre solution, serait de ce procurer la doc complète de avicap32.dll et de voir si il est possible de faire ce que vous souhaitez directement par la dll. Peut être qu'en reprenant la fonction _WebcamSnap(), il serait possible de remplacerpar la sauvegarde en mémoire.
Par contre, comme la GUI serait 'non visible', je ne suis pas du tout persuadé que cela fonctionne.
Une autre solution, serait de ce procurer la doc complète de avicap32.dll et de voir si il est possible de faire ce que vous souhaitez directement par la dll. Peut être qu'en reprenant la fonction _WebcamSnap(), il serait possible de remplacer
Code : Tout sélectionner
DllCall($user, "int", "SendMessage", "hWnd", $sId, "int", [color=#FF0000]$WM_CAP_FILE_SAVEDIBA[/color], "int", 0, "str", $sFile)
Thierry
Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...
Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".
Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...
Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".
- mikell
- Spammer !
- Messages : 6292
- Enregistré le : dim. 29 mai 2011 17:32
- Localisation : Deep Cévennes
- Status : Hors ligne
Re: [..] Webcam Snap
La liste n'est pas très encourageante (WM_CAP_GRAB_FRAME_NOSTOP ?)
http://msdn.microsoft.com/en-us/library ... 85%29.aspx
Heu ne pratiquant pas la webcam, je vais peut-être dire une bêtise, mais pourquoi ne pas utiliser le _ScreenCapture_CaptureWnd qui peut sortir un HBitmap ?
http://msdn.microsoft.com/en-us/library ... 85%29.aspx
Heu ne pratiquant pas la webcam, je vais peut-être dire une bêtise, mais pourquoi ne pas utiliser le _ScreenCapture_CaptureWnd qui peut sortir un HBitmap ?
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
- TommyDDR
- Modérateur
- Messages : 2109
- Enregistré le : mar. 22 juil. 2008 21:55
- Localisation : Nantes
- Status : Hors ligne
Re: [..] Webcam Snap
Parce que _ScreenCapture_CaptureWnd va attendre le Handle d'une fenêtre qui doit être visible à l'écran
(Ma fenêtre ne sera pas visible)
Pour WM_CAP_GRAB_FRAME_NOSTOP, c'est ce qu'il se passe déjà pour le _Webcam_Snap de l'UDF, (associé à une écriture dans un fichier) si j'ai bien compris, WM_CAP_GRAB_FRAME_NOSTOP va mettre l image actuelle dans un buffer, il faudrait avoir accès à ce buffer...
Je vais me pencher de ce coté.
Edit : Voila ce que j'ai trouvé :
Avec $WM_CAP_SET_CALLBACK_FRAME, je peux mettre une fonction de callback à chaque frame.
J'ai donc créé la fonction dans Webcam.au3 :
Je mets ensuite la ligne dans mon code :
et la fonction :
Je ne suis pas sur du "int;ptr;ptr;ptr".
D'apres msdn ca aurai plutot été "int;videohdr" mais videohdr n'existant pas, j'ai du tatoner...
Quoi qu'il en soit, ma fonction est bien appelée à chaque frame généré, j'ai 4 parametres :
Le handle de la fenetre et 3 pointeurs (et oui, je ne sais toujours pas à quoi ils vont me servir)
J'ai essayé des fonctions GDI plus en pensant que ça seraient des hBitmap ou autre mais en vain.
Ô grand Tlem, puissiez vous me venir en aide.
(Ma fenêtre ne sera pas visible)
Pour WM_CAP_GRAB_FRAME_NOSTOP, c'est ce qu'il se passe déjà pour le _Webcam_Snap de l'UDF, (associé à une écriture dans un fichier) si j'ai bien compris, WM_CAP_GRAB_FRAME_NOSTOP va mettre l image actuelle dans un buffer, il faudrait avoir accès à ce buffer...
Je vais me pencher de ce coté.
Edit : Voila ce que j'ai trouvé :
Avec $WM_CAP_SET_CALLBACK_FRAME, je peux mettre une fonction de callback à chaque frame.
J'ai donc créé la fonction dans Webcam.au3 :
Code : Tout sélectionner
Func _WebcamSetCallBackFram($sId, $func)
$CallBack = DllCallbackRegister($func, "long", "int;ptr;ptr;ptr")
DllCall($user, "int", "SendMessage", "hWnd", $sId, "int", $WM_CAP_SET_CALLBACK_FRAME, "int", 0, "lparam", DllCallbackGetPtr($CallBack))
If(@error) Then
ToolTip("erf")
EndIf
EndFunc
Code : Tout sélectionner
_WebcamSetCallBackFram($camera, "frameCallBack")
Code : Tout sélectionner
Func frameCallBack($Hwnd, $param1, $param2, $param3)
EndFunc
D'apres msdn ca aurai plutot été "int;videohdr" mais videohdr n'existant pas, j'ai du tatoner...
Quoi qu'il en soit, ma fonction est bien appelée à chaque frame généré, j'ai 4 parametres :
Le handle de la fenetre et 3 pointeurs (et oui, je ne sais toujours pas à quoi ils vont me servir)
J'ai essayé des fonctions GDI plus en pensant que ça seraient des hBitmap ou autre mais en vain.
Ô grand Tlem, puissiez vous me venir en aide.
3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679
- matwachich
- Membre émérite
- Messages : 986
- Enregistré le : lun. 19 oct. 2009 04:04
- Localisation : Algérie
- Status : Hors ligne
Re: [..] Webcam Snap
ça: http://msdn.microsoft.com/en-us/library ... s.85).aspx nous mène à
ça: http://msdn.microsoft.com/en-us/library ... s.85).aspx
Dans le dernier lien, je suis sur que LPBYTE lpData a quelque chose à voir avec la fonction _GDIPlus_BitmapLock
Après ça... trop fatigué ce soir pour tatoner! je verrais peut être demain
ça: http://msdn.microsoft.com/en-us/library ... s.85).aspx
Dans le dernier lien, je suis sur que LPBYTE lpData a quelque chose à voir avec la fonction _GDIPlus_BitmapLock
Après ça... trop fatigué ce soir pour tatoner! je verrais peut être demain
Sortons VW du coté obscure! - La curiosité est un vilain défaut! Cliquez ici
- matwachich
- Membre émérite
- Messages : 986
- Enregistré le : lun. 19 oct. 2009 04:04
- Localisation : Algérie
- Status : Hors ligne
Re: [..] Webcam Snap
Voila ce que j'ai fais, mais ça marche pas, et je crois savoir ou est le problème:
C'est qu'il faudrait traduire cet Structure en une chaine compréhensible par DllStructCreate
C'est qu'il faudrait traduire cet Structure en une chaine compréhensible par DllStructCreate
Code : Tout sélectionner
typedef struct videohdr_tag {
LPBYTE lpData;
DWORD dwBufferLength;
DWORD dwBytesUsed;
DWORD dwTimeCaptured;
DWORD_PTR dwUser;
DWORD dwFlags;
DWORD_PTR dwReserved[4];
} VIDEOHDR, *PVIDEOHDR, *LPVIDEOHDR;
► Afficher le texte
Sortons VW du coté obscure! - La curiosité est un vilain défaut! Cliquez ici
Re: [..] Webcam Snap
Ma solution va peut-être paraître barbare, mais néanmoins je ne vois pas trop d’inconvénients à son utilisation : Il suffit d'enregistrer l'image dans les fichiers temporaires, de l'afficher dans une GUI (ou où vous voulez) et de la supprimer.
- Tlem
- Site Admin
- Messages : 11798
- Enregistré le : ven. 20 juil. 2007 21:00
- Localisation : Bordeaux
- Status : Hors ligne
Re: [..] Webcam Snap
TommyDDR à préciser qu'il ne souhaitait pas passer par un fichier.
Pourquoi lui proposer quelque chose qu'il connait déjà !!!
PS @TommyDDR : J'ai fouiller pas mal, mais rien trouvé qui permet de passer les infos ailleurs que par un fichier. Peut probablement lié à la dll.
Il faudrait sans doute utiliser une autre dll qui intègre une fonction de transfert des données vers autre chose qu'un fichier.
Pourquoi lui proposer quelque chose qu'il connait déjà !!!
PS @TommyDDR : J'ai fouiller pas mal, mais rien trouvé qui permet de passer les infos ailleurs que par un fichier. Peut probablement lié à la dll.
Il faudrait sans doute utiliser une autre dll qui intègre une fonction de transfert des données vers autre chose qu'un fichier.
Thierry
Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...
Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".
Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...
Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".
- TommyDDR
- Modérateur
- Messages : 2109
- Enregistré le : mar. 22 juil. 2008 21:55
- Localisation : Nantes
- Status : Hors ligne
Re: [..] Webcam Snap
Merci Tlem, j'ai aussi chercher par la DLL mais en vain.
3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679
- Jerome
- Niveau 9
- Messages : 661
- Enregistré le : mar. 07 avr. 2009 08:35
- Localisation : Picardie
- Status : Hors ligne
Re: [..] Webcam Snap
Coucou,
Peut - être une piste pour toi, je travaille actuellement sur des caméra IP et à récupérer le flux vidéo.
Je pense que pour ta webcam, c'est un peu la même chose (même si c'est différent
)
Regarde du côté de l'ActiveX, tu auras peut - être un début de piste.
?
Jérôme
Peut - être une piste pour toi, je travaille actuellement sur des caméra IP et à récupérer le flux vidéo.
Je pense que pour ta webcam, c'est un peu la même chose (même si c'est différent

Regarde du côté de l'ActiveX, tu auras peut - être un début de piste.
?
Jérôme
- Ghost911
- Niveau 5
- Messages : 166
- Enregistré le : mar. 21 oct. 2008 17:57
- Localisation : Bordeaux
- Status : Hors ligne
Re: [..] Webcam Snap
bonjour tout le monde quelqu'un a trouver une solution a se problème ? je cherche la même chose mettre l'image de webcam dans un buffer sans fichiers temporaires !
- TommyDDR
- Modérateur
- Messages : 2109
- Enregistré le : mar. 22 juil. 2008 21:55
- Localisation : Nantes
- Status : Hors ligne
Re: [..] Webcam Snap
Je me suis repenché sur la question, ce fut un long périple, le code de matwachich m'a mis sur la piste 
J'ai le plaisir de vous informer que... J'ai réussi !!!
@matwachich : en fait, la donnée lpdata était un pointeur vers les octets représentant les couleurs de l'image et de taille dwBufferLength (ouch ^^), j'ai donc du faire une fonction CreateBmpByPixels qui permet de transformer ces couleurs non exploitables (en tout cas je ne sais pas les exploiter comme ça) en une structure BMP.
C'est la que l UDF Bitmap_String.au3 nous sauve
Seul inconvénient, il faut connaitre la taille de l'image par avance, mais je crois que pour toutes les webcam c'est 320*240
EDIT : Au temps pour moi, je viens de faire un test avec une autre webcam... 640*480
Je vais voir comment récupérer la résolution.
EDIT Bis : Et voila, j'ai ajouté _WebcamGetResolution($CamID) qui renvoit un tableau de 2 cases [TailleX, $TailleY]
Attention, si vous laissez
Dans le _WebcamOpen, alors votre callback sera appelé en boucle (parce que le PREVIEWRATE créé des frame et donc le callback est appellé)
Je vous met aussi à disposition les 2 includes nécéssaires :
Bitmap_String.au3 (disponible sur le forum US mais je ne retrouve plus le lien)
Webcam.au3 (modifié) (Voir plus bas)

J'ai le plaisir de vous informer que... J'ai réussi !!!

@matwachich : en fait, la donnée lpdata était un pointeur vers les octets représentant les couleurs de l'image et de taille dwBufferLength (ouch ^^), j'ai donc du faire une fonction CreateBmpByPixels qui permet de transformer ces couleurs non exploitables (en tout cas je ne sais pas les exploiter comme ça) en une structure BMP.
C'est la que l UDF Bitmap_String.au3 nous sauve

Seul inconvénient, il faut connaitre la taille de l'image par avance, mais je crois que pour toutes les webcam c'est 320*240
EDIT : Au temps pour moi, je viens de faire un test avec une autre webcam... 640*480
Je vais voir comment récupérer la résolution.
EDIT Bis : Et voila, j'ai ajouté _WebcamGetResolution($CamID) qui renvoit un tableau de 2 cases [TailleX, $TailleY]
Attention, si vous laissez
Code : Tout sélectionner
DllCall($user, "int", "SendMessage", "hWnd", $cap[0], "int", $WM_CAP_SET_PREVIEWRATE, "int", 1, "int", 0)
► Afficher le texteExemple
Bitmap_String.au3 (disponible sur le forum US mais je ne retrouve plus le lien)
Webcam.au3 (modifié)
3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679
- TommyDDR
- Modérateur
- Messages : 2109
- Enregistré le : mar. 22 juil. 2008 21:55
- Localisation : Nantes
- Status : Hors ligne
Re: [..] Webcam Snap
Je post un nouveau message pour pas mettre plus le bor**l que ça dans mon précédent post ^^'.
J'ai finalement fait plusieurs tests... certaines webcam font des compressions et... je ne vois pas du tout comment gérer ça.
Je vous met à disposition là où je suis rendu (fonctionne très bien si biCompression = 0) sinon, je force la compression (seulement l'entête du fichier) à 0 pour avoir un pseudo rendu (les formes apparaissent mais les couleurs ne sont pas bonnes et l'image est retournée (le haut est en bas).
Si une âme charitable passe par ici... je suis preneur.
J'ai finalement fait plusieurs tests... certaines webcam font des compressions et... je ne vois pas du tout comment gérer ça.
Je vous met à disposition là où je suis rendu (fonctionne très bien si biCompression = 0) sinon, je force la compression (seulement l'entête du fichier) à 0 pour avoir un pseudo rendu (les formes apparaissent mais les couleurs ne sont pas bonnes et l'image est retournée (le haut est en bas).
Si une âme charitable passe par ici... je suis preneur.
► Afficher le texteExemple
► Afficher le textePixelsToBmp.au3
- Fichiers joints
-
Webcam.au3
- (12.52 Kio) Téléchargé 152 fois
-
Bitmap_String.au3
- (6.05 Kio) Téléchargé 157 fois
3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679