Как просматривать и записывать видео одновременно с помощью EmguCV? - PullRequest
0 голосов
/ 05 февраля 2019

Я работаю над Windows Form App, которая похожа на систему наблюдения и пыталась одновременно захватывать и сохранять видео.Я могу просматривать видео с камеры, но при попытке сохранить видео.Сгенерирован пустой видеофайл.

Поскольку я совершенно новичок в emguCV, я застрял и не смог его разрешить.

Вот что я пробовал

 VideoCapture videoCapture;
        double totalFrames;
        double fps;
        VideoWriter videoWriter;
        DateTime dateTime;
        int i;

        public Body()
        {
            InitializeComponent();
            i = 0;


                if (videoCapture == null)
                {
                    dateTime = new DateTime();
                    dateTime = DateTime.Now;
                    videoCapture = new Emgu.CV.VideoCapture(0);
                }
                videoCapture.ImageGrabbed += VideoCapture_ImageGrabbed;
                videoCapture.Start();



        }

        private void VideoCapture_ImageGrabbed(object sender, EventArgs e)
        {

            Mat m = new Mat();
            videoCapture.Retrieve(m);
            pictureBox1.Image = m.ToImage<Bgr, byte>().Bitmap;

            totalFrames = videoCapture.GetCaptureProperty(Emgu.CV.CvEnum.CapProp.FrameCount);
            fps = videoCapture.GetCaptureProperty(Emgu.CV.CvEnum.CapProp.Fps);

            if (videoCapture == null)
            {
                return;
            }
            else
            {

                int fourcc = Convert.ToInt32(videoCapture.GetCaptureProperty(Emgu.CV.CvEnum.CapProp.FourCC));
                int frameHeight = Convert.ToInt32(videoCapture.GetCaptureProperty(Emgu.CV.CvEnum.CapProp.FrameHeight));
                int frameWidth = Convert.ToInt32(videoCapture.GetCaptureProperty(Emgu.CV.CvEnum.CapProp.FrameWidth));
                string destination = "C:\\Users\\ITNOA\\Desktop\\savedVideoDHS\\" + i+".mp4";
                videoWriter = new VideoWriter(destination, fourcc, fps, new Size(frameWidth, frameHeight), true);
                videoWriter.Write(m);
            }


        }

private void videoSavingtimer_Tick(object sender, EventArgs e)
        {
            videoCapture = null;
            i++;
            if (videoWriter.IsOpened)
            {
                videoWriter.Dispose();

            }
        } 

Любая помощь?

Спасибо.

1 Ответ

0 голосов
/ 07 февраля 2019

Вот как можно просматривать и сохранять видео одновременно с помощью emgu cv.

public Body()
        {
            InitializeComponent();

                if (videoCapture == null)
                {

                    videoCapture = new Emgu.CV.VideoCapture(0);
                }
                videoCapture.ImageGrabbed += VideoCapture_ImageGrabbed;
                videoCapture.Start();



        }

        private void VideoCapture_ImageGrabbed(object sender, EventArgs e)
        {
            if (fileChanged)
            {
                totalFrames = videoCapture.GetCaptureProperty(Emgu.CV.CvEnum.CapProp.FrameCount);
                fps = videoCapture.GetCaptureProperty(Emgu.CV.CvEnum.CapProp.Fps);
                int fourcc = Convert.ToInt32(videoCapture.GetCaptureProperty(Emgu.CV.CvEnum.CapProp.FourCC));
                int frameHeight = Convert.ToInt32(videoCapture.GetCaptureProperty(Emgu.CV.CvEnum.CapProp.FrameHeight));
                int frameWidth = Convert.ToInt32(videoCapture.GetCaptureProperty(Emgu.CV.CvEnum.CapProp.FrameWidth));
                string destination = "C:\\Users\\ITNOA\\Desktop\\savedVideoDHS\\" + i + ".avi";
                videoWriter = new VideoWriter(destination, VideoWriter.Fourcc('I', 'Y', 'U', 'V'), fps, new Size(frameWidth, frameHeight), true);
                fileChanged = false;
            }


            Mat m = new Mat();
            videoCapture.Retrieve(m);
            pictureBox1.Image = m.ToImage<Bgr, byte>().Bitmap;
            videoWriter.Write(m);
        }

В приведенном выше коде, который мне понадобился для сохранения видео в несколько файлов, я заново инициализирую программу записи видео.Для одного файла он должен быть инициализирован один раз.

Я пробовал несколько кодов сжатия, но у меня сработало следующее

Код сжатия VideoWriter.Fourcc ('I', 'Y', 'U',' V ')

videoWriter = new VideoWriter (назначение, VideoWriter.Fourcc (' I ',' Y ',' U ',' V '), кадры в секунду, новый размер(frameWidth, frameHeight), true);

Надеюсь, что это поможет

...