
После своей последней статьи про использование библиотеки Emgu CV я решил слегка усложнить задачу. Я решил не просто выводить видео с веб камеры, а заставить программу распознавать человеческие лица. Данный пример не является научным пособием и он не очень сильно оптимизирован, это всего-навсего простой пример. С ним можно поиграться (если вас зацепило), что я вам советую.
В данной статье будет использоваться метод Виолы-Джонса. Советую почитать статью - лучшее что я видел.
Подготовка
Итак, запускаем Visual Studio, создаем новый проект Windows Forms. Я назву свой FaceDetection. Далее нужно добавить нужные библиотеки: нажимаем правой кнопкой мыши в Обозревателе решений на Ссылки -> Добавить ссылку, выбираем вкладку Обзор. Идем по адресу «ваша_папка_с_EmguCV/bin», выделяем файлы «Emgu.CV.dll», «Emgu.CV.UI.dll», «Emgu.CV.Util.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 FaceDetection { public partial class Form1 : Form { public Form1() { InitializeComponent(); } //Экземпляркласса Capture Capture myCapture = new Capture(); private void GetVideo(object sender, EventArgs e) { //Обучаем наш алгоритм HaarCascade Cascade = new HaarCascade("haarcascade_frontalface_alt.xml"); HaarCascade CascadeEye = new HaarCascade("haarcascade_eye.xml"); //Берем кадр и делаем его из цветного в серый Image<Bgr, Byte> image = myCapture.QueryFrame(); Image<Gray, Byte> grayImage = image.Convert<Gray, Byte>(); //Ищем признаки лица var Faces = grayImage.DetectHaarCascade(Cascade)[0]; foreach (var face in Faces) { //Eсли есть - обводим его. Первый аргумент - координаты, второй - цвет линии, третий - толщина image.Draw(face.rect, new Bgr(255, 255, 255), 10); } //Ищем признаки глаз var Eyes = grayImage.DetectHaarCascade(CascadeEye)[0]; foreach (var eye in Eyes) { //Обводим image.Draw(eye.rect, new Bgr(0, 0, 255), 3); } //Выводим обработаное приложение imageBox1.Image = image; } //Тут думаю все ясно private void button1_Click(object sender, EventArgs e) { Application.Idle += GetVideo; } } }
Ссылка на файлы к коду (закинуть в папочку Debug).Пожалуй, в комментариях все расписано, больше объяснять не буду.
Алгоритм работает, на этом все.
Автор, где ты взял компонент imagebox? Есть picturebox, но код не срабатывает если написать так:
pictureBox1.Image = image;
http://devnuances.com/c_sharp/vyivod-video-s-veb-kameryi-s-ispolzovaniem-emgu-cv/
pictureBox1.Image = image.ToBitmap();
Image img = new Image(image.ToBitmap());
pictureBox1.Image = img.ToBitmap();
[...] детекции лица: link (сайт странный, открывать со включенным антивирусом) [...]
у меня ругается на Capture myCapture = new Capture();
Ругается на создание экземпляра класса HaarCascade. Пишет, что такой класс не найден.
Вопрос к автору статьи: Какую версию Emgu вы используете. Просто в версии 3.4.3 класса Capture не существует. Так же невозможно использовать метод QueryFrame() класса Capture для присвоения экземпляру класса Image. А еще нет метода DetectHaarCascade() для класса Image.
Привет всем. Ну что тут скажешь, очередной недоделаный код. У вас вечно будет, как ненормальный рости память, пока не произойдет переполнение.. И так по новой. Дурость. В новой Емгу 4.. пишеться не Capture Capture, а Video Cature! Штатный драйвер вебки это DirectShow ; 0 или ничего это первая камера найденая в диспедчере, и драйвер не mpeg. Вот сами взгляните на свой код и к примеру подсуньте ей ссылку на веб устройство например Capture Capture = new Capture(«http://192.168.0.1:8080/video»); например ip камеры или там iptv любого рабочего канала.. Слайд шоу обеспеченно..
Есть много методов написать иначе.. Как пример:
using System;
using System.Collections.Generic;
using System.Windows.Forms;
using Emgu.CV;
namespace // название проекта!
{
public partial class Form1 : Form // созданой формы
{
public Form1()
{
InitializeComponent();
}
/* Памятка для ленивых.
///
/// Auto detect
///
Any = 0,
///
/// Video For Windows (obsolete, removed)
///
Vfw = 200,
///
/// V4L/V4L2 capturing support
///
V4L = 200,
///
/// Same as CAP_V4L
///
V4L2 = V4L,
///
/// IEEE 1394 drivers
///
Firewire = 300,
///
/// IEEE 1394 drivers
///
IEEE1394 = Firewire,
///
/// IEEE 1394 drivers
///
DC1394 = Firewire,
///
/// IEEE 1394 drivers
///
CMU1394 = Firewire,
///
/// QuickTime (obsolete, removed)
///
QT = 500,
///
/// Unicap drivers (obsolete, removed)
///
Unicap = 600,
///
/// DirectShow (via videoInput)
///
DShow = 700,
///
/// PvAPI, Prosilica GigE SDK
///
Pvapi = 800,
///
/// OpenNI (for Kinect)
///
OpenNI = 900,
///
/// OpenNI (for Asus Xtion)
///
OpenNIAsus = 910,
///
/// Android — not used
///
Android = 1000,
///
/// XIMEA Camera API
///
XiApi = 1100,
///
/// AVFoundation framework for iOS (OS X Lion will have the same API)
///
AVFoundation = 1200,
///
/// Smartek Giganetix GigEVisionSDK
///
Giganetix = 1300,
///
/// Microsoft Media Foundation (via videoInput)
///
Msmf = 1400,
///
/// Microsoft Windows Runtime using Media Foundation
///
Winrt = 1410,
///
/// Intel Perceptual Computing SDK
///
IntelPerc = 1500,
///
/// OpenNI2 (for Kinect)
///
Openni2 = 1600,
///
/// OpenNI2 (for Asus Xtion and Occipital Structure sensors)
///
Openni2Asus = 1610,
///
/// gPhoto2 connection
///
Gphoto2 = 1700,
///
/// GStreamer
///
Gstreamer = 1800,
///
/// Open and record video file or stream using the FFMPEG library
///
Ffmpeg = 1900,
///
/// OpenCV Image Sequence (e.g. img_%02d.jpg)
///
Images = 2000,
///
/// Aravis SDK
///
Aravis = 2100,
///
/// Built-in OpenCV MotionJPEG codec
///
OopencvMjpeg = 2200,
///
/// Intel MediaSDK
///
IntelMfx = 2300,
///
/// XINE engine (Linux)
///
Xine = 2400,
*/
Capture Capture1 = new Capture(700);//камера usb
Mat a = new Mat();
private void programma(object sender, EventArgs e)
{
PictureBox qw= new PictureBox();
Camera(qw, e);
pictureBox1.Image = qw.Image;
}
private void Camera( PictureBox qwe, EventArgs e)
{
var fibNumbers = new List { 200 };
foreach (int element in fibNumbers)
{
Capture1.Retrieve(a);
qwe.Image = a.Bitmap;
}
}
}
}
// к форме подкидываем таймер! timer1 в его свойствах ставим «события Elapsed» Enable :True, и привязываем в событиях Tick:programma
// запускаем проект и о чуда и камера фурычит и Мат создается и в оперативке 62 мб. И оно не растет!! Странно!!
так как работает в отдельном потоке поглащая процессоры равномерно.. А вот как по ссылкев этом коде смотреть iptv и как вызвать исключения. Это будет для вас домашним заданием..