La mise en œuvre d'une WebCam sur une Application WPF, à l'aide de AForge.Net
Je suis en train d'écrire une application WPF où j'ai besoin d'afficher une Webcam nourrir. J'ai été en mesure de le faire facilement avec le AForge cadre.Mais quand j'ai changé à partir d'un ordinateur à un autre ordinateur du même code ne fonctionne pas de la même façon.
Dans la première, l'webcam alimentation fonctionne parfaitement, mais l'un dans l'autre cela ne se produit pas, l'alimentation a beaucoup de retard, et l'application ne fonctionne pas correctement.
Voici le code:
private void video_NewFrame(object sender, NewFrameEventArgs eventArgs)
{
Bitmap img = (Bitmap)eventArgs.Frame.Clone();
this.Dispatcher.Invoke(System.Windows.Threading.DispatcherPriority.Render, (SendOrPostCallback)delegate
{
IntPtr hBitmap = img.GetHbitmap();
System.Windows.Media.Imaging.BitmapSource bitmapSource = System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap(
hBitmap,
IntPtr.Zero,
Int32Rect.Empty,
System.Windows.Media.Imaging.BitmapSizeOptions.FromEmptyOptions());
DeleteObject(hBitmap);
img.Dispose();
GC.Collect();
image1.Source = bitmapSource;
}, null);
}
Ce que ce code est très simple, il obtient un new_frame à partir de la webcam dans une forme de Bitmap
, et ce que je dois faire est de le convertir en un BitmapSource
, donc je peut montrer, dans le cadre de l'image de la WPF. Je pense que cette conversion est le responsable de la pagaille qui se passe, mais je ne comprends pas pourquoi il travaille dans un ordinateur et dans l'autre ne fonctionne pas.
L'ordinateur spécifications sont presque les mêmes, le processeur est le même, ainsi la mémoire du système.
Mon problème, c'est sur performance, ce code dans un ordinateur fonctionne bien, et la webcam, l'aliment est présenté comme il se doit, quand j'ai port sur un autre PC cela ne se produise pas.
Il n'y a pas d'erreur, mon problème, c'est la performance, ce code dans un ordinateur fonctionne bien, et la webcam, l'aliment est présenté comme il se doit, quand j'ai port sur un autre PC cela ne se produit pas, la webcam d'alimentation a énormément de retard, et par exemple le bouton fermer la fenêtre ne fonctionne pas.
Vous avez une nouvelle réponse de l'homme. Un coup d'oeil s'il vous plaît.
OriginalL'auteur João Cardoso | 2010-01-05
Vous devez vous connecter pour publier un commentaire.
Voici code de travail basé sur cette article.
(1) Télécharger et installer la dernière AForge cadre. (J'ai utilisé la version 2.2.4)
(2) Créer une Application WPF projet.
(3) Ajouter les références à ces AForge Dll. (Vous pouvez les trouver dans C:\Program Files (x86)\AForge.NET\Framework\dossier de Version c'est à dire)
(4) à Construire votre projet. (J'ai utilisé VS 2012)
(5) Ajouter WPF contrôle de l'Image et le nom "frameHolder".
Si vous avez quelque chose comme
(6) Ajouter le code C#:
/////
(7) Re-Construire le projet et ça marche!!!
Remarque: Nous utilisons détecté pour la première fois de la WebCam par défaut.
Assurez-vous d'avoir du pilote de WebCam insalled et WebCam fonctionne en général... 🙂
LocalWebCam.Stop();
dans Déchargé de l'événement si vous avez l'intention d'utiliser cette UserControl plusieurs fois dans votre application WPF. Il peut y avoir des problèmes lors de la création de nouveau le contrôle sans arrêter l'appareil en premier. De toute façon, cette solution m'a donné la difficulté pour 20 minutes jusqu'à ce que j'ai remarqué que j'ai oublié de mettreLocalWebCam.Start();
à la fin de l'événement Chargé 🙂 Oui, ça arrive.OriginalL'auteur Academy of Programmer
Dans mon WPF MediaKit, j'ai un contrôle appelé VideoCaptureElement, qui rendra une webcam pour WPF. Vous pouvez également obtenir l'accès aux échantillons par accrochage dans la nouvelle image de l'événement et le réglage de la EnableSampleGrabbing sur l'élément.
OriginalL'auteur Jeremiah Morrill
Je sais que le post original est de plus de 3 ans, mais j'ai juste été à essayer de comprendre comment utiliser ce code. J'ai trouvé que la réponse donnée par Dimi est presque entièrement fonctionnelle de code. Toutefois, je trouve que j'ai des problèmes avec la mémoire de la fuite et le cadre n'étant pas rendre correctement sur certains ordinateurs. Le code a fonctionné parfaitement sur mon costaud ordinateur de développement (i7, 16GO de RAM, Quadro Pro Grapthics carte), mais quand j'ai déployé l'application sur un ordinateur avec des ressources plus limitées (i5, 4GO de RAM, Intégré Intel graphics), le cadre disparaît une fois dans un certain temps et que le programme serait également bloquer une fois que le système manque de mémoire. Après des recherches sur internet pour un certain temps, je pense que j'ai finalement rapiécées un code de travail basé sur tous les commentaires que les gens avaient. Je sais que l'autre ordinateur est capable d'exécuter capture d'image de la webcam parce que j'ai un WinForm C# app que j'ai écrit à l'aide de AForge.NET et il n'a pas de problèmes de rendu de l'image de façon fiable et avec pas de fuite de mémoire. Malheureusement WPF ne gère pas les graphiques de la même manière que WinForm et que nous avons à faire ce hack pour obtenir AForge.NET de travailler avec elle.
Fondamentalement, le code est le même que Dimi sauf pour le Cam_NewFrame méthode.
Les modifications qui ont été apportées sont les suivantes:
Jusqu'ici tout fonctionne bien, mais si quelqu'un d'autre spot d'autres questions, veuillez faire un commentaire, donc nous savons comment résoudre le problème.
ms.Seek(0, SeekOrigin.Begin);
aprèsbitmap.Save(ms, ImageFormat.Bmp);
comme Dmitry fait.OriginalL'auteur Patratacus
Peut-être la webcam sur l'autre ordinateur est en panne ou défectueux? Ou a l'une des webcams qui ne supporte pas le DirectShow de l'api, qui, je pense, AForge s'appuie sur.
OriginalL'auteur Kurru