web-dev-qa-db-fra.com

Utilisation de la webcam en C #

Je crée un programme en C # pour me connecter à une webcam et manipuler certaines images avec celle-ci. J'ai une application de travail qui utilise une API win32 (avicap32.dll) pour se connecter à la webcam et lui envoyer des messages l'envoyant dans le Presse-papiers. Le problème est que, bien qu’elle soit accessible à partir de Paint, sa lecture à partir du programme donne des pointeurs nuls.

C'est le code que j'utilise pour connecter la webcam:

mCapHwnd = capCreateCaptureWindowA("WebCap", 0, 0, 0, 320, 240, 1024, 0);

SendMessage(mCapHwnd, WM_CAP_CONNECT, 0, 0);
SendMessage(mCapHwnd, WM_CAP_SET_PREVIEW, 0, 0);

Et voici ce que j'utilise pour copier l'image dans le presse-papier:

SendMessage(mCapHwnd, WM_CAP_GET_FRAME, 0, 0);

SendMessage(mCapHwnd, WM_CAP_COPY, 0, 0);
tempObj = Clipboard.GetDataObject();
tempImg = (System.Drawing.Bitmap)tempObj.GetData(System.Windows.Forms.DataFormats.Bitmap);

Il y a des erreurs de vérification que j'ai supprimées du code pour le rendre plus court.

Merci d'avance :)

22
Kevin

J'ai récemment commencé à faire du passe-temps dans ce domaine.

Nous avons opté pour la bibliothèque OpenCV avec le fichier opencvdotnet wrapper. Il prend en charge la capture d'images à partir d'une webcam:

using (var cv = new OpenCVDotNet.CVCapture(0))
{
    var image = cv.CreateCompatibleImage();
    // ...
    cv.Release();
}

Et si vous manipulez des images, les algorithmes de traitement des images d'OpenCV ont été intégrés à l'ensemble OpenCVDotNet.Algs.

Si vous décidez de suivre cette voie, veillez à installer OpenCV version 1.0 (et installez-le dans "c:\program files\opencv" si vous utilisez Vista 64 bits ou "mklink OpenCV 'c:\program files (x86).\OpenCV` "du répertoire correct ou sinon opencvdotnet ne sera pas installé).

17
cfeduke

Il existe en réalité deux méthodes pour importer des données de caméra dans votre application, DirectShow et WIA. Microsoft vous recommande d’utiliser WIA , et l’interface de WIA est assez simple à comprendre. J'ai créé et publié une/open source bibliothèque de bureau WIA basée sur un travail que j'ai effectué il y a quelque temps.

Maintenant, le problème avec WIA dans certains cas est que c'est trop simple. Par exemple, si vous souhaitez ajuster les propriétés de la caméra (telles que la fréquence d'images, la résolution, etc.), WIA tombe. DirectShow est obsolète pour Microsoft, mais ils ne nous ont pas fourni de solution de remplacement offrant toutes ses fonctionnalités, et j’ai constaté qu’il continue de fonctionner correctement sur toutes les plates-formes existantes (il est très enraciné, je ne peux donc pas imaginer que le support disparaisse). dans peu de temps).

Il y a une très bonne bibliothèque DirectShow sur SourceForge . Le seul "problème" avec cela est que c'est vraiment complexe et que cela découle du fait que DShow est tellement complexe et déroutant au départ. Le wrapper peut effectuer beaucoup de choses difficiles à résoudre, mais il fournit des exemples pour de nombreux cas d'utilisation courants, tels que l'affichage de vidéos ou la capture d'une image. Si vous souhaitez ajouter des superpositions ou insérer d'autres filtres, vous pouvez le faire, mais sachez que ce n'est pas du tout simple.

6
ctacke

Jetez un oeil à cet article: http://www.codeproject.com/KB/miscctrl/webcam_c_sharp.aspx

C'est beaucoup plus simple que d'installer et d'utiliser OpenCVNetWrapper.

2
kape123

Cela a également été demandé dans Comment obtenir des images de webcam en C #? et vous pourriez trouver utile ce qui suit (désolé pour le spam, mais cela aide vraiment à répondre à la question):

Je viens de publier le code source complet de mon application Windows CamTimer (écrite en .NET/C #). Téléchargez/affichez le code complet (avec des exemples de webcam fonctionnelles) à l’adresse https://github.com/johanssonrobotics/CamTimer

Bonne codage!

0
Fredrik Johansson

Avez-vous essayé Clipboard.GetImage ()? Vous pouvez également essayer les différentes méthodes Clipboard.Contains * () pour voir le format dans lequel les données sont stockées dans le presse-papiers.

0
Rob Prouse

Capture OpenCV, capture EMGU et toutes les autres bibliothèques de capture que j'ai essayées
ont tous le même problème: vous ne pouvez pas dépasser 640x480 par programmation
(sans ouvrir la fenêtre de la source vidéo Windows).

Je suggère d'utiliser ceci (qui fonctionne):
https://github.com/ofTheo/videoInput

0
Shachar Weis