2011-05-26 15 views
10

'da Aforge.NET kullanarak Webcam akışını alın Kameramı kullanarak bir web kamerası beslemesi yakalamak istiyorum. Bunun için 2 referansı kullanıyorum: AForge.Video.dll ve AForge.Video.DirectShow.dll.C# ve WPF

Here's bir parçacık buldum:

public FilterInfoCollection CamsCollection; 
public VideoCaptureDevice Cam = null; 

void Cam_NewFrame(object sender, NewFrameEventArgs eventArgs) 
{ 
    frameholder.Source = (Bitmap)eventArgs.Frame.Clone(); 
    /*^
    * Here it cannot convert implicitly from System.Drawing.Bitmap to 
    * System.Windows.Media.ImageSource 
    */ 

} 

private void startcam_Click(object sender, RoutedEventArgs e) 
{ 
    CamsCollection = new FilterInfoCollection(FilterCategory.VideoInputDevice); 

    Cam = new VideoCaptureDevice(CamsCollection[1].MonikerString); 
    Cam.NewFrame += new NewFrameEventHandler(Cam_NewFrame); 
    Cam.Start(); 
} 

private void stopcam_Click(object sender, RoutedEventArgs e) 
{ 
    Cam.Stop(); 
} 

}

Bunlar çerçeveleri göstermek için bir PictureBox kullanın. WPF'de çalışırken this

kullanılır. Özet olarak kodumun şu anda nasıl göründüğünü özetlemek için. Eğer, Silverlight desteklemek web ya tek başına ya da WP7 için olmak istiyorsanız WPF gelen pek çok özelliği Silverlight eksik olarak

public FilterInfoCollection CamsCollection; 
public VideoCaptureDevice Cam = null; 


void Cam_NewFrame(object sender, NewFrameEventArgs eventArgs) 
{ 

    System.Drawing.Image imgforms = (Bitmap)eventArgs.Frame.Clone(); 


    BitmapImage bi = new BitmapImage(); 
    bi.BeginInit(); 

    MemoryStream ms = new MemoryStream(); 

    imgforms.Save(ms, ImageFormat.Bmp); 

    ms.Seek(0, SeekOrigin.Begin); 
    bi.StreamSource = ms; 
    frameholder.Source = bi; 
    /*^runtime error here because `bi` is occupied by another thread. 
    */ 
    bi.EndInit(); 
} 

private void startcam_Click(object sender, RoutedEventArgs e) 
{ 

    CamsCollection = new FilterInfoCollection(FilterCategory.VideoInputDevice); 

    Cam = new VideoCaptureDevice(CamsCollection[1].MonikerString); 
    Cam.NewFrame += new NewFrameEventHandler(Cam_NewFrame); 
    Cam.Start(); 
} 

private void stopcam_Click(object sender, RoutedEventArgs e) 
{ 
    Cam.Stop(); 
} 

cevap

7

Edit1: Burada

bir Silverlight 4+ öğretici olduğunu detaylı açıklama görüntülemek için benim aynı konuda blogpost. beklenen ve ben fps herhangi bir düşüş olmadan iyi performans elde olarak

void Cam_NewFrame(object sender, NewFrameEventArgs eventArgs) 
    { 

     System.Drawing.Image imgforms = (Bitmap)eventArgs.Frame.Clone(); 

     BitmapImage bi = new BitmapImage(); 
     bi.BeginInit(); 

     MemoryStream ms = new MemoryStream(); 
     imgforms.Save(ms, ImageFormat.Bmp); 
     ms.Seek(0, SeekOrigin.Begin); 

     bi.StreamSource = ms; 
     bi.EndInit(); 

     //Using the freeze function to avoid cross thread operations 
     bi.Freeze(); 

     //Calling the UI thread using the Dispatcher to update the 'Image' WPF control   
     Dispatcher.BeginInvoke(new ThreadStart(delegate 
     { 
      frameholder.Source = bi; /*frameholder is the name of the 'Image' WPF control*/ 
     }));  

    } 

Şimdi çalıştırır:


Bir muteks olarak Dispatcher sınıfını kullanarak hatayı sabit.