Viola Jones на собственной шкуре, часть 1. Настройка проекта под OpenCV

    Привет, друзья мои! Дорогие Хабраюзеры и Хабрачитатели, предлагаю Вам окунуться в дебри разработки программы распознавания эмоций по материалам предыдущих моих статей.

    Начнем с проектирования модуля



    На «входе» аппарата автоматического распознавания эмоций должно быть загруженное в модуль цветное или черно-белое изображение, либо видеопоток, а на «выходе» — массив прямоугольников, описанных вокруг лиц и черт лица, текстовое заключение о присутствии той или иной эмоции на найденных лицах.

    Работа модуля состоит из трех основных этапов:
    1. Предварительная подготовка изображения к более удобному распознаванию лиц и черт лица;
    2. Распознавание лиц и черт лица разработанным модифицированным алгоритмом Виолы-Джонса;
    3. Подтверждение обнаруженной эмоции, вывод на экран соответствующей информации.

    Выбор среды и средств разработки



    Планируемый программный модуль, я его предварительно назвал «EmotionRecognitionTool v 0.1 by SkyNoName», реализующий алгоритм Виолы-Джонса с его модификацией, в целях демонстрации будет написан в интегрированной среде разработки (Integrated Development Environment, IDE) Microsoft Visual Studio© 2010 на языке С либо С++ с использованием открытой библиотеки компьютерного зрения OpenCV (Open Source Computer Vision library)последней версии (но у меня была установлена ранее версия 2.2), а также videoInput версии 0.1995 от юзера theo watson. Я попробую разработать модуль под операционными системами Windows 7 Ultimate и Ubuntu 10.10 с использованием кросс-платформенной системы сборки модуля Cmake.
    На самом деле выбор средств не ограничен никак. Можно делать свои приложения, к примеру, на PHP с использованием GD, с использованием кросс-платформенного инструментария Qt и на других языках программирования. Но я выбрал то, что есть под рукой в данный момент…
    Сперва стоит скачать, проплатить ( ;) ) и установить Microsoft Visual Studio с официальной страницы загрузки приложения.
    Затем скачиваем библиотеку OpenCV. Кстати, недавно вышел новый релиз библиотеки с многими дополнениями и изменениями, а именно версия 2.3.1, но об этом возможно позже. Для минимальной разработки можно выбрать либо 2.3 либо 2.2 на официальной странице загрузки.
    Также, нам понадобится система сборки Cmake, распространяемая с Creative commons лицензией(cc by-nd 3.0). Качаем.
    При работе с видеопотоком нам понадобится свободно распространяемый модуль VideoInput, его можно забрать из Git'а (можно также использовать код из готовых решений fdlib и stasm) для взаимодействия ввода и вывода с камер и на камеры.

    Порядок установки



    При установке Visual Studio не должно возникнуть проблем. Впрочем, как и при установке OpenCV, правда тут есть один момент — надо добавить некоторые пути к скомпилированным dll-файлам в переменную окружения.
    Для версии 2.2 для win32 это делается при установке: ставится флажок на пункте Add OpenCV to the system PATH for current user.
    Для версии «2.3.1 superpack» архив можно распаковать в папку С:\OpenCV2.3.1 и затем добавить адреса

    C:\OpenCV2.3.1\build\bin;
    C:\OpenCV2.3.1\build\x64\mingw\bin;
    C:\OpenCV2.3.1\build\x64\vc9\bin;
    C:\OpenCV2.3.1\build\x64\vc10\bin;
    C:\OpenCV2.3.1\build\x86\mingw\bin;
    C:\OpenCV2.3.1\build\x86\vc9\bin;
    C:\OpenCV2.3.1\build\x86\vc10\bin;

    в переменную PATH данного пользователя.
    Для этого надо зайти в Пуск-Панель управления-Все элементы управления-Система (либо выбрать пункт Свойства при клике правой кнопкой мыши по значку Компьютер), выбрать Дополнительные параметры системы. В окне свойств системы перейти на вкладку Дополнительно и щелкнуть на кнопку Переменные среды..., откроется диалоговое окно где надо будет Создать либо Изменить переменную PATH со значениями адресов, данных выше (у меня предустановлена версия 2.2, поэтому на скриншоте присутствует именно она):



    Устанавливаем Cmake, последняя версия которого под Windows 2.8.6 и запускаем Cmake-gui.
    Сначала возникнет окно с пустыми полями.
    Надо в поле Where the source code/Где исходный код указать распакованную папку с OpenCV на диске С:
    C:/OpenCV2.3.1
    Затем в поле Where to build the binaries/Где компилировать бинарники (коды) указать вложенную в OpenCV папку build:
    C:/OpenCV2.3.1/build
    Нажать кнопку Confige и указать там нужный генератор, по-другому компилятор Visual Studio, в моей VS2010 это Visual Studio 10 Win64. После этого будет указан список доступных параметров для компиляции. Т.к. мы еще не генерировали makefile, основная область компиляции будет красной.



    После этого необходимо выбрать файлы, которые будут компилироваться, отметить их галочками, и нажать кнопку Generate.
    Ждем завершения генерации универсального make-файла и закрываем cmake. В результате, у нас должны добавиться манифесты cmake в папке C:\OpenCV2.3.1\build\, а также проект OpenCV.sln.

    Запустим данный проект (автоматически откроется в среде Microsoft Visual Studio) с помощью клавиши F7. С помощью данного проекта линкуются методы OpenCV, а также примеры их использования, доступные в samples. Если в Cmake было отмечено много параметров галками, то завершения компиляции придется подождать. Окно работающего компилятора показано ниже:



    Для тех, у кого уже была до этого ранняя версия OpenCV либо были в ходе установки указаны дополнительные параметры, Visual Studio найдет все неучтенные и выдаст сообщение о добавлении данных обновлений и новых файлов. Если Вы хотите «обновиться», то нажмите Reload all:



    Шаблон проекта с OpenCV



    Пришла пора, после всех танцев с бубном, сделать собственный шаблон проекта. Для этого нужно:

    1. Создать новый проект в Microsoft Visual Studio.

    Я выбрал и создал проект с интерфейсом CLI (c поддержкой командной строки, Command Line Interface).

    2. В свойствах созданного проекта «привязать» к нему нужные dll-, lib-файлы и каталоги.

    Чтобы это сделать, надо зайти в General Properties/Главные свойства проекта. План действий таков: нажать правой кнопкой по названию проекта в Solution Explorer/Проводник по проекту (решению) и выбрать Properties/Свойства:



    Затем, в окне свойств проекта, выбрать раздел Configuration properties/Свойства конфигурации и его подраздел VC++ Directories/VC++ Директории (Каталоги). Найти в списке параметров Include Directories/Включаемые Директории (Каталоги):



    После этого, кликнуть на поле редактирования, появится стрелка выпадающего списка. Кликнем и по ней. Выберем пункт Edit/Редактировать:



    В открывшемся окне щелкаем на иконку добавления нового каталога и выбираем каталоги для включения такие:

    C:\OpenCV2.3.1\include\
    C:\OpenCV2.3.1\include\opencv
    C:\OpenCV2.3.1\include\opencv2
    C:\OpenCV2.3.1\include\opencv\3rdparty\include
    C:\OpenCV2.3.1\include\opencv\modules


    После добавления новых каталогов, щелкнем кнопку Ок:



    Затем, в привычном уже нам окне, прописать в пункте Library Directories/Библиотечные Директории (Каталоги) пути до библиотечек OpenCV (у меня на скриншоте ниже показаны пути до библиотечных файлов версии 2.2):

    C:\OpenCV2.3.1\build\x64\vc9\lib
    C:\OpenCV2.3.1\build\x64\vc10\lib
    C:\OpenCV2.3.1\build\x86\vc9\lib
    C:\OpenCV2.3.1\build\x86\vc10\lib




    Можно перейти в раздел Linker/Компоновщик, выбрать в нем подраздел Input/Ввод и прописать в пункте Additional Dependencies/Дополнительные зависимости пути до дополнительных библиотек, которые Вы хотите использовать в своих проектах. К примеру,

    opencv_calib3d231.lib
    opencv_features2d231d.lib
    opencv_haartraining_engined.lib
    opencv_video231d.lib
    и т.д. По надобности, добавляйте их в данный пункт:


    После того, как добавили, прописали все пути, жмите Ок.

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

    Так как мы работаем по большей части с изображениями, а также с нахождением объектов — добавляем в шаблон проекта такие заголовочные файлы:

    //Указываем заголовочники
    #include <opencv2/objdetect/objdetect.hpp>
    #include <opencv2/features2d/features2d.hpp>
    #include <opencv2/highgui/highgui.hpp>
    #include <opencv2/calib3d/calib3d.hpp>
    #include <opencv2/imgproc/imgproc_c.h>
    #include <opencv2/imgproc/imgproc.hpp>
    


    Для более комфортной работы и для использования определенных методов надо подключить библиотеки. Практически в любом проекте они оказываются нужными:

    //нужные подключаемые библиотеки
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <assert.h>
    #include <math.h>
    #include <float.h>
    #include <limits.h>
    #include <time.h>
    #include <ctype.h>
    #include <conio.h>
    


    Нажмите F5 и попробуйте скомпилировать проект. Должно получиться. Таким образом, у нас для дальнейших разработок теперь есть единый шаблон.

    Начиная с версии 2.3 разработанный проект сможет запуститься с успехом на другой машине если его переносить вместе с требуемыми dll-файлами, которые удобно расположены в папках под названием «bin», путь до которых лежит через папки build\x86 либо build\x64.
    Также, есть файлы, которые используются для расширенных возможностей (к примеру, dll-ка кодека ffmpeg), они сложены в одно место для удобства (тусуются в папке 3dparty).
    Вкупе с исполняемым файлом (.exe), Ваша работа должна запуститься даже там, где специальные программы не установлены.

    Требования к разработке проекта по распознаванию эмоций



    В ближайшем будущем программа должна будет обрасти собственным пользовательским интерфейсом, более интерактивным и наглядным.
    Для корректной работы разрабатываемого проекта требуются следующая минимальная системная конфигурация:
    • процессор: не ниже Intel Core 2 Duo E6550 2.33 GHz (2.33 ГГц)
    • оперативная память, ОЗУ: SDRAM (англ. Synchronous Dynamic Random Access Memory — синхронная динамическая память с произвольным доступом): не ниже 2Gb (2Гб) DDR3(double-data-rate three) от любого производителя
    • 150 Mb (МБ) свободного места на жестком диске

    Рекомендуемая системная конфигурация такова:
    • процессор: Intel Core i3-370M 2.4 GHz (2.4 ГГц)
    • оперативная память, ОЗУ: SDRAM 4Gb (4Гб) DDR3
    • 300 Mb (МБ) свободного места на жестком диске

    Характеристики программного обеспечения

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

    Минимальные характеристики ПО (запуск релиза версии 0.1):
    • Windows XP SP3 / Vista / Windows 7 (32-битные),
    — просмотрщик изображений от любой компании.

    Рекомендуемые параметры ПО (запуск пакета версии 0.1):
    • Windows 7 (64-битная),
    — просмотрщик изображений от любой компании
    — любая среда разработки, поддерживающая работу с языком С++ (Microsoft Visual Studio 2010),
    — предустановленная стандартная библиотека OpenCV 2.2,
    — универсальный компилятор проекта Cmake 2.8.4,
    — система управления базами данных MySQL Database 6.0,
    — консольная панель GitBash единого свободного репозитория GitHub (GitVersion 1.7.4),
    — PSPad Editor, для работы с форматом xml
    • Linux,
    — Ядро Linux — 2.2.14 или выше со следующими библиотеками:
    — glibc 2.3.2 или выше,
    — XFree86-3.3.6 или выше,
    — gtk+2.0 или выше,
    — fontconfig (известная так же как xft),
    — libstdc++ 5,
    — компилятор gcc for Linux,
    — распакованная и готовая к работе MySQL for Linux,
    — далее, при работе с программой, Linux автоматически найдет все необходимые пакеты обновлений и пакеты – установщики программ.

    Исходный код данного модуля должен быть открытым (в соответствии с лицензией GNU General Public License v3), ибо я так хочу. Его можно будет скопировать с релизной ветки проекта из единого репозитория. Проект скорее всего будет находиться по адресу: github.com/kalian/EmotionRecognitionTool-v.-1.0 (check-out проекта свободный).

    С таким результатом закончу первую часть повествования разработки собственного модуля распознавания эмоций.
    Еще раз всем спасибо за внимание! С Вами был SkyNoName, ждите продолжения, надеюсь оно будет еще до Нового Года.

    В подготовке данной статьи мне помогли следующие мануалы и ресурсы, форумы.
    Тем, кто только начал заниматься разработкой приложений с помощью OpenCV рекомендую:
    1. © «RoboCraft» – этот ресурс создавался с целью информационного отражения деятельности калининградской команды RoboCraft в области робототехники. Есть много примеров реализации цифровой обработки изображений, и не только.
    2. Блог программиста Андрея из Томска с ником Troyashka, который уже давно знаком с OpenCV. В его блоге куча полезной информации.
    3. Форум сайта о машинном зрении Compvision.ru, в недрах которого много информации для новичков, посидел я и на нем в начале своего знакомства с OpenCV
    • +11
    • 25,4k
    • 9
    Поделиться публикацией

    Комментарии 9

      0
      Вы решили в теги сокращенную версию статьи поместить? )
        –1
        SEO-текст ))) Сейчас поправлю…
          0
          Просто столько много тэгов появилось потому что я сначала хотел всё-всё в одну статью запихнуть, но слишком много информации, поэтому не получилось, разбил на две (а может и три выйдет).
            +1
            Вот почему замечания нужно сделать по ЛС. Автор поправил, а ваш коммент уже нонсенс.
            +1
            В вашей статье про распознавание образов не больше 10%. Остальное про то, как вы славно настраивали C++ под виндовс.

            Может стоит это всё делать под линукс? Пару строк кода и можно приступать от настройки к собственно программированию.

              –1
              Просто не знаю, в какой блог это логичнее разместить. Под Линукс тоже не всё так просто как хотелось бы
                0
                вот не знаю, чего у вас там сложного под линуксом. apt-get install и всё компилируется.
              –1
              OpenCV установил, настроил для работы с Qt Creator. Тестовые примеры компилируются, но при запуске падают с ошибкой: dl.dropbox.com/u/1231954/pics/screen-error.png
              Подскажите, в чем может быть проблема?
                –1
                Ну у Вас в репорте об ошибке сказано, что проблема в dll-файле highgui231. На стадии компиляции никаких багов не вылезает? Если нет, то рекомендую всё-таки попробовать заменить данный файл в папке библиотеки и проверить пути до него в линках проекта. Или, если Вы собираете пакет, попробуйте поместить все dll-ки в папку с exeшником…
                Тут надо смотреть больше информации, чем можно выудить из одного скрина

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

              Самое читаемое