Простой пример обнаружения лиц с Emgu CV

face

После своей последней статьи про использование библиотеки 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).Пожалуй, в комментариях все расписано, больше объяснять не буду.

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

example  Простой пример обнаружения лиц с Emgu CV

Алгоритм работает, на этом все.

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

  1. Антон:

    Автор, где ты взял компонент imagebox? Есть picturebox, но код не срабатывает если написать так:
    pictureBox1.Image = image;

  2. [...] детекции лица: link (сайт странный, открывать со включенным антивирусом) [...]

  3. JRS_:

    Ругается на создание экземпляра класса HaarCascade. Пишет, что такой класс не найден.
    Вопрос к автору статьи: Какую версию Emgu вы используете. Просто в версии 3.4.3 класса Capture не существует. Так же невозможно использовать метод QueryFrame() класса Capture для присвоения экземпляру класса Image. А еще нет метода DetectHaarCascade() для класса Image.

  4. Владимир:

    Привет всем. Ну что тут скажешь, очередной недоделаный код. У вас вечно будет, как ненормальный рости память, пока не произойдет переполнение.. И так по новой. Дурость. В новой Емгу 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 и как вызвать исключения. Это будет для вас домашним заданием.. :)

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

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

*

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