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

Messages postés
45
Date d'inscription
jeudi 8 mars 2007
Dernière intervention
3 mars 2010
- - Dernière réponse : oo7jb5
Messages postés
45
Date d'inscription
jeudi 8 mars 2007
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.
Afficher la suite 

Votre réponse

9 réponses

Meilleure réponse
Messages postés
3248
Date d'inscription
lundi 25 avril 2005
Dernière intervention
27 octobre 2012
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.

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources a aidé 101 internautes ce mois-ci

Commenter la réponse de Lutinore
Messages postés
3248
Date d'inscription
lundi 25 avril 2005
Dernière intervention
27 octobre 2012
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.

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources a aidé 101 internautes ce mois-ci

Commenter la réponse de Lutinore
Messages postés
3248
Date d'inscription
lundi 25 avril 2005
Dernière intervention
27 octobre 2012
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( );

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources a aidé 101 internautes ce mois-ci

Commenter la réponse de Lutinore
Messages postés
45
Date d'inscription
jeudi 8 mars 2007
Dernière intervention
3 mars 2010
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
Messages postés
45
Date d'inscription
jeudi 8 mars 2007
Dernière intervention
3 mars 2010
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
Messages postés
45
Date d'inscription
jeudi 8 mars 2007
Dernière intervention
3 mars 2010
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
Messages postés
3248
Date d'inscription
lundi 25 avril 2005
Dernière intervention
27 octobre 2012
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
Messages postés
45
Date d'inscription
jeudi 8 mars 2007
Dernière intervention
3 mars 2010
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
Messages postés
45
Date d'inscription
jeudi 8 mars 2007
Dernière intervention
3 mars 2010
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.