salut, je voudrais coder un soft offline qui sache exploiter ma web cam, par exemple prendre une photo avec.
donc par exemple, il serait capable de poster sur un FTP les images acquises … je pensais a du VB ou du C ( ++ )
waiting for tout court …
Ce message a été édité par fser le 07/02/2004
yo!
Alors pour la webcam je connais deux solutions :
- à l’ancienne par le SDK Multimedia de Windows. Tu vas voir du côté de capCreateCaptureWindow, capDriverConnect, etc.
C’est assez lourdingue comme méthode puisque ça t’affiche une fenêtre, ça sauve en AVI, et tout un tas d’autres trucs… mais ils restent désactivable. Tiens ben dans la foulée, vla le code pour initialiser la webcam et prendre une image :
bool InitWebCam(void)
{
CAPTUREPARMS CapParams;
hWndCap = capCreateCaptureWindow ( “My Own Capture Window”, WS_VISIBLE , 0, 0, 320, 240, NULL,0);
capDriverConnect(hWndCap,0);
capCaptureGetSetup(hWndCap,&CapParams,sizeof(CapParams));
CapParams.dwRequestMicroSecPerFrame/=2;
CapParams.fMakeUserHitOKToCapture=FALSE;
CapParams.fYield=TRUE;
CapParams.fCaptureAudio=FALSE;
CapParams.fAbortLeftMouse=FALSE;
CapParams.fAbortRightMouse=FALSE;
capCaptureSetSetup(hWndCap,&CapParams,sizeof(CapParams));
capSetCallbackOnFrame(hWndCap,FrameCallbackProc);
}
Pour capture une image c’est :
Et pour récupérer le résultat, ça se passe dans la callback par
LPVIDEOHDR video->lpData qui contient tout en raw au format de la webcam. Encore un peu de code :
size=capGetVideoFormatSize(hWndCap);
bi=(BITMAPINFO*)calloc(1,size);
capGetVideoFormat(hWndCap, bi, size);
data=(short*)video->lpData;
w=bi->bmiHeader.biWidth;
h=bi->bmiHeader.biHeight;
d=bi->bmiHeader.biBitCount;
//
// Et là je fais ce que je veux avec mes cheveux.
//
free(bi);
free(buf);
return (LRESULT) TRUE ;
}
[/quote] - Autre méthode : utilier les COM/IDE/ATL/MFC/XML/SOAP/NAWAK et consort. En clair, faire de la programmation “moderne” et se prendre la tête (enfin, quand on connait pas bien, comme moi). Pour ça je t’invite à aller sur sourceforge.net et rechercher le projet tviewer qui fait le minimum avec une webcam.
Edit : chtite précision, la 1ère méthode semble ne pas passer sur ma Philips (plantage) alors qu’elle passe sur ma Logitech et ma Trust (oui j’ai trois webcams). Il est de notoriété publique que les drivers Philips ne sont pas super fiables. Etonnament la 2e méthode passe. Je préconise un donc un try catch(…)
Valaaaaaaaa
Antoine
Ce message a été édité par AntoineViau le 10/02/2004
…
Impressive !
je capte pas grand chose !!!
au 1er regard, ça surprend qd meme tout ça lol, surtout a cette heure apres quelques heures de sommeil en retard…
merci de ta reponse !
( I’ll analyse it of course )
Sinon en .Net/C# on a fait un prog tout con avec kinik de 10 lignes qui prenait des photos avec la webcam. Envoie lui un pm il doit surement l’avoir encore qui traine sur son HD.
Ce message a été édité par GloP le 10/02/2004
[quote]Sinon en .Net/C# on a fait un prog tout con avec kinik de 10 lignes qui prenait des photos avec la webcam. Envoie lui un pm il doit surement l’avoir encore qui traine sur son HD.
Ce message a été édité par GloP le 10/02/2004[/quote]Genre, si tu pouvais me mettre ca de coté ? Non pas que j’aie une webcam, mais juste matter le code, genre savoir comment récupérer l’image via .net. (Le reste, le FTP, tout ca, je saurais faire, je pense).
[quote]
…
Impressive !
je capte pas grand chose !!!
au 1er regard, ça surprend qd meme tout ça lol, surtout a cette heure apres quelques heures de sommeil en retard…
merci de ta reponse !
( I’ll analyse it of course )[/quote]Bah no stress, MSDN est comme Google : c’est ton ami.
Et plus précisément ici.
Tu vas voir qu’il y a rien de bien compliqué.
Antoine
Merci a tous
une jour, on rajoutera peut etre une difficulté supplémentaire : faut que ce soit multi plateforme ^^
Au fait, j’ai vu ton tour d’europe en moto, terrible !
Gérer une webcam en C/C++ c’est pas très dur mais assez stressant si tu utilises les “vieilles” librairies Video For Windows. Notamment sur le fait que si ta cam est paramétrée pour capturer en format YUV par exemple, et bien le buffer qu’il te passe par le callback est en YUV aussi, donc la conversion est à ta charge. Manque de bol, des formats YUV y’en a une paire, et tous les faire à la main c’est un peu lourds.
J’avais commencé ça et puis j’ai abandonné pour recoder une classe qui utilise DirectShow. Avec un filter graph correct, cad avec les bons filtres qui vont bien, c’est assez simple de capturer une image en format RGB à partir de n’importe quel pilote de capture (VFW ou WDM) et à partir de n’importe quel format d’origine (DirectShow convertit comme un grand).
Si tu veux je peux t’envoyer ma classe, que je commenterai pour l’occasion, si tu veux voir comment je me suis démerdé.
Ce message a été édité par Trapamoosch le 14/02/2004
ça pourrai etre interressant, mais j’ai peur de rien comprendre …
[quote]Si tu veux je peux t’envoyer ma classe, que je commenterai pour l’occasion, si tu veux voir comment je me suis démerdé.[/quote]Je suis moi aussi très interressé par un tel code !
En effet, je bosse sur un projet de type “Eye-toy” pour la fac, et je fais ça sous Linux via SDL et V4L, le tout en C.
Je ne connais pas bien la prog. sous Windows (a part quelques projets sous VB … pas grand chose en somme !), et l’API me semble assez mal documentée (ou bien je n’ai pas trouvé où chercher)
Etant donné que SDL est dispo sous Windows, il ne me resterai qu’a convertir mes fonctions utilisant V4L en fonctions ‘windows’ pour avoir un portage de l’appli.
Le moindre bout de code indiquant comment initialiser/capturer de la video via une webcam ou un tunerTV sous Windows me serait fort précieux
( de manière générale d’ailleur, comment utiliser un périphérique particulier sous Windows ? comment communiquer avec les pilotes ? existe-il un équivalent au /dev/… de Linux ? )
J’imagine que cela doit paraître très trivial, mais je n’ai pas vraiment compris “l’esprit” du dévellopement sous Win !
Griim
Non ca marcherait pas. La solution la plus simple sous windows c’est d’utiliser directshow qui fait quasiement tout pour toi. Avec ca tu construit ton graphe, tu te branche au bout et tu recupere les images que ca soit sur disque ou en memoire. Je pense que si tu veux une solution portable cross linux/windows il va te falloir une API qui gere ca de zero comme une grande toute seule et qui fait la mapping entre les deux. Je suis pas sur que SDL gere les peripheriques d’aquisition… Enfin si il le fait c’est par la qu’il faut passer mais pas par le technique decrite ici qui utiliserait directshow en C++, C# ou autre…