Опубликован: 20.08.2013 | Уровень: для всех | Доступ: платный | ВУЗ: Новосибирский Государственный Университет
Самостоятельная работа 1:

Сборка и установка библиотеки OpenCV. Использование библиотеки в среде Microsoft Visual Studio

< Лекция 5 || Самостоятельная работа 1: 12345678910 || Самостоятельная работа 2 >

5.3. Разработка приложения для детектирования лиц на видео

Создадим проект 02_FaceDetection и файл исходного кода main.cpp в существующем решении. Конечная цель – разработать консольное приложение, которое позволяет детектировать лица на видеопотоке с использованием классификатора Хаара. Предполагается, что видеопоток извлекается из файла или поступает с веб-камеры. В качестве аргументов командной строки будем передавать название файла, содержащего натренированную модель лица, и при необходимости путь до видеофайла. Также требуется предусмотреть возможность принудительной остановки обработки видео.

const char* helper = 
  "02_FaceDetection.exe <model_file> [<video>]\n\ 
  \t<model_file> - полное имя файла с моделью\n\ 
  \t<video> - путь до видеофайла (по умолчанию \n\ 
    видеопоток принимается с камеры)\n";       
    

Создадим функцию main с пустым телом. Перед функцией объявим пару констант DELAY и ESC_KEY. DELAY будем использовать, чтобы зафиксировать время задержки при последовательном отображении кадров видео, ESC_KEY – чтобы обозначить код клавиши Esc, при нажатии которой будет происходить принудительная остановка обработки видеопотока.

#define DELAY 30 
#define ESC_KEY 27       
    

Обратимся к разработке кода основной функции. Для этого необходимо реализовать следующую последовательность операций:

  1. Разобрать аргументы командной строки, чтобы извлечь полное название файла с моделью лица и при необходимости имя видеофайла.
    char *modelFileName = 0, *videoFileName = 0; 
    if (argc < 2) 
    { 
      printf("%s", helper); 
      return 1; 
    } 
    modelFileName = argv[1]; 
    if (argc > 2) 
    { 
      videoFileName = argv[2]; 
    }       
          
  2. Создать классификатор и загрузить модель.
    // создание классификатора и загрузка модели 
    CascadeClassifier cascade; 
    cascade.load(modelFileName);       
          
  3. Загрузить видео из файла или открыть видеопоток с веб-камеры, если название файла отсутствует в параметрах командной строки. // загрузка видеофайла или перехват видеопотока VideoCapture capture; if (videoFileName == 0) { capture.open(0); } else { capture.open(videoFileName); } if (!capture.isOpened()) { printf("Incorrect capture name.\n"); return 1; }
  4. Создать окно для отображения видео.
    const char* winName = "video"; 
    // создание окна для отображения видео 
    namedWindow(winName);       
          
  5. Разработать цикл обработки последовательности кадров видепотока. На каждой итерации цикла необходимо конвертировать текущий кадр в оттенки серого, продетектировать лица, отрисовать полученные окаймляющие прямоугольники на изображении и отобразить это изображение. Тело цикла будет выполняться до тех пор, пока не будет достигнут конец трека, либо не будет нажата клавиша Esc.
    char key = -1; 
    Mat image, gray; 
    vector<Rect> objects; 
    // получение кадра видеопотока 
    capture >> image; 
    while (image.data != 0 && key != ESC_KEY) 
    { 
      cvtColor(image, gray, CV_BGR2GRAY); 
      cascade.detectMultiScale(gray, objects); 
      for (i = 0; i < objects.size(); i++) 
      { 
        rectangle(image, 
          Point(objects[i].x, objects[i].y), 
          Point(objects[i].x+objects[i].width, 
            objects[i].y+objects[i].height), 
          CV_RGB(255, 0, 0), 2); 
      } 
      imshow(winName, image); 
      key = waitKey(DELAY); 
      capture >> image; 
      gray.release(); 
      objects.clear(); 
    }       
          
  6. Освободить ресурсы и закрыть видеопоток.
    capture.release();       
          

5.4. Запуск приложения и анализ результатов

Сделаем проект 02_FaceDetection рабочим, выполнив команду контекстного меню Set as StartUp Project…. Скомпилируем и запустим приложение. Будем считать, что видеопоток принимается с веб-камеры, поэтому передадим в качестве параметра командной строки только файл модели. Используем файл haarcascade_frontalface_default.xml.

На рис. 6.18 показан результат детектирования на одном из кадров видеопотока. Приведенное изображение демонстрирует идеальный случай, когда классификатор достаточно точно обнаружил лицо человека. В данном случае неплохой результат во многом обусловлен наличием однородного фона и отсутствием предметов со сложным цветом и текстурой. Тем не менее, среди кадров даже "простого" трека всегда можно найти такие, где классификатор ошибается, т.е. вообще не находит лицо либо считает отдельные части изображения лицами.

Результат детектирования лиц на одном из кадров видеопотока

Рис. 6.18. Результат детектирования лиц на одном из кадров видеопотока

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

< Лекция 5 || Самостоятельная работа 1: 12345678910 || Самостоятельная работа 2 >
Александра Максимова
Александра Максимова

При прохождении теста 1 в нем оказались вопросы, который во-первых в 1 лекции не рассматривались, во-вторых, оказалось, что вопрос был рассмаотрен в самостоятельно работе №2. Это значит, что их нужно выполнить перед прохождением теста? или это ошибка?
 

Алена Борисова
Алена Борисова

В лекции по обработке полутоновых изображений (http://www.intuit.ru/studies/courses/10621/1105/lecture/17979?page=2) увидела следующий фильтр:


    \begin{array}{|c|c|c|}
    \hline \\
    0 & 0 & 0 \\
    \hline \\
    0 & 2 & 0 \\
    \hline \\
    0 & 0 & 0 \\
    \hline 
    \end{array} - \frac{1}{9} \begin{array}{|c|c|c|}
    \hline \\
    0 & 0 & 0 \\
    \hline \\
    0 & 1 & 0 \\
    \hline \\
    0 & 0 & 0 \\
    \hline 
    \end{array}

В описании говорится, что он "делает изображение более чётким, потому что, как видно из конструкции фильтра, в однородных частях изображение не изменяется, а в местах изменения яркости это изменение усиливается".

Что вижу я в конструкции фильтра (скорее всего ошибочно): F(x, y) = 2 * I(x, y) - 1/9 I(x, y) = 17/9 * I(x, y), где F(x, y) - яркость отфильтрованного пикселя, а I(x, y) - яркость исходного пикселя с координатами (x, y). Что означает обычное повышение яркости изображения, при этом без учета соседних пикселей (так как их множители равны 0).

Объясните, пожалуйста, как данный фильтр может повышать четкость изображения?

Сергей Кротов
Сергей Кротов
Россия
Дмитрий Донсков
Дмитрий Донсков
Россия, Москва, Московский Авиационный Институт