2011-05-26 20 views
10

Quiero capturar una fuente de cámara web usando mi cámara. Para eso estoy usando las 2 referencias: AForge.Video.dll y AForge.Video.DirectShow.dll.Obtener la transmisión de la cámara web utilizando Aforge.NET en C# y WPF

Here's un fragmento que he encontrado:

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(); 
} 

}

utilizan un PictureBox para mostrar los marcos. Como estoy trabajando en WPF, utilicé this

En resumen, así es como se ve mi código actualmente.

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(); 
} 

Respuesta

7

Edit1: para una explicación detallada ver mi blogpost sobre el mismo tema.


He arreglado el error utilizando la clase Dispatcher como un mutex:

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*/ 
     }));  

    } 

Ahora se ejecuta como se esperaba y me da un buen rendimiento sin ninguna caída en los fps.

1

Si quieres apoyar Silverlight, ya sea para web o independiente o WP7, no debe comenzar con WPF, como muchas características de WPF carecen de Silverlight.

Aquí es un tutorial de Silverlight 4+:

http://www.silverlightshow.net/items/Capturing-the-Webcam-in-Silverlight-4.aspx

+0

hey. Gracias ... Por ahora voy a necesitar mucho procesamiento de imágenes para la aplicación en la que estoy trabajando. Así que estoy usando Aforge para lo mismo (es decir, para capturar el video y todo) – Sagar

Cuestiones relacionadas