2016-04-27 9 views
1

Ich habe eine Frage, wie kann ich den Stream von meiner Webcam in einem Image-Container in WPF anzeigen? Ich bekomme schon den Strom mit Emgu und konvertiert es in eine Bitmapsource, aber jetzt verstehe ich nicht, wie ein Bild von meiner Webcam zu WPF binden, mit Caliburn (MVVM) alle X ms ....Anzeige eines Videostreams von meiner Webcam in WPF?

<Image x:Name="imageWebcam" /> 

Antwort

1

Ok Lösung gefunden. Ich kann nicht den ganzen Code zeigen, aber ich kann ein wenig erklären, WPf Ansicht zu binden:

<Image x:Name="ImageWebcam" /> 

Zu meinem Viewmodel (mit Caliburn FrameWork, aber dies leicht zu einem MVVM Muster angepasst werden kann) muß ich bindet das Bild mit einer Funktion mit dem gleichen Namen:

public WriteableBitmap ImageWebcam 
    { 
     get 
     { 
      return this.imageWebcam; 
     } 
     set 
     { 
      this.imageWebcam = value; 
      this.NotifyOfPropertyChange(() => this.ImageWebcam); 
     } 
    } 

Und dieses Bild, das ich einen Timer verwenden, um zu aktualisieren, muss das sein initialisieren in das Ansichtsmodell Konstruktor:

public MachinBidule() 
{ 
    timeIsRunningOut= new System.Timers.Timer(); 
    timeIsRunningOut.AutoReset = true; 
    timeIsRunningOut.Interval = 10; 
    timeIsRunningOut.Elapsed += (sender, e) => { UpdateImage(); }; 
    capture = new Capture(); // Capture the webcam using EmguCV 
} 

Und nun können Sie das Update mit einem Dispatcher verwalten:

// Update the image, method called by the timer every 10 ms 
private void UpdateImage() 
{ 
    // If capture is working 
    if(capture.QueryFrame()!= null) 
    { 
     //capture an Image from webcam stream and 
     Image<Bgr, Byte> currentFrame = capture.QueryFrame().ToImage<Bgr, Byte>(); 
     if (currentFrame != null) 
     { 
      Application.Current.Dispatcher.BeginInvoke(new System.Action(() => { imageWebcam = new WriteableBitmap(BitmapSourceConvert.ToBitmapSource(currentFrame)); NotifyOfPropertyChange(() => ImageWebcam); })); 
     } 
    } 
} 

können Sie feststellen, dass wir von emguCV Image<Bgr,Byte> zu WPF WriteableBitmap und benachrichtigen Sie das Update mit NotifyOfPropertyChange(() => ImageWebcam) konvertieren müssen.

Bitte zögern Sie nicht mich zu kontaktieren oder kommentieren, wenn Sie Fragen haben. Wenn Sie einen Fehler bemerkt haben, zögern Sie nicht, mich zu korrigieren (Grammatik & Code).

0

sollten Sie MediaElement verwenden Video zu zeigen, nicht Image Kontrolle:

XAML:

<MediaElement Source="{Binding VideoAddress}" /> 

Ansichtsmodell:

private URI videoAddress=new URI("C:\video.wmv"); 
public URI VideoAddress 
{ 
    get { return videoAddress; } 
    set 
    { 
     videoAddress = value; 
     OnPropertyChanged("LeafName"); 
    } 
} 

Sie können auch WPF-MediaKit verwenden, um Video von WebCam anzuzeigen. Oder see this tutorial.

Update:

Sie sollten Image verwenden, um ein Bild zu zeigen:

<Image x:Name="imageWebcam" /> 

und C#:

BitmapImage logo = new BitmapImage(); 
logo.BeginInit(); 
logo.UriSource = new Uri("C:/1.png"); 
logo.EndInit(); 

imageWebcam.Source = logo; 
+0

EmguCV erfassen ein "Bgr-Bild", kann ich das also wirklich als Video verwenden? –

+0

nur um ein Bild zu zeigen, bitte, siehe Abschnitt aktualisiert – StepUp

+0

@EstebanChamard Fühlen Sie sich frei, eine Frage zu stellen. Wenn Sie meinen, dass meine Antwort Ihnen hilft, dann können Sie meine Antwort als eine Antwort markieren, um die zukünftige Suche nach anderen Personen zu vereinfachen. Bitte lesen Sie diese http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work – StepUp

0

Verwenden Sie ein Writeablebitmap als Quelle des Bildes Element. Sie sollten in Ihrem Ansichtsmodell einen Rückruf bereitstellen, der die Rahmendaten für jeden neuen Frame weitergibt. Abonnieren Sie diesen Rückruf aus Ihrer Sicht im folgenden Code. Sie können dann jeden Rahmen in die Bitmap schreiben. Ich denke nicht, dass Datenbindung in diesem Fall ein guter Ansatz ist.

Wenn mit einem Strom von Videobildern zu tun Writeablebitmap bei weitem die beste Option in WPF ist:

WriteableBitmap