Вывод видео с веб камеры с использованием Emgu CV

36302_small

В данной статье я хотел бы рассказать вам как реализовать перехват изображения с веб камеры. Для этого я использую библиотеку Emgu CV (Кто не знает что это: Клац!).

Подготовка

Итак, запускаем Visual Studio, создаем новый проект Windows Forms. Я назву свой webCam. Далее нужно добавить нужные библиотеки: нажимаем правой кнопкой мыши в Обозревателе решений на Ссылки  -> Добавить ссылку, выбираем вкладку Обзор. Идем по адресу «ваша_папка_с_EmguCV/bin», выделяем файлы «Emgu.CV.dll», «Emgu.CV.UI.dll», «Emgu.CV.Util.dll». Затем открываем Панель элементов->Общие(правым щелчком)->Выбрать элементы->Обзор, идем по адресу «ваша_папка_с_EmguCV/bin», выбираем файл «Emgu.CV.UI.dll», кликаем Открыть, Ок.

Создание формы

Берем новый инструмент ImageBox, кидаем его на форму, растягиваем его до среднего размера, форма элемента — желательно квадратная (при желании можно потом добавить кнопочки).

Сам код

Сначала я покажу вам весь код, а потом покажу вам принцип работы и прочие нюансы (кхе-кхе).

Код:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
//Подключаем библиотеки
using Emgu.CV;
using Emgu.CV.UI;
using Emgu.Util;
using Emgu.CV.CvEnum;
using Emgu.CV.Structure;

namespace webCam
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        //Создаем объект myCapture который отвечает за перехват
        Capture myCapture = new Capture();

        private void GetVideo(object sender, EventArgs e)
        {
            //Берем кадр
            Image<Bgr, Byte> Kadr = myCapture.QueryFrame();
            //Вставляем в imageBox
            imageBox1.Image = Kadr;
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            //Делаем это безпрерывно
            Application.Idle += GetVideo;
        }
    }
}

Внимание! Перед запуском залейте все *.dll файлы из »ваша_папка_с_EmguCV/bin» нужно залить в паку Debug вашего проекта. Итак, как оно работает: Тут думаю все ясно, подключение библиотек.

//Подключаем библиотеки
using Emgu.CV;
using Emgu.CV.UI;
using Emgu.Util;
using Emgu.CV.CvEnum;
using Emgu.CV.Structure;

Здесь находится сердце программы, экземпляр класса Capture —  myCapture содержит метод QueryFrame() с помощью которого происходит перехват кадра с веб камеры (существуют также методы типа QueryGreyFrame() с помощью которых можно реализовать вывод видео в серых тонах). И этот кадр подставляется в imageBox.

//Создаем объект myCapture который отвечает за перехват
        Capture myCapture = new Capture();

        private void GetVideo(object sender, EventArgs e)
        {
            //Берем кадр
            Image<Bgr, Byte> Kadr = myCapture.QueryFrame();
            //Вставляем в imageBox
            imageBox1.Image = Kadr;
        }

Выполняем данное действие беспрерывно.

private void Form1_Load(object sender, EventArgs e)
        {
            //Делаем это безпрерывно
            Application.Idle += GetVideo;
        }

Ну и пожалуй все. Так реализуется самый простой пример «перехвата видеопотока».

9 комментариев

  1. Ivan:

    пример ради примера.
    на практике такой алгоритм применять не следует, ибо загружает процессор на 30%..и это только в захвате изображения. а если еще нужна обработка????

    • Данный пример является самым простым возможным примером и его действительно не стоит применять на практике.

    • Oleksandr:

      я попробовал такой пример и картинка начала «рваться» (в некоторых местах сильно смазывалась). скажите это можно победить?

  2. Дополнительные сведения: Инициализатор типа "Emgu.CV.CvInvoke" выдал исключение.:

    Дополнительные сведения: Инициализатор типа «Emgu.CV.CvInvoke» выдал исключение. При создании объекта Capture

  3. Andrew:

    У меня почему-то выдает ошибку на 31 строчке «Image Kadr = myCapture.QueryFrame();». Не нравится «myCapture.QueryFrame()» — неявное преобразование типа «Emgu.CV.Mat» в «Emgu.CV.Image» невозможно.
    Как это исправить?

  4. razbiralochka:

    ошибка

    «myCapture.QueryFrame()» — неявное преобразование типа «Emgu.CV.Mat» в «Emgu.CV.Image» невозможно.

  5. Tilesto:

    пишите
    Mat Kadr = myCapture.QueryFrame();
    вместо
    Image Kadr = myCapture.QueryFrame();

    и все будет норм

  6. Sam:

    Необработанное исключение типа «System.TypeInitializationException» в Emgu.CV.World.dll

    Дополнительные сведения: Инициализатор типа «Emgu.CV.CvInvoke» выдал исключение. на строку с Capture myCapture = new Capture();
    Можете подсказать причину или кинуть рабочий исходник

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

*

Можно использовать следующие HTML-теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>