web-dev-qa-db-fra.com

Capture d'image C # à partir d'une webcam

Ces deux derniers jours, j'ai cherché un moyen de capturer une image de la webcam en utilisant C #. Je suis assez nouveau en c # et je ne veux pas utiliser de bibliothèques tierces externes, j'ai donc trouvé deux bonnes façons, mais les deux semblent renvoyer presque la même erreur. Je ne pouvais pas faire travailler l'un d'entre eux, donc ce serait vraiment bien si vous m'aidiez à faire fonctionner l'un d'eux ou m'aidiez à trouver une alternative.

Donc, la première façon que j'ai trouvée est d'utiliser Windows WIA. J'ai trouvé le code suivant:

CommonDialogClass dialog = new CommonDialogClass();
Device camera = dialog.ShowSelectDevice(WiaDeviceType.CameraDeviceType, true, false);
        // take the photo 
Item item = camera.ExecuteCommand(CommandID.wiaCommandTakePicture);
ImageFile image = (ImageFile)item.Transfer(FormatID.wiaFormatJPEG);
        // filename and saving 
image.SaveFile("Test.jpg");

ce code semble être exactement ce que je recherche, mais je ne peux pas le faire fonctionner, car j'obtiens l'erreur suivante sur la deuxième ligne:

Exception from HRESULT: 0x80210015

La deuxième manière que j'ai trouvée utilise l'Avicap32.dll avec l'exemple suivant:

http://www.timvw.be/wp-content/code/csharp/testavicap32.Zip

mais je reçois ce code:

Image image = ((CaptureDevice)cboDevices.SelectedItem).Capture();
image.Save(@"c:\capture.png", ImageFormat.Png);

l'exception suivante: NullReferenceException: référence d'objet non définie sur une instance d'un objet.

Je pense que les deux solutions causent des problèmes car elles ne trouvent pas mon appareil photo, mais je peux utiliser mon appareil photo dans skype sans aucun problème.

10
Viktor Kirilov

J'ai essayé plusieurs approches, et l'approche la plus simple pour moi était Emgu.cv (paquet nuget).

        VideoCapture capture = new VideoCapture(); //create a camera capture
        Bitmap image = capture.QueryFrame().Bitmap; //take a picture

C'est tout (à partir de la version 3.3.0 de l'API)

Ancienne approche API

        Capture capture = new Capture(); //create a camera captue
        Bitmap image = capture.QueryFrame().Bitmap; //take a picture
12
Ashitakalax
  • WIA est pour les images fixes, c'est une sorte d '"API pour travailler avec les scanners"; 0x80210015 est WIA_S_NO_DEVICE_AVAILABLE
  • Le nom de l'API AVICAP32 est "Video for Windows" qui est vraiment obsolète et obsolète, cela pourrait fonctionner (la compatibilité est toujours là) mais les chances sont élevées que cela ne vous mènera nulle part

Les API pour travailler avec des caméras Web sont:

  • DirectShow
  • Fondation des médias

Les deux sont des API natives et vous pourriez avoir du mal à les interfacer directement à partir du code C #, cependant avec DirectShow.NET (en particulier) et Media Foundation.NET, vous avez des wrappers pour le code managé. Vous pouvez trouver plus d'informations sur l'utilisation de DirectShow.NET ici:

11
Roman R.

Je recommande framework Aforge.net .

Il a pu implémenter classe videoCaptureDevice utilisé dans l'exemple de projet: exemple Snapshot Maker pour créer rapidement une boîte de dialogue de capture d'image. Il est un peu plus lent que Bibliothèque DirectShow - Comment capturer une image à l'aide de la bibliothèque directshow sans afficher les images en direct de la webcam sur la PictureBox ou le pannea mais il est stable et c'est une méthode facile pour définir les résolutions vidéo et d'image à partir de un appareil pris en charge.

Le seul problème que j'ai rencontré est VideoCaptureDevice.SimulateTrigger () utilise un thread bacjground pour créer une image à partir d'un flux vidéo et renvoie l'image sur un événement. Besoin de déléguer la méthode pour éviter les problèmes de threads croisés si vous placez l'image renvoyée sur un contrôle winform sur le thread d'interface utilisateur.

Obtenez la source du projet Snapshot Maker à partir de la source Aforge.net lien SVN .

1
Gary Kindel