Pepin z Hane Ответов: 2

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


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

Я не знаю как называется это событие AForge.Видео.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();

}


Спасибо Вам за ваши ответы!

-Пепин з Хане

Sushil Mate

прежде всего, вы можете захватить видео? если да, то событие становится называется?
поставить отладки указатель &амп; проверить значение растрового изображения..

Pepin z Hane

Я пытаюсь записать видео, но не знаю, как это сделать. Я могу распознавать только устройства камеры, поэтому пользователь может выбрать камеру из поля со списком. И я не знаю, называется ли это событие. Я так не думаю, потому что растровое изображение является нулевым во время отладки, как я уже писал.

Sushil Mate

вам нужно сначала захватить видео, а затем перейти к кадру изображения.. разделите работу и попробуйте решить ее :)

Pepin z Hane

Если бы я только знал, как это сделать... :-)

Sushil Mate

У OriginalGriff есть идея, идите с ней :)

felix pascal

привет, пожалуйста, видеоисточник.NewFrame += Новый AForge.Видео.NewFrameEventHandler(video_NewFrame) не работает для меня. моя визуальная студия жалуется: частная суб video_NewFrame(как byval отправителя как объект, как byval EventArgs в качестве NewFrameEventArgs) - это событие и нельзя назвать напрямую, использовать создать событие, чтобы вызвать событие.

Если я помещу эту строку кода вне своей формы, она будет жаловаться, что videosource не объявлен, тогда как я объявил его как тусклую переменную поверх своей формы

пожалуйста, любезно помогите мне. Спасибо

2 Ответов

Рейтинг:
10

Pepin z Hane

Я ее разгадал. В конструкторе я инициализировал событие, но в Form1 я перезаписывал videoSource, поэтому событие не было инициализировано.

правильный код:

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
        private VideoCaptureDevice _videoSource;
        public Bitmap bitmap = new Bitmap(10, 10);
        public VideoCaptureDevice videoSource
        {
            get
            {
                return _videoSource;
            }
            set
            {
                _videoSource = value;
                // set NewFrame event handler
                _videoSource.NewFrame +=new NewFrameEventHandler(videoSource_NewFrame);
            }
        }
        //screen shot
        
        public CameraImaging(VideoCaptureDevice videoDevice)
        {
            // create video source
            VideoCaptureDevice videoSource = videoDevice;
        }
        public CameraImaging()
        {

        }
        private void videoSource_NewFrame( object sender, NewFrameEventArgs eventArgs )
        {
            // get new frame
            lock (bitmap)
            {
                bitmap = (Bitmap)eventArgs.Frame.Clone();
                // process the frame
            }
            
        }
    }
}

Форма 1:
...
private void VideoRecording()
        {
            camImg.videoSource.Start();
            
            while (!StopVideo)
            {
                lock (mImageLock)
                {
                    Bitmap tmp = (Bitmap)camImg.bitmap.Clone();

                    if (InvokeRequired)
                    {
                        BeginInvoke(new MethodInvoker(() =>
                            {
                                pictureBox1.Image = tmp;
                                pictureBox1.Invalidate();
                            }));
                    }
                    else
                    {
                        pictureBox1.Image = tmp;
                        pictureBox1.Invalidate();
                    }
                }
                Thread.Sleep(33);
            }
            camImg.videoSource.Stop();
            
        }
        private void btnStartVideo_Click(object sender, EventArgs e)
        {
            StopVideo = false;
            try
            {
                camImg.videoSource = new VideoCaptureDevice (camImg.videoDevices[cbCameraDevices.SelectedIndex].MonikerString);
                thrVideo = new Thread(VideoRecording);
                lblRecording.Visible = true;
                thrVideo.Start();
                Thread.Sleep(1000);
            }
            catch (Exception)
            {
                MessageBox.Show("No camera was chosen!", "Exception", MessageBoxButtons.OK, MessageBoxIcon.Warning);
            }
            
            
        }
...


Member 9829197

Я еще не подключил камеру.
как получить все кадры из уже отснятого видео?
какие форматы поддерживаются компанией "AForge" ?
не могли бы вы дать мне какой-нибудь код?

Рейтинг:
1

OriginalGriff

Из вашего краткого обсуждения с Сушилом Мате, похоже, ваша проблема довольно проста: вам нужно разбить задачу на "куски" и заставить первый работать, прежде чем переходить к следующему, как он говорит.

Начните с того, что получите работу захвата видео! Пока у вас этого нет, вам не из чего получать кадры! :смеяться:

Это может помочь: C# \ VB.NET библиотеки связи с камерами[^] (вы могли бы найти это сами с помощью быстрого Google - это заняло у меня всего несколько секунд и было третьим ударом по простому поиску: "получить видео с камеры c#")