Получить изображение из видео

Я пытаюсь написать приложение, которое может получить доступ к камерам, подключенным к ПК, записать видео и получить изображение из видео. Я использую библиотеки AForge.NET для доступа к камерам: http://www.aforgenet.com/framework/

Я не знаю, как работает событие AForge.Video.NewFrameEventHandler. В этом коде событие возвращает null растровому изображению вместо нового кадра из видео, или событие не вызывается. Я хочу получать кадры из видео в поле изображения каждый раз, чтобы создать что-то вроде видеопотока, и после нажатия кнопки остановки я хочу, чтобы последнее изображение оставалось отображаемым в поле изображения. Кто-нибудь знает как? И почему мой код не работает?

Код:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using AForge.Video.DirectShow;
using System.Drawing;
using AForge.Video;

namespace CameraDevice
{
    public class CameraImaging
    {
        // enumerate video devices
        public FilterInfoCollection videoDevices = new FilterInfoCollection(FilterCategory.VideoInputDevice );
        //camera
        public VideoCaptureDevice videoSource;
        //screen shot
        public Bitmap bitmap;
        public CameraImaging()
        {
            // create video source
            VideoCaptureDevice videoSource = new VideoCaptureDevice(videoDevices[0].MonikerString );
            // set NewFrame event handler
            videoSource.NewFrame += new NewFrameEventHandler( video_NewFrame );
        }
        public void StartVideo(VideoCaptureDevice videoSource)
        {
            // start the video source
            videoSource.Start();
            // ...
        }
        public void StopVideo(VideoCaptureDevice videoSource)
        {
            // stop the video source
            videoSource.Stop();
            // ...
        }
        private void video_NewFrame( object sender, NewFrameEventArgs eventArgs )
        {
            // get new frame
            bitmap = eventArgs.Frame;
            // process the frame
        }
    }
}

Аналогичный код находится здесь: http://www.aforgenet.com/framework/features/directshow_video.html[ ^]

В Windows Forms я запускаю это видео в потоке, который выполняет этот метод:

private void VideoRecording()
    {
        camImg.videoSource.Start();

        while (!StopVideo)
        {
            pictureBox1.Image = camImg.bitmap;
            pictureBox1.Invalidate();
        }
        camImg.videoSource.Stop();

    }

person Pepin z Hané    schedule 22.10.2012    source источник
comment
AForge.NET использует собственный DirectShow API для доступа к оборудованию для захвата видео. Вы можете вместо этого взглянуть на библиотеку DirectShow.NET, которая является наиболее широко используемым мостом между приложениями .NET и API видеозахвата.   -  person Roman R.    schedule 22.10.2012


Ответы (3)


Если я правильно помню, растровое изображение нужно скопировать сразу, так как оно перезаписывается после события. Использование ссылки здесь бесполезно. Попробуйте что-нибудь вроде:

private void video_NewFrame( object sender, NewFrameEventArgs eventArgs )
{
    // copy the new frame
    bitmap = new Bitmap(eventArgs.Frame);
    // process the frame
}

or

private void video_NewFrame( object sender, NewFrameEventArgs eventArgs )
{
   // clone new frame
   bitmap = eventArgs.Frame.Clone();
   // process the frame
}

Также вам не следует использовать для этого дополнительный поток, AForge уже делает это.

  1. Вызов Start (например, в событии загрузки или после нажатия кнопки)
  2. Обработка событий кадра

    private void VideoStream_NewFrame(object sender, AForge.Video.NewFrameEventArgs eventArgs)
    {
        Bitmap newFrame = new Bitmap(eventArgs.Frame);
        pictureBox1.Image = newFrame;
    }
    
  3. Call Stop (закрывающее событие или кнопка)

Если у вас возникнут проблемы с элементами управления WinForm, например метку, вам нужно знать, что эти элементы управления были созданы в другом потоке, и вам нужно использовать Invoke. Например:

label_ms.Invoke((MethodInvoker)(() => label_ms.Text = msTimeSpan.TotalMilliseconds.ToString()));

Лучше всего проверить этот образец AForge, который поставляется с фреймворком: http://aforge.googlecode.com/svn/trunk/Samples/Video/Player/

person A.J.Bauer    schedule 12.06.2013

Я использую видеотеку Aforge со своими камерами Foscams, и она работает очень хорошо. Вот мой код для обработчика событий.

private void Video_NewFrame(object sender, AForge.Video.NewFrameEventArgs eventArgs)
    {
        //Create Bitmap from frame
        Bitmap FrameData = new Bitmap(eventArgs.Frame);
        //Add to PictureBox
        PictureBox.Image = FrameData;
    }
person Niels Schmidt    schedule 20.10.2013