Problème de capture d'image toutes les X secondes [Résolu]

oo7jb5 45 Messages postés jeudi 8 mars 2007Date d'inscription 3 mars 2010 Dernière intervention - 22 févr. 2008 à 19:29 - Dernière réponse : oo7jb5 45 Messages postés jeudi 8 mars 2007Date d'inscription 3 mars 2010 Dernière intervention
- 17 mars 2008 à 15:04
Bonjour,

Je souhaite réaliser une application en C# et pour cela j'ai besoin d'un algorithme me permettant de capturer toutes les X secondes une image provenant d'une webcam afin de pouvoir la traiter par la suite. Mon but est donc de pouvoir traiter des images provenant d'une webcam et cela en continu dans le temps.
J'ai réussit à capturer une seule image et à la traiter mais le problème vient de la capture de plusieurs images...

J'ai donc recherché sur le forum, des exemples pouvant correspondre à ce que je souhaite faire. J'ai donc choisi d'utiliser un timer qui était dans un sujet que j'ai trouvé sur ce site :
 
 System.Timers.Timer t = new System.Timers.Timer(10000);
  t.Elapsed += new ElapsedEventHandler(OnTimedEvent);
  t.Interval = 2000;
  t.Enabled = true;
 
mais j'ai un problème quand je veux faire la capture de l'image et son traitement dans la fonction OnTimedEvent, je n'y arrive pas... J'ai des problèmes dans la fonction OnTimeEvent à laquelle je n'arive donc pas à intégrer mes deux lignes de codes!!!

CaptureInfo.CaptureFrame();
this.CaptureInfo.FrameCaptureComplete += newCapture.FrameCapHandler(CaptureInfo_FrameCaptureComplete);

Est-ce-que quelqu'un pourrait m'aider à trouver une solution, m'indiquer comment je pourrais réaliser cela?

Je tiens à préciser que mon niveau en C# n'est pas très élevé. Je vous remercie d'avance de l'aide que vous pourrez m'apporter.
Afficher la suite 

Votre réponse

9 réponses

Meilleure réponse
Lutinore 3248 Messages postés lundi 25 avril 2005Date d'inscription 27 octobre 2012 Dernière intervention - 23 févr. 2008 à 08:58
3
Merci
Salut, si tu travailles avec une Form, tu peux utiliser la classe System.Windows.Forms.Timer qui est plus simple et plus appopriée. Tu ne dois surtout pas t'inscrire à l'évènement FrameCaptureComplete dans le gestionnaire d'évènement du timer, mais avant.

Cette ligne :

this.CaptureInfo.FrameCaptureComplete += newCapture.FrameCapHandler(CaptureInfo_FrameCaptureComplete);

ne dois pas être dans la fonction du timer.

Merci Lutinore 3

codes-sources a aidé 82 internautes ce mois-ci

Commenter la réponse de Lutinore
Meilleure réponse
Lutinore 3248 Messages postés lundi 25 avril 2005Date d'inscription 27 octobre 2012 Dernière intervention - 23 févr. 2008 à 10:44
3
Merci
Déja je ne connais pas la lib de capture que tu utilises, tu l'as trouvé sur CodeProject ?

Avec captureFrame dans une boucle while t'es partis pour faire 1 million de captures à la seconde, j'espère que tu as un bon disque dur : )

CaptureFrame doit être dans la fonction TimerEventProcessor.

Merci Lutinore 3

codes-sources a aidé 82 internautes ce mois-ci

Commenter la réponse de Lutinore
Meilleure réponse
Lutinore 3248 Messages postés lundi 25 avril 2005Date d'inscription 27 octobre 2012 Dernière intervention - 23 févr. 2008 à 12:37
3
Merci
Seule les méthodes statiques ( marquées static ) peuvent être appelées comme ça :

CaptureInfo.CaptureFrame( );

pour les méthodes d'instances c'est :

ClasseBidule bidule = new ClasseBidule( ); // à créer une seule fois, pas dans while ni dans TimerEventProcessor.
bidule.FaitQuelqueChose( );

Merci Lutinore 3

codes-sources a aidé 82 internautes ce mois-ci

Commenter la réponse de Lutinore
oo7jb5 45 Messages postés jeudi 8 mars 2007Date d'inscription 3 mars 2010 Dernière intervention - 23 févr. 2008 à 10:23
0
Merci
Bonjour et merci pour ton aide.

Cependant j'ai toujours un problème, j'ai essayé d'utiliser un System.Windows.Forms.Timer mais je n'arrive toujours pas à comprendre comment je peux faire pour que mon programme fonctionne. Je ne sais pas si j'ai bien organiser mon programme. Voici un morceau de code, permettant de mieux comprendre ce que je fais.. Lorsque je clique sur un bouton, la fonction configure est appelée.

private void Configure()
        {
            try
            {
                if (comboBox1.Items.Count < 1)
                    throw new Exception();
                comboBox1.Enabled = false;
                comboBox2.Enabled = false;
                this.button1.Enabled = true;
                this.VideoInput = this.InputOptions.VideoInputDevices[comboBox1.SelectedIndex];
                if (comboBox2.Items.Count > 0)
                    this.AudioInput = this.InputOptions.AudioInputDevices[comboBox2.SelectedIndex];
                this.CaptureInfo = new Capture(this.VideoInput, this.AudioInput);
                this.CaptureInfo.PreviewWindow = pictureBox1;
                this.CaptureInfo.RenderPreview();
                this.button1.Enabled = false;
                     
              this.CaptureInfo.FrameCaptureComplete += new Capture.FrameCapHandler(CaptureInfo_FrameCaptureComplete);
               
                //Timer
                t.Tick += new EventHandler(TimerEventProcessor);
               
                t.Interval = 5000;
                t.Start();
                

                while (exitFlag == false)
                {
                   CaptureInfo.CaptureFrame();
                 }
               
           }
            catch (Exception e)
            {
                this.ErrorMessage(e);
            }
        }
        private void CaptureInfo_FrameCaptureComplete(PictureBox Frame)
        {
           
            Bitmap aa = new Bitmap(Frame.Image);
            Testligne(aa);// fonction pour traiter l'image
       }

Est ce que j'aurai fait une erreur en mettant TestLigne() dans cette fonction, dans ce cas je devrai la mettre dans la boucle while(exitFlag == false) et alors comment récupérer mon image par la suite, j'avoue que là je suis un peu perdu.
Merci d'avance pour votre aide.
Commenter la réponse de oo7jb5
oo7jb5 45 Messages postés jeudi 8 mars 2007Date d'inscription 3 mars 2010 Dernière intervention - 23 févr. 2008 à 11:34
0
Merci
Merci.

C'est sûr mon disque dur va pas tenir longtemps.... J'utilise la librairie DirectX Capture et DShowNET.

Mais comment faire pour que CaptureInfo.CaptureFrame() soit reconnue car j'ai des problèmes à ce niveau , pourtant j'ai déclaré CaptureInfo en variable de classe. J'ai l'erreur suivante :

Erreur    1    Une référence d'objet est requise pour la propriété, la méthode ou le champ non statique 'Project1.Webcam.CaptureInfo'
Commenter la réponse de oo7jb5
oo7jb5 45 Messages postés jeudi 8 mars 2007Date d'inscription 3 mars 2010 Dernière intervention - 23 févr. 2008 à 13:52
0
Merci
Oui, mais le problème maintenant est que j'ai déjà crée mon CaptureInfo( un peu plus haut), c'est une variable de classe.

Je pense l'avoir créé correctement :  this.CaptureInfo = new Capture(this.VideoInput, this.AudioInput);


Donc je devrais créer une autre CaptureInfo qui serait créée dans TimerEventProcessor ? Je suis désolé mais sur ce coup là, j'ai un peu de mal à comprendre pourquoi cela ne fonctionne pas. Merci encore pour ton aide.
Commenter la réponse de oo7jb5
Lutinore 3248 Messages postés lundi 25 avril 2005Date d'inscription 27 octobre 2012 Dernière intervention - 23 févr. 2008 à 16:08
0
Merci
J'ai écrit exactement l'inverse :

à créer une seule fois, pas dans while ni dans TimerEventProcessor.

Ne met pas de majuscule au nom des variables ça pose des problèmes pour comprendre ton code, seule les types doivent commencer par une majuscule. Je ne connais pas la librairie que tu utilises je ne peux pas deviner comment elle marche. Il doit manquer le chemin complet qlq chose comme ça :

maClass.captureInfo.CaptureFrame( ) ;
Commenter la réponse de Lutinore
oo7jb5 45 Messages postés jeudi 8 mars 2007Date d'inscription 3 mars 2010 Dernière intervention - 23 févr. 2008 à 16:44
0
Merci
Désolé, j'avais mal compris.
Je vais penser de changer le nom des variables comme tu le dit, cela sera plus simple et c'est vrai que pourtant d'habitude je le fais mais là...
J'ai déjà essayé de nombreux chemin mais cela ne marche pas, je vais continuer merci de ton aide.
Commenter la réponse de oo7jb5
oo7jb5 45 Messages postés jeudi 8 mars 2007Date d'inscription 3 mars 2010 Dernière intervention - 17 mars 2008 à 15:04
0
Merci
Désolé pour le retard, j'étais pas mal occupé mais j'ai trouvé ma réponse. Merci.

(Sujet à fermer, s'il vous plait)
Commenter la réponse de oo7jb5

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.