Простой пример обнаружения лиц с 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

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

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

  1. Антон:

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

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

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

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

*

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