Захват видео с камеры и сохранение фото
Пытаюсь сделать захват видео с камеры с помощью 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 на более старую версию, на новой что-то похожее так и не нашел, видимо там другая структура. Только появилась другая проблема, фронтальная камера работает нормально на планшете, а основная не запускает поток. Не понятно в чем причина