Capture d'image par webcam en console

Signaler
Messages postés
50
Date d'inscription
lundi 4 février 2013
Statut
Membre
Dernière intervention
12 mars 2015
-
Messages postés
50
Date d'inscription
lundi 4 février 2013
Statut
Membre
Dernière intervention
12 mars 2015
-
Bonjour,

Je tente de lancer ma webcam au démarrage de l'application qui n'a pas d'interface graphique et de réussir à prendre des captures du flux vidéo pour ensuite les analyser. Je pourrais aussi faire des captures tous les N temps, les enregistrer et les analyser ensuite, mais si je peux directement faire une capture depuis le flux, ce serait parfait.

Le but final étant de pouvoir décoder un code QR présenté a l'objectif de la caméra et d'agir en fonction de ce code.

Pour l'instant j'ai trouvé quelques exemple, mais tous ont une interface graphique et récupèrent des images depuis le flux affiché dans une picturebox. Or je suis en console et je ne vois pas vraiment comment faire une capture du flux de cette manière.

Quelque chose dans le genre serait très intéressant :
Bitmap bmp = new Bitmap( ImageCapturee );

//Et finalement de l'analyser
string[] datas = BarcodeScanner.Scan(ImageCapturee, BarcodeType.QRCode);


Quelqu'un pourrait éclairer ma lanterne ?

D'avance, merci :)

Cordialement, Gaedarr.

2 réponses

Messages postés
239
Date d'inscription
lundi 5 décembre 2005
Statut
Membre
Dernière intervention
27 août 2012
5
sachant qu'afficher le flux dans une picturebox, c'est plus ou moins afficher une image depuis un memory streamn. Pourquoi tu ne récupères pas ce stream avec lequel tu crées une image que tu sauves ensuite?
Messages postés
50
Date d'inscription
lundi 4 février 2013
Statut
Membre
Dernière intervention
12 mars 2015

Bonjour,

Navré de la réponse plutôt tardive, j'ai finalement tourné le projet légèrement différemment pour pouvoir mieux comprendre la chose et pouvoir la transposer ensuite en console.

Alors pour le moment, voici ce dont je dispose :

Le Load
private void Form1_Load(object sender, EventArgs e)
        {
            foreach (Filter f in InputOptions.VideoInputDevices)
            {
                cbxVideo.Items.Add(f.Name);
            }
            if (cbxVideo.Items.Count > 0)
            {
                cbxVideo.SelectedIndex = 0;
            }
            foreach (Filter f in InputOptions.AudioInputDevices)
            {
                cbxAudio.Items.Add(f.Name);
            }
            if (cbxAudio.Items.Count > 0)
                cbxAudio.SelectedIndex = 0;

            this.Configure();

            this.tmrCapture.Enabled = true;
        }


"Configure"
private void Configure()
        {
            try
            {
                if (cbxVideo.Items.Count < 1)
                    throw new Exception();
                cbxVideo.Enabled = false;
                cbxAudio.Enabled = false;
                this.VideoInput = this.InputOptions.VideoInputDevices[cbxVideo.SelectedIndex];
                if (cbxAudio.Items.Count > 0)
                    this.AudioInput = this.InputOptions.AudioInputDevices[cbxAudio.SelectedIndex];
                this.CaptureInfo = new Capture(this.VideoInput, this.AudioInput);
                this.CaptureInfo.PreviewWindow = pbxPreview;
                this.CaptureInfo.RenderPreview();
                this.CaptureInfo.FrameCaptureComplete += new Capture.FrameCapHandler(CaptureInfo_FrameCaptureComplete);
            }
            catch(Exception e)
            {
                this.ErrorMessage(e);
            }
        }


Le timer
private void tmrCapture_Tick(object sender, EventArgs e)
        {
            try
            {
                CaptureInfo.CaptureFrame();                
                pbxCapture.Image.Save("images\\myImage.jpg");
                
                barcodes = BarcodeScanner.ScanSingleBarcode("images\\myImage.jpg", BarcodeType.QRCode);
                lbltest.Text = barcodes[0];
            }
            catch (Exception exept)
            {
                this.ErrorMessage(exept);
            }
        }


Et finalement
void CaptureInfo_FrameCaptureComplete(PictureBox Frame)
        {
            pbxCapture.Image = Frame.Image;
        }


Maintenant que ça fonctionne, du moins en partie (je précise que c'est une source d'ici même), je me dis que ça serait tout de même plus léger en passant par un bitmap.

Cela dit, j'ai par moment quelques erreurs d’accès et de handle, si vous voyez des erreurs, je suis preneur de tout conseil.

En attendant, je vous remercie de vous pencher sur mon sujet :)


Cordialement, Gaedarr.