Захват видео с камеры и сохранение фото

Пытаюсь сделать захват видео с камеры с помощью EmguCv. Добавил в проект библиотеки, подключил все нужные директивы

using Emgu;
using Emgu.CV;
using Emgu.CV.Util;
using Emgu.CV.Structure;
using Emgu.Util;
using DirectShowLib;

Нужно чтобы приложение подключалось к камере, передавало поток видео в pictureBox и по нажатию на кнопку делало фото. Пробую делать таким методом:

public partial class Form1 : Form
    {
        private VideoCapture capture = null;    // храним захватываемые данные с видеокамеры
        private DsDevice[] webCams = null;
        private int selectedCameraId = 0;

        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            webCams = DsDevice.GetDevicesOfCat(FilterCategory.VideoInputDevice);    // получаем все доступные видеокамеры
            for(int i=0; i<webCams.Length; i++)
            {
                camerasCbx.Items.Add(webCams[i].Name);
            }
        }

        private void camerasCbx_SelectedIndexChanged(object sender, EventArgs e)
        {
            selectedCameraId = camerasCbx.SelectedIndex;
        }

        private void watchBtn_Click(object sender, EventArgs e)
        {
            try
            {
                if (webCams.Length == 0)
                {
                    throw new Exception("Нет доступных камер!");
                }
                else if (camerasCbx.SelectedItem == null)
                {
                    throw new Exception("необходимо выбрать камеру!");
                }
                else if (capture != null)   // если поставили видео на паузу
                {
                    capture.Start();    // продолжаем смотреть
                }
                else
                {
                    capture = new VideoCapture(selectedCameraId);
                    capture.ImageGrabbed += Capture_ImageGrabbed;
                    capture.Start();
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "Ошибка!", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        private void Capture_ImageGrabbed(object sender, EventArgs e)
        {
            try
            {
                Mat m = new Mat();  // обьект для хранения картинки
                capture.Retrieve(m);
                pictureBox1.Image = m.ToImage<Bgr, byte>().Flip(Emgu.CV.CvEnum.FlipType.Horizontal).Bitmap;
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "Ошибка!", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        private void pauseBtn_Click(object sender, EventArgs e)
        {
            try
            {
                if (capture != null)    // если идет видеопоток
                {
                    capture.Pause();    // ставим на паузу
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "Ошибка!", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        private void stopBtn_Click(object sender, EventArgs e)
        {
            try
            {
                if (capture != null)    // если идет видеопоток
                {
                    capture.Pause();    // останавливаем
                    capture.Dispose();  // удаляем все ресурсы, которые использовали
                    capture = null;
                    pictureBox1.Image.Dispose();    // удаляем картинку
                    pictureBox1.Image = null;
                    selectedCameraId = 0; 
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "Ошибка!", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        private void makeFotoBtn_Click(object sender, EventArgs e)
        {
            try
            {
                Mat m = new Mat();  
                capture.Retrieve(m);
                MakeFotoForm makeFoto = new MakeFotoForm(m.ToImage<Bgr, byte>().Flip(Emgu.CV.CvEnum.FlipType.Horizontal));
                makeFoto.Show();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "Ошибка!", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        private void exitBtn_Click(object sender, EventArgs e)
        {
            Application.Exit();
        }
    }

и есть вторая форма для вывода фото и его сохранения

public partial class MakeFotoForm : Form
    {
        private Image<Bgr, byte> image = null;  // для передачи картинки
        private string fileName = string.Empty; // для сохранения картинки

        public MakeFotoForm(Image<Bgr,byte> image)
        {
            this.image = image;
            InitializeComponent();
        }

        private void MakeFotoForm_Load(object sender, EventArgs e)
        {
            fileName = $"webcam {DateTime.Now.Day} {DateTime.Now.Month} {DateTime.Now.Year} {DateTime.Now.Hour} {DateTime.Now.Minute} {DateTime.Now.Second}.jpg";
            pictureBox1.Image = image.Bitmap;
        }

        private void saveBtn_Click(object sender, EventArgs e)
        {
            try
            {
                pictureBox1.Image.Save(fileName, ImageFormat.Jpeg);
                if (File.Exists(fileName))
                {
                    Close();
                }
                else
                {
                    throw new Exception("Не удалось сохранить изображение!");
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "Ошибка!", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        private void closeNotSaveBtn_Click(object sender, EventArgs e)
        {
            Close();
        }
    }

у меня вылетает ошибка в строке pictureBox1.Image = m.ToImage<Bgr, byte>().Flip(Emgu.CV.CvEnum.FlipType.Horizontal).Bitmap; и pictureBox1.Image = image.Bitmap; "Image" не содержит определения для "Bitmap", и не удалось найти доступный метод расширения "Bitmap", принимающий тип "Image" в качестве первого аргумента (возможно, пропущена директива using или ссылка на сборку).

В чем может быть проблема, вроде все библиотеки и директивы подключил


решилось путем отката Emgu на более старую версию, на новой что-то похожее так и не нашел, видимо там другая структура. Только появилась другая проблема, фронтальная камера работает нормально на планшете, а основная не запускает поток. Не понятно в чем причина


Ответы (0 шт):