[..] Webcam Snap

Aide et conseils concernant AutoIt et ses outils.
Règles du forum
.
Répondre
Avatar du membre
TommyDDR
Modérateur
Modérateur
Messages : 2109
Enregistré le : mar. 22 juil. 2008 21:55
Localisation : Nantes
Status : Hors ligne

[..] Webcam Snap

#1

Message par TommyDDR »

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.
3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679
Avatar du membre
moi
Niveau 7
Niveau 7
Messages : 370
Enregistré le : sam. 09 juil. 2011 22:14
Localisation : devant sont ordinateur
Status : Hors ligne

Re: [..] Webcam Snap

#2

Message par moi »

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 Image
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11798
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

Re: [..] Webcam Snap

#3

Message par Tlem »

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 remplacer

Code : Tout sélectionner

DllCall($user, "int", "SendMessage", "hWnd", $sId, "int", [color=#FF0000]$WM_CAP_FILE_SAVEDIBA[/color], "int", 0, "str", $sFile)
par la sauvegarde en mémoire.
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é".
Avatar du membre
mikell
Spammer !
Spammer !
Messages : 6292
Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status : Hors ligne

Re: [..] Webcam Snap

#4

Message par mikell »

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 ?
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
Avatar du membre
TommyDDR
Modérateur
Modérateur
Messages : 2109
Enregistré le : mar. 22 juil. 2008 21:55
Localisation : Nantes
Status : Hors ligne

Re: [..] Webcam Snap

#5

Message par TommyDDR »

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 :

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
Je mets ensuite la ligne dans mon code :

Code : Tout sélectionner

_WebcamSetCallBackFram($camera, "frameCallBack")
et la fonction :

Code : Tout sélectionner

Func frameCallBack($Hwnd, $param1, $param2, $param3)
EndFunc
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.
3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679
Avatar du membre
matwachich
Membre émérite
Membre émérite
Messages : 986
Enregistré le : lun. 19 oct. 2009 04:04
Localisation : Algérie
Status : Hors ligne

Re: [..] Webcam Snap

#6

Message par matwachich »

ç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
Sortons VW du coté obscure! - La curiosité est un vilain défaut! Cliquez ici
Avatar du membre
matwachich
Membre émérite
Membre émérite
Messages : 986
Enregistré le : lun. 19 oct. 2009 04:04
Localisation : Algérie
Status : Hors ligne

Re: [..] Webcam Snap

#7

Message par matwachich »

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

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
Avatar du membre
RL77LUC
Niveau 5
Niveau 5
Messages : 173
Enregistré le : mar. 21 sept. 2010 16:54
Status : Hors ligne

Re: [..] Webcam Snap

#8

Message par RL77LUC »

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.
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11798
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

Re: [..] Webcam Snap

#9

Message par Tlem »

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.
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é".
Avatar du membre
TommyDDR
Modérateur
Modérateur
Messages : 2109
Enregistré le : mar. 22 juil. 2008 21:55
Localisation : Nantes
Status : Hors ligne

Re: [..] Webcam Snap

#10

Message par TommyDDR »

Merci Tlem, j'ai aussi chercher par la DLL mais en vain.
3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679
Avatar du membre
Jerome
Niveau 9
Niveau 9
Messages : 661
Enregistré le : mar. 07 avr. 2009 08:35
Localisation : Picardie
Status : Hors ligne

Re: [..] Webcam Snap

#11

Message par Jerome »

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 :D)


Regarde du côté de l'ActiveX, tu auras peut - être un début de piste.

?



Jérôme
Avatar du membre
Ghost911
Niveau 5
Niveau 5
Messages : 166
Enregistré le : mar. 21 oct. 2008 17:57
Localisation : Bordeaux
Status : Hors ligne

Re: [..] Webcam Snap

#12

Message par Ghost911 »

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 !
Avatar du membre
TommyDDR
Modérateur
Modérateur
Messages : 2109
Enregistré le : mar. 22 juil. 2008 21:55
Localisation : Nantes
Status : Hors ligne

Re: [..] Webcam Snap

#13

Message par TommyDDR »

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 !!! :shock:

@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)
Dans le _WebcamOpen, alors votre callback sera appelé en boucle (parce que le PREVIEWRATE créé des frame et donc le callback est appellé)
► Afficher le texteExemple
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)
3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679
Avatar du membre
TommyDDR
Modérateur
Modérateur
Messages : 2109
Enregistré le : mar. 22 juil. 2008 21:55
Localisation : Nantes
Status : Hors ligne

Re: [..] Webcam Snap

#14

Message par TommyDDR »

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.
► 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
Répondre