Хочу немного рассказать про технологию OpenCV и её применение на языке программирования C#.

OpenCV (англ. Open Source Computer Vision Library, библиотека компьютерного зрения с открытым исходным кодом) — библиотека алгоритмов компьютерного зрения, обработки изображений и численных алгоритмов общего назначения с открытым кодом. Реализована на C/C++, также разрабатывается для Python, Java, Ruby, Matlab, Lua и других языков. Может свободно использоваться в академических и коммерческих целях — распространяется в условиях лицензии BSD.

На эту библиотеку я натолкнулся буквально недавно. На сайте toster.ru я задал вопрос про необычные темы для дипломных работ и в одном из ответов получил ссылки на результат работы с этой библиотекой. Вот некоторые из них:

www.youtube.com/watch?v=h9kPI7_vhAU
www.youtube.com/watch?v=256bg5_vNvg
www.youtube.com/watch?v=PUhwGTSNGhI

Для начала работы надо будет скачать нужные нам файлы с сайта www.emgu.com/wiki/index.php/Main_Page.

Emgu CV является кросс-платформенным .Net дополнением для библиотеки OpenCV для обработки изображений. Разработано для работы с .NET совместимыми языками, такими как C #, VB, VC ++, IronPython и т.д., может быть использовано в Visual Studio, Xamarin, работает с Windows, Linux, Mac OS X, IOS, Android и Windows Phone.

После того, как мы скачали и установили актуальную версию, можно приступать к работе. В данном примере мы будем находить и распознавать лицо и глаза человека.

Для этого нам понадобятся уже готовые xml-файлы, в которых содержится вся необходимая нам информация. Как было сказано, OpenCV является Open Source проектом, так что при желании можно найти множество уже готовых решений.

Для работы подключим соответствующие библиотеки:

using Emgu.CV;
using Emgu.CV.CvEnum;
using Emgu.CV.Structure;
using Emgu.CV.Cvb;

Для начала нам потребуется создать экземпляр класса Capture:

Capture capture = new Capture();

Этот объект будет отвечать за перехват видео потока.

Для создания объекта, который распознает наше лицо или глаза, мы будем использовать замечательный класс HaarCascade. Классификатор (а именно каскад форсированных классификаторов, работающих с Хаара-подобными функциями) обучается с несколькими сотнями образцов видов конкретного объекта (например, лицо или автомобиль), называет положительные примеры, которые масштабируются в тот же размер (скажем, 20х20), и отрицательные примеры — произвольные изображения одного и того же размера.

То есть при создании экземпляра класса HaarCascade в его конструкторе мы указываем ссылку на xml файл, который содержит нужные нам данные.

//for face
HaarCascade faceCascade = new HaarCascade("haarcascade_frontalface_alt.xml");
//for eye
HaarCascade eyeCascade = new HaarCascade("haarcascade_eye.xml");

Для того, что бы работать дальше с перехваченным кадром, надо использовать метод QueryFrame().

Image<Bgr, Byte> image = capture.QueryFrame();

Мы получаем наш кадр, которые нам передает наше устройство (веб-камера). Далее найденное нами изображение переводим в серый цвет.

Image<Gray, Byte> grayImage = image.Convert<Gray, Byte>(); 

Теперь надо найти атрибуты, которые принадлежат нашему лицу и глазам.

var Face = grayImage.DetectHaarCascade(faceCascade)[0];                             
foreach (var face in Face)
{
//Если таковы найдены, то рисуем вокруг них круг, с заданным цветом и толщиной линии.
image.Draw(face.rect, new Bgr(255, 255, 255), 10); 
} 
//Аналогично и для глаз
var Eye = grayImage.DetectHaarCascade(eyeCascade)[0]; 
foreach (var eye in Eye)
{
image.Draw(eye.rect, new Bgr(0, 0, 255), 3);          
}

Ну вот почти и все, остается только куда-то вывести полученное нами изображение. Для этого будем использовать элемент управления imageBox (его надо добавить в ручную).

imageBoxEyeAndFaceDetector.Image = image;

Теперь мы можем задать работу нашего когда в нужном нам месте, например, при нажатии кнопки.

Application.Idle += Method;

Ссылка для скачивания xml файлов: ifolder.com.ua/z3fihkcet19n.html

Так же советую просмотреть это видео для общего понимания работы машинного зрения www.youtube.com/watch?v=TyEfJyJA7gQ.

Удачи вам в вашей работе.

Ссылки


www.emgu.com/wiki/index.php/Main_Page
ru.wikipedia.org/wiki/OpenCV
devnuances.com

Комментарии (6)


  1. xanep
    19.06.2015 19:57
    +1

    Что ж вы ни словом не обмолвились как генерировать эти «готовые xml-файлы, в которых содержится вся необходимая нам информация»?
    Выглядит статья примерно так: 1. Step one 2. Step two 3. ???? 4. PROFIT!!!


    1. olololosh Автор
      19.06.2015 21:00

      Это же рассчитано для начинающих, каким я сам и являюсь. Для того что бы сделать xml файл, нужно сделать несколько тысяч фотографий множества лиц, или глаз под разными ракурсами, а потом все оформить а виде xml документа, грамотно оформить, залезть в класс HaarCascade, внести туда изменения, и так далее. Новичку, это сложно сделать, да и незачем, ведь библиотека open source, постоянно умные люди что то добавляют, и все это можно просто найти в интернете.


  1. dymanoid
    19.06.2015 21:30
    +3

    Присоединяюсь к предыдущему оратору. Статья простовата для уровня Хабра. Кроме того, есть пара вещей, которые довольно спорны или не до конца раскрыты. Например, EmguCV — это вовсе не бесплатное дополнение, у этого враппера двойная лицензия (за коммерческое использование надо платить). Кроме того, не указано, что врапперов таких много (я знаю как минимум 4). Кстати, строго говоря, OpenCV + C# = P/Invoke, чего в статье тоже нет.
    Ну и не совсем ясно, что значит «начало работы». В статье нет инструкций по установке, особенностей, описания структуры и основных типов или чего-то похожего.


    1. olololosh Автор
      19.06.2015 21:45

      Я рассматривал саму библиотеку, не останавливаясь на таких элементах как установка, что бы максимально упростить статью. Про платную версию, знаю, но точно так и не понял чем конкретно она отличается. Я старался показать минимально рабочею модель. Но все равно спасибо, ваша критика очень уместна, учту в следующие разы, ведь это мой первый опыт написания статей, так что судите как можно строже.


  1. ZlodeiBaal
    19.06.2015 21:42

    Вас не смутило, что мало того, что на Хабре порядка 200 статей по OpenCV, а ещё есть и блог создателей?


    1. olololosh Автор
      19.06.2015 21:54
      -2

      Да, вы совершенно правы. Ведь при поиске в гугле на русском, первые же ссылки ведут на Хабр, которые я так же основательно изучил. Но для меня, как для человека, только-только узнавшего такое название как «Open CV», было немного тяжело разобраться что к чему. А тут, как выразился один пользователь, для новичка достаточно повторить минимальное количество действий, и уже получить
      хоть что то. Лично для меня, как мне кажется, эта статья очень даже помогла бы.