Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Близнюк_ДВ.docx
Скачиваний:
103
Добавлен:
26.03.2016
Размер:
1.04 Mб
Скачать
  1. Синтез Алгоритмов работы

Целью данной работы является создание программного комплекса, способного в реальном времени производить анализ каждого кадра видеопотока, производить поиск лица и глаз, выделяя искомые объекты геометрическими фигурами, рисовать целеуказатель, с изменением его положения на картинке в зависимости от направления взгляда человека.

Далее приведен основной алгоритм работы программного комплекса.

  1. получение видеопотока от web-камеры

  2. получить картинку (изображение) с камеры

  3. предварительная подготовка данных, то есть преобразование изображения в серых тонах и выравнивание гистограмм

  4. поиск лиц и глаз на полученном изображении

  5. выделение лиц и глаз геометрическими фигурами

  6. рисование целеуказателя, с изменением его координат в зависимости от направления взгляда человека.

    1. Алгоритм основной программы:

    1. Словесныйалгоритм:

  1. В инициализации переменных указываем пути до xml-файла, который хранит описание характеристик каскада, присваиваем вектору класс Mat, и указываем место для видео

  2. Чтобы получить доступ к камере, используем функцию cvCreateCameraCapture, если камеры не обнаружено, то выходим из программы. Это демонстрирует фрагмент кода:

//-- 2. Read the video stream

capture = cvCreateCameraCapture(0); // получаем любую подключенную камеру

if (capture == NULL) // если камера не обнаружена, то выйти

{

printf("(!)Don't open camera -- Exit");

return -1;

  1. Далее необходимо из полученного видеопотока, прочитать кадр и мы это реализуем с помощью функции cvQueryFrame(). Это демострирует фрагмент кода:

frame = cvQueryFrame(capture); // Читаем кадр из файла.

//-- 3. Apply the classifier to the frame

if (!frame.empty()) // если удалось получить кадр из видеопотока

  1. Вызываем подпрограмму detectAndDisplay, которая и ищет на изображении искомые объекты, выделяет их и выводит картинку.

  1. Далее нам необходимо считывание с клавиатуры, чтобы остановить работу программы, когда нам понадобится. Это происходит так: программа ждет 33 миллисекунды, и если кнопка ESC, то продолжаем цикл, но если была нажата клавиша ESC, прекращаем работу цикла. 33 миллисекунды дает задержку для просмотра 30 кадров в секунду. Это показывает фрагмент кода:

char c = cvWaitKey(30);

if (c == 27) { break; } // ESC для выхода.

  1. Если же программа завершается, то нам надо очистить память выделенную под Capture. Это делается помощью функции cvReleaseCapture. Это демонстрирует код:

cvReleaseCapture(&capture);

return 0;

    1. Алгоритм работы подпрограммы detectAndDisplay:

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

  2. Дальше будет этап предобработки, а именно конвертация цветного изображения в черно-белое и выравнивание гистограмм. Для этого используем этот фрагмент кода:

  • Конвертируем цветное изображение в черно-белое:

cvtColor(frame, frame_gray, CV_BGR2GRAY)

  • Выравнивание гистограмм:

equalizeHist(frame_gray, frame_gray);

  1. Подпрограмма Detect faces, которая осуществляет поиск лиц на черно-белом изображении frame_gray и сохранением их в вектор faces. Работа сомого поиска осуществляется с помощью функции detectMultiScale(), в параметрах которой мы указываем: где искать лицо, куда его сохранять, задаем параметры точности поиска и задаем минимальный размер размер подобласти, с которой начинается поиск объекта. Фрагмент кода демонстрирует работу функции detectMultiScale():

face_cascade.detectMultiScale(

frame_gray, // где ищем

faces, // куда сохраняем

1.1, // scale-параметр

6, // минимальное кол-во соседей, удаление лишних прямоугольников.

0 | CV_HAAR_SCALE_IMAGE, // поиск объектов с заданным масштабом.

Size(64, 64) // минимальный размер подобласти, с которой начинается поиск объекта.

);

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

for (int i = 0; i < faces.size(); ++i)

{

std::vector<Rect> eyes(10);

eyes_cascade.detectMultiScale(

frame_gray(faces[i]),

eyes,

1.1,

6,

0 | CV_HAAR_SCALE_IMAGE,

Size(32, 32)

);

  1. После тогда, как объект найден, необходимо его выделить геометрической фигурой. Для этого необходимо найти центр лица и рисование овала вокруг центра лица. Это демонстрирует фрагмент кода:

Point center(faces[i].x + faces[i].width*0.5, faces[i].y + faces[i].height*0.5)

ellipse(frame, center, Size(faces[i].width*0.5, faces[i].height*0.5), 0, 0, 360, Scalar(49, 226, 209), 2, 8, 0);

  1. Для нахождения центра глаз, нахождения центра круга и рисование круга используем этот фрагмент кода:

{

// Находим центр глаз

Point center(faces[i].x + eyes[j].x + eyes[j].width*0.5, faces[i].y + eyes[j].y + eyes[j].height*0.5);

// Находим радиус круга

int radius = cvRound((eyes[j].width + eyes[j].height)*0.25);

// Рисуем круг

circle(frame, center, radius, Scalar(255, 0, 0), 4, 8, 0);

}

  1. Для вывода кадра на экран используем эту функцию imshow():

imshow(window_name, frame);