- •Аннотация
- •Реферат
- •Содержание
- •Введение
- •Анализ технического задания
- •Описание метода Viola Jones
- •1.1.2 Интегральное представление изображений
- •1.1.3 Признаки Хаара
- •1.1.5 Бустинг
- •Синтез Алгоритмов работы
- •Алгоритм основной программы:
- •Словесныйалгоритм:
- •Алгоритм работы подпрограммы detectAndDisplay:
- •Разработка программного решения
- •Разработка интерфейса программы
- •Классы и функции, используемые в работе.
- •Матрицы и типы изображений
- •Класс CvCapture
- •Технико-экономическоеобоснование работы
- •Обоснование актуальности и целесообразности разработки
- •Обоснование выбора аналога и критериев для сравнения
- •Расчет технико-экономических показателей разработки
- •Расчет единовременных квартальных затрат на этапе разработки.
- •Расчет сравнительной технико-экономической эффективности разработки.
- •Заключение
- •Безопасность человеко-машинного взаимодействия
- •Заключение
Синтез Алгоритмов работы
Целью данной работы является создание программного комплекса, способного в реальном времени производить анализ каждого кадра видеопотока, производить поиск лица и глаз, выделяя искомые объекты геометрическими фигурами, рисовать целеуказатель, с изменением его положения на картинке в зависимости от направления взгляда человека.
Далее приведен основной алгоритм работы программного комплекса.
получение видеопотока от web-камеры
получить картинку (изображение) с камеры
предварительная подготовка данных, то есть преобразование изображения в серых тонах и выравнивание гистограмм
поиск лиц и глаз на полученном изображении
выделение лиц и глаз геометрическими фигурами
рисование целеуказателя, с изменением его координат в зависимости от направления взгляда человека.
Алгоритм основной программы:
Словесныйалгоритм:
В инициализации переменных указываем пути до xml-файла, который хранит описание характеристик каскада, присваиваем вектору класс Mat, и указываем место для видео
Чтобы получить доступ к камере, используем функцию cvCreateCameraCapture, если камеры не обнаружено, то выходим из программы. Это демонстрирует фрагмент кода:
//-- 2. Read the video stream
capture = cvCreateCameraCapture(0); // получаем любую подключенную камеру
if (capture == NULL) // если камера не обнаружена, то выйти
{
printf("(!)Don't open camera -- Exit");
return -1;
Далее необходимо из полученного видеопотока, прочитать кадр и мы это реализуем с помощью функции cvQueryFrame(). Это демострирует фрагмент кода:
frame = cvQueryFrame(capture); // Читаем кадр из файла.
//-- 3. Apply the classifier to the frame
if (!frame.empty()) // если удалось получить кадр из видеопотока
Вызываем подпрограмму detectAndDisplay, которая и ищет на изображении искомые объекты, выделяет их и выводит картинку.
Далее нам необходимо считывание с клавиатуры, чтобы остановить работу программы, когда нам понадобится. Это происходит так: программа ждет 33 миллисекунды, и если кнопка ESC, то продолжаем цикл, но если была нажата клавиша ESC, прекращаем работу цикла. 33 миллисекунды дает задержку для просмотра 30 кадров в секунду. Это показывает фрагмент кода:
char c = cvWaitKey(30);
if (c == 27) { break; } // ESC для выхода.
Если же программа завершается, то нам надо очистить память выделенную под Capture. Это делается помощью функции cvReleaseCapture. Это демонстрирует код:
cvReleaseCapture(&capture);
return 0;
Алгоритм работы подпрограммы detectAndDisplay:
В инициализации переменных создаем вектор, который описывает область с обнаруженными объектами, и создаем переменную, которая будет хранить черно-белый кадр
Дальше будет этап предобработки, а именно конвертация цветного изображения в черно-белое и выравнивание гистограмм. Для этого используем этот фрагмент кода:
Конвертируем цветное изображение в черно-белое:
cvtColor(frame, frame_gray, CV_BGR2GRAY)
Выравнивание гистограмм:
equalizeHist(frame_gray, frame_gray);
Подпрограмма 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) // минимальный размер подобласти, с которой начинается поиск объекта.
);
Поиск глаз работает по такому же принципу, что поиск лица, отличие лишь в том, что поиск лица ведется на всем изображении, а поиск глаз ведется из вектора 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)
);
После тогда, как объект найден, необходимо его выделить геометрической фигурой. Для этого необходимо найти центр лица и рисование овала вокруг центра лица. Это демонстрирует фрагмент кода:
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);
Для нахождения центра глаз, нахождения центра круга и рисование круга используем этот фрагмент кода:
{
// Находим центр глаз
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);
}
Для вывода кадра на экран используем эту функцию imshow():
imshow(window_name, frame);