Video For Windows: utiliser un callback

Résolu
Wavyrn Messages postés 20 Date d'inscription mercredi 8 août 2007 Statut Membre Dernière intervention 1 août 2008 - 10 déc. 2007 à 10:26
Wavyrn Messages postés 20 Date d'inscription mercredi 8 août 2007 Statut Membre Dernière intervention 1 août 2008 - 11 déc. 2007 à 18:50
Bonjour,

après avoir trimer pour controler sous TWAIN une caméra qui n'était pas compatible, je suis passé à Video for Windows: j'ai trouvé un VFW.pas qui semble très bien, mais j'ai un souci:

pour acquérir une frame, je crée une fenetre de capture, je connect le driver, je lance (ou pas) une preview, et quand je click sur le bouton qui va bien, je demande la capture d'une frame:
capgrabframenostop(HdleAcqWin)
jusque la tout va bien, mais pour faire quelque chose de l'image, il faut utiliser une fonction de callback, que l'on assigne avec
capSetCallBackOnFrame( FhWndC, @CallbackFrameProc);

et CallbackFrameProc recoit en argument un handle et un pointeur sur une stucture VIDEOHDR. C'est là que ça rate: le handle n'est pas un windowhandle, et la structure est vide, mis à part un flag qui vaut 64...

une idée, quelqu'un? j'ai cherché des exemple, et ils ne courent pas les web

Wavyrn

6 réponses

cs_Kenavo Messages postés 702 Date d'inscription vendredi 21 mars 2003 Statut Membre Dernière intervention 1 octobre 2009 5
11 déc. 2007 à 18:29
Oui, c'est normal !




FrameCallbackProc est appelée en mode preview (si la fenête est visible)

VideoCallBackProc
est appelée en mode capture (enregistrement même sans enregistrment)

Tu as l'air de bien progresser ! Continue !




Ken@vo




<hr size="2" width="100%" />



Code, Code, Codec !
3
Wavyrn Messages postés 20 Date d'inscription mercredi 8 août 2007 Statut Membre Dernière intervention 1 août 2008
11 déc. 2007 à 18:50
yop!

j'ai mon buffer! avec tous mes petits pixels dedans bien rangé!

bon, par contre, je ne saurais pas dire quelle était mon erreur: enervé, j'ai viré tout mon code pour reprendre à zero et vérifier ligne par ligne....

quoiqu'il en soit, pour le suivant qui se posera des questions:

pour controler l'acquisition webcam frame par frame en utilisant video for windows, les points clés sont les suivant:

creer la fenetre de capture
generer la liste de drivers disponibles (boucle for 0 à 9, GetDriverDescription)
connecter un driver
recuperer les infos le concernant (dans un CAPDRIVERCAPS)
utiliser les boites de dialogues du driver si elles existent
recuperer les paramètres de capture (videoformat et capturesetup)
allouer la mémoire necessaire
démarrer la preview

pour l'acquisition:
désactiver la preview
assigner la fonction callbackOnFrame*
demander un grabframe (il acquiert 1 image, et execute la fonction callbackonframe)
desassigner la fonction callbackonframe
réactiver la preview

* callbackonFrame:
déclarée auparavant,(globalement, chez moi) pour faire ce que l'on souhaite des données,
elle reçoit en argument, d'une part le handle de la fenêtre de capture, d'autre part une structure VIDEOHDR qui contient un pointeur sur le buffer (locké?) ou sont rangés les pixels. la structure contien aussi d'autres information utiles comme la taille du buffer.


Voilà, en espérant que ça serve à d'autres.

Et merci à Franky et Kenavo (dont le code est vraiment riche en enseignements)
3
Utilisateur anonyme
10 déc. 2007 à 13:01
0
cs_Kenavo Messages postés 702 Date d'inscription vendredi 21 mars 2003 Statut Membre Dernière intervention 1 octobre 2009 5
10 déc. 2007 à 15:23
Ou, pour être plus précis :





http://files.codes-sources.com/fichier.aspx?id=43177&f=Composant%5cCapture.pas



Tu trouveras un modèle de fonction callabck (
VideoCallBackProc
ou FrameCallbackProc) et la fonction qui permet de l'installer  (InstallCallBack)




Ken@vo




<hr size="2" width="100%" />



Code, Code, Codec !
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Wavyrn Messages postés 20 Date d'inscription mercredi 8 août 2007 Statut Membre Dernière intervention 1 août 2008
10 déc. 2007 à 16:47
merci pour vos réponses!

ya déja du mieux: je n'avais pas mis mes fonction de callback en stdcall. maintenant, au moins, elles recoivent les bons arguments.

Par contre, j'ai des 0 partout dans le buffer (lpVHdr.lpData).

Je n'ai pas reussi non plus à avoir un bon resultat avec la technique qui consiste à passer par le presse papier (0 dans le buffer)

Pourtant la preview fonctionne
0
Wavyrn Messages postés 20 Date d'inscription mercredi 8 août 2007 Statut Membre Dernière intervention 1 août 2008
11 déc. 2007 à 17:26
Il semble que la preview déclenche les callbacks de frame, ç'est normal?
0
Rejoignez-nous