Page 1 sur 1

[..] Webcam Snap

Posté : jeu. 29 sept. 2011 21:20
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.

Re: [..] Webcam Snap

Posté : jeu. 29 sept. 2011 21:22
par moi
est ce que l'UDF sur le forum us et le meme que celui poster sur ce forum?

Re: [..] Webcam Snap

Posté : jeu. 29 sept. 2011 21:35
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.

Re: [..] Webcam Snap

Posté : jeu. 29 sept. 2011 22:11
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 ?

Re: [..] Webcam Snap

Posté : ven. 30 sept. 2011 00:26
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.

Re: [..] Webcam Snap

Posté : ven. 30 sept. 2011 00:49
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

Re: [..] Webcam Snap

Posté : ven. 30 sept. 2011 01:04
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

Re: [..] Webcam Snap

Posté : sam. 01 oct. 2011 22:29
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.

Re: [..] Webcam Snap

Posté : sam. 01 oct. 2011 23:56
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.

Re: [..] Webcam Snap

Posté : mar. 04 oct. 2011 09:59
par TommyDDR
Merci Tlem, j'ai aussi chercher par la DLL mais en vain.

Re: [..] Webcam Snap

Posté : mar. 04 oct. 2011 10:05
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

Re: [..] Webcam Snap

Posté : sam. 31 déc. 2011 13:06
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 !

Re: [..] Webcam Snap

Posté : lun. 13 févr. 2012 13:50
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)

Re: [..] Webcam Snap

Posté : mar. 14 févr. 2012 01:21
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