
В данной статье я хотел бы рассказать вам как реализовать перехват изображения с веб камеры. Для этого я использую библиотеку 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; }
Ну и пожалуй все. Так реализуется самый простой пример «перехвата видеопотока».
cool!
пример ради примера.
на практике такой алгоритм применять не следует, ибо загружает процессор на 30%..и это только в захвате изображения. а если еще нужна обработка????
Данный пример является самым простым возможным примером и его действительно не стоит применять на практике.
я попробовал такой пример и картинка начала «рваться» (в некоторых местах сильно смазывалась). скажите это можно победить?
Дополнительные сведения: Инициализатор типа «Emgu.CV.CvInvoke» выдал исключение. При создании объекта Capture
У меня почему-то выдает ошибку на 31 строчке «Image Kadr = myCapture.QueryFrame();». Не нравится «myCapture.QueryFrame()» — неявное преобразование типа «Emgu.CV.Mat» в «Emgu.CV.Image» невозможно.
Как это исправить?
ошибка
«myCapture.QueryFrame()» — неявное преобразование типа «Emgu.CV.Mat» в «Emgu.CV.Image» невозможно.
пишите
Mat Kadr = myCapture.QueryFrame();
вместо
Image Kadr = myCapture.QueryFrame();
и все будет норм
Необработанное исключение типа «System.TypeInitializationException» в Emgu.CV.World.dll
Дополнительные сведения: Инициализатор типа «Emgu.CV.CvInvoke» выдал исключение. на строку с Capture myCapture = new Capture();
Можете подсказать причину или кинуть рабочий исходник
В imageBox1 только черный фон.Светодиод на камере зажигается. Камера в скайп работает.
беСпрерывно*