Получить поток веб-камеры с помощью Aforge.NET в C# и WPF
Я хочу захватить веб-камеру с помощью моей камеры. Для этого я использую 2 ссылки: AForge.Video.dll
и AForge.Video.DirectShow.dll
.
здесь фрагмент, который я нашел:
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();
}
}
они использовать PictureBox
для отображения кадров. Поскольку я работаю в WPF, я использовал этой
подводя итог, вот как выглядит мой код в настоящее время.
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();
}
2 ответов
Edit1: для подробного объяснения посмотреть мой blogpost на ту же тему.
я исправил ошибку, используя Dispatcher
класс, как мьютекс:
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*/
}));
}
теперь он работает так, как ожидалось, и я получаю хорошую производительность без снижения fps.
Если вы хотите поддерживать Silverlight, будь то для web или standalone или WP7, вы не должны начинать с WPF, так как многие функции WPF отсутствуют в Silverlight.
вот Silverlight 4 + учебник:
http://www.silverlightshow.net/items/Capturing-the-Webcam-in-Silverlight-4.aspx