comment utiliser ISampleGrabber - C++ - Programmation
Marsh Posté le 15-04-2008 à 23:23:35
Il faut connecter la source à la pin d'entrée de l'ISampleGrabber (en ayant spécifié le format du média désiré) puis connecter la sortie de l'ISampleGrabber a un renderer.
Marsh Posté le 16-04-2008 à 06:20:45
Bonjour bjone,
Merci de m'avoir répondre mais est-ce que vous pouvez m'expliquer comment faire exactement je suis nulle en C++, quelle modification dois-je aujouter pour que ça fonctionne.
Marsh Posté le 16-04-2008 à 13:30:38
bin en fait à voir le code, je m'attendais a cette réponse
Il te faut le Platform SDK (Windows 2003), dedans tu auras le graphedit, et par exemple dans le graphedit en ouvrant un média, tu verras le graphe directshow construit automatiquement.
tu pourras ajouter des filtres intermédiaires et jouer avec les connections des pins, ça te donnera une représentation mentale de comment ça marche, ce qui est obligatoire avant d'essayer de coder quoique ce soit.
ensuite commence a potasser la doc:
http://msdn2.microsoft.com/en-us/l [...] S.85).aspx
Comme essai à coder, l'idée est d'abord de commencer par instancier une source, instancier un renderer, puis de connecter les deux avec le gestionnaire de graphe.
puis d'incruster des filtres (dont le ISampleGrabber)
Marsh Posté le 19-05-2008 à 22:22:26
bjone a écrit : bin en fait à voir le code, je m'attendais a cette réponse |
Bonjour
J'ai besoin d'aide car j'ai toujours des problémes avec le SampleGrabber.
voila une partie de mon code source:
Les déclarations:
Code :
|
La fonction CaptureVideo() qui se charge de caputrer la video et qui fait appel à la fonction GrabData() qui me permet de récupérer le buffer(vers la fin de la fontion):
Code :
|
La fonction GrabData() qui me permet de récupérer le buffer:
Code :
|
La fonction qui me permet de lire une bitmap:
Code :
|
La fonction qui me permet d'écrire une bitmap:
Code :
|
La fonction GetIamge():
Code :
|
Au début je veux bien m'excuser d'avoir envoyé tout à la fois.
Mes problémes sont les suivants:
1. le buffer récupérer par la fonction GrabData() n'est pas de taille fixe, j'essaye de l'écrire dans un fichier texte et le nombre des caractéres écrits est considérablement variable(entre 12000 et 180000), alors je pense qu'il n'est pas entrain de récupérer une image car la taille doit être fixe (largeur*hauteur*3(RGB)=640*576*3)
alors je voulais savoir où est le probléme et si mon raisonnement est correcte ou pas???????
2. Alors vu que la récupération du buffer est bloquée et que je dois avancé dans la projet j'ai essayé de lire une image sur le disque dûr pour pouvoir continuer par la suite(j'ai besoin d'une image pour le reste du projet) alors j'utilise la fonction LoadBitmap avec une image enregistrée dans le repertoire du projet et d'essayer de la écrire dans un fichier juste pour vérifier et de la réecrire une autre fois avec la fonction WriteBitmap, le probléme est que cette fonction fonctionne correctement une fois dans un fichier .cpp tout seule(contenant uniquement LoadbitmapFile, WritebitmapFile et GetImage) mais dans mon programme le fichier
contenant l'image ne s'ouvre même pas(j'ai vérifié le chemin).
Alors si vous pouvez m'aider je serai vraiment trés reconnaissante et merci d'avance.
Marsh Posté le 20-05-2008 à 21:59:45
Difficile de t'aiguiller.
sinon déjà:
unsigned char size = 640*576*3;
KABOOOM
il me semble que chez ms il y a des exemples de capture d'une frame vidéo.
moi je me sers de directshow pour récuper l'audio de medias inconnus pour les position en OpenAl.
pas tourné autour de la capture précise d'une frame.
dans mon cas, je récupère aussi des buffers variables de samples audio, que je mets bout à bout.
dans le cas d'une capture de frame, il y a certainement des états qui permette de savoir quand tu as récupéré une frame entière.
Marsh Posté le 21-05-2008 à 11:28:42
Pour le:
unsigned char size = 640*576*3;
je l'ai utilisé parceque il m'a semblé que je dois spécifier le taille du buffer(l'imposé en quelque sorte) parceque la taille récupérée est notamment plus pétite que la taille réelle mais cela a donné le même résultat.
Je veux dire que même avant d'utiliser ce unsigned char size = 640*576*3; le probléme existait.
Alors je vais préciser une question:
Pour la fonction LoadBitmapFile j'arrive m^me pas à ouvrir le fichier de l'image dans mon programme alors que lorsque je l'ai utilisé dans u fichier .cpp à part ça a fonctionné à quoi est due cela vous pensez??? j'ai vérifié le chemin.
Marsh Posté le 21-05-2008 à 13:27:54
j'ai pas bien compris l'explication, mais pour être plus clair un unsigned char est limité à 255, donc ton 640*576*3 dépasse. (donc int ou unsigned int)
après effectivement pour tes chemins, \ doit être traduit par \\
genre "C:\search.bmp" ça doit être "c:\\search.bmp"
sinon ta fonction GetImage() pourrait juste retourner un bool pour indiquer le succès ou l'échec.
sinon:
stream = fopen("wahiba.txt","w+" );
fprintf(stream,"%s",bitmapData);
fclose(stream);
je suppose que c'est pour du débuggage voir si ça vit ?
mais bon avec un %s, t'ira pas bien loin (si y'a un octet à 0 dans les premiers pixels) ou t'ira trop loin (si y'a pas d'octet à 0 tu sors du buffer), donc c'est un peu voir totallement crade.
aussi essaye d'utiliser les iostreams.
Marsh Posté le 15-04-2008 à 20:31:11
Bonjour
Je suis entrain de travailler sur un programme implémenté pour un robot et qui utilise IvmrWindowlesscontrol9,je veux récupérer l'image de la caméra montée sur le robot pour pouvoir l'utiliser avec une autre fonction qui va la traiter, mais j'arrive pas à réaliser ça, voiçi la partie
du code que je viens d'ajouter.
Au niveau de fichier header j'ai ajouté:
#include "Qedit.h" // cette line une fois ajouté a généré plusieurs erreurs et je sais pas pourquoi!!!!???
ISampleGrabber* pGrabber;
IVMRWindowlesscontrol9* pwc;
HRESULT GetCurrentBuffer(&size, (long *)pBuffer);
Au programme principale j'ai ajouté
if ( camera = RUNNING)
{
HRESULT hr;
size = x*y*3; //x = height and y = weight
char *pBuffer = new char[size];
hr = pGrabber->GetCurrentBuffer(&size, (long *)pBuffer);
if (FAILED(hr))
AfxMessageBox("Impossible de récupérer le buffer" );
else
Function1(&pGrabber);// Function1 étant la fonction qui va traiter l'image
}
Si quelqu'un peut m'aider je serais trés reconnaissante et merci d'avance.
---------------
fedora6