Problème de capture d'image toutes les X secondes

Résolu
oo7jb5 Messages postés 45 Date d'inscription jeudi 8 mars 2007 Statut Membre Dernière intervention 3 mars 2010 - 22 févr. 2008 à 19:29
oo7jb5 Messages postés 45 Date d'inscription jeudi 8 mars 2007 Statut Membre Dernière intervention 3 mars 2010 - 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.

9 réponses

Lutinore Messages postés 3246 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 27 octobre 2012 41
23 févr. 2008 à 08:58
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.
3
Lutinore Messages postés 3246 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 27 octobre 2012 41
23 févr. 2008 à 10:44
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.
3
Lutinore Messages postés 3246 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 27 octobre 2012 41
23 févr. 2008 à 12:37
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( );
3
oo7jb5 Messages postés 45 Date d'inscription jeudi 8 mars 2007 Statut Membre Dernière intervention 3 mars 2010
23 févr. 2008 à 10:23
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.
0

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

Posez votre question
oo7jb5 Messages postés 45 Date d'inscription jeudi 8 mars 2007 Statut Membre Dernière intervention 3 mars 2010
23 févr. 2008 à 11:34
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'
0
oo7jb5 Messages postés 45 Date d'inscription jeudi 8 mars 2007 Statut Membre Dernière intervention 3 mars 2010
23 févr. 2008 à 13:52
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.
0
Lutinore Messages postés 3246 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 27 octobre 2012 41
23 févr. 2008 à 16:08
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( ) ;
0
oo7jb5 Messages postés 45 Date d'inscription jeudi 8 mars 2007 Statut Membre Dernière intervention 3 mars 2010
23 févr. 2008 à 16:44
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.
0
oo7jb5 Messages postés 45 Date d'inscription jeudi 8 mars 2007 Statut Membre Dernière intervention 3 mars 2010
17 mars 2008 à 15:04
Désolé pour le retard, j'étais pas mal occupé mais j'ai trouvé ma réponse. Merci.

(Sujet à fermer, s'il vous plait)
0
Rejoignez-nous