Наложение другого изображения на область лица
Автор работы: Пользователь скрыл имя, 24 Февраля 2012 в 21:01, курсовая работа
Краткое описание
Библиотека компьютерного зрения OpenCV –это коллекция функций, написанных на языке C, реализующих многие популярные алгоритмы обработки изображений и алгоритмы компьютерного зрения. Для реализации любого алгоритма из области компьютерного зрения, требуются общие - низкоуровневые, базовые моменты. К таким элементам относится манипулирование изображениями, организация структур памяти, захват видеоизображения с камеры и загрузка изображения из файла.
Содержание работы
Техническое задание..……………………………………………………..2
Введение ……………………………………………………………..…….4
Детектирование лиц и глаз………………………………………........5
Подробное описание процесса детектирования в функции
detect_and_draw()………………………………………………........5
Реализация отслеживания лица…………………………………………………7
Наложение другого изображения на область лица …………………..9
Заключение……..…………………………………………………..…….10
Список использованных источников.………………………………….11
Приложение A Результат работы программы………………………..12
Приложение B Исходный код программы………...…………
Содержимое работы - 1 файл
Курсовой проект-исправленный_1.docx
— 446.17 Кб (Скачать файл)
Федеральное государственное автономное
образовательное учреждение
высшего профессионального образования
«СИБИРСКИЙ ФЕДЕРАЛЬНЫЙ
Институт космических и
Кафедра «Вычислительная техника»
КУРСОВОЙ ПРОЕКТ
Наложение другого изображения на область лица
Пояснительная записка
Красноярск 2012
Техническое задание
Разработать программу, реализующую обработку изображений с помощью средств и методов библиотеки OpenCV, определяющую детектирование лиц и наложение другого изображения на область лица.
СОДЕРЖАНИЕ
Техническое задание..…………………………………………………….
Введение ……………………………………………………………..…….4
Детектирование лиц и глаз……………
…………………………........5
- Подробное описание процесса детектирования в функции
detect_and_draw()…………………………………
- Реализация отслеживания лица…………………………………………………7
- Наложение другого изображения на область лица …………………..9
Заключение……..…………………………………………
Список использованных источников.………………………………….11
Приложение A Результат работы программы………………………..12
Приложение B Исходный код программы………...…………….........
ВВЕДЕНИЕ
Библиотека компьютерного зрения OpenCV –это коллекция функций, написанных на языке C, реализующих многие популярные алгоритмы обработки изображений и алгоритмы компьютерного зрения. Для реализации любого алгоритма из области компьютерного зрения, требуются общие - низкоуровневые, базовые моменты. К таким элементам относится манипулирование изображениями, организация структур памяти, захват видеоизображения с камеры и загрузка изображения из файла. В результате многие исследователи вынуждены были выполнять одни и те же типовые работы. Однако, как и в любой другой области знания, в компьютерном зрении со временем появляются свои стандарты. Так, де-факто стандартом является открытая библиотека OpenCV. Ее значимый вклад заключается в наличии множества функций и алгоритмов, которые можно использовать как базу для создания новых алгоритмов. Помимо базовых функций, в библиотеку OpenCV включены многие алгоритмы компьютерного зрения, успешно зарекомендовавшие себя. Изначально OpenCV разрабатывалась под эгидой компании Intel. В настоящее время библиотека OpenCV развивается как международный open-source проект. Свой вклад в ее разработку внесли исследователи из многих стран мира.
Детектирование лиц и глаз
OpenCV обладает возможностью детектировать лица и глаза на изображениях и видео. Первоначально с помощью функции cvLoad() загружаются базы для детектирования лиц и глаз (OpenCV\data\haarcascades\). Помимо базы для детектирования лиц в фас, есть ещё база для детектирования лиц в профиль. В этом проекте использованы функции: cvNamedWindow(), detect_and_draw(), cvCreateImage(), cvCvtColor(), cvClearMemStorage(), cvHaarDetectObjects(), cvCircle() , cvGetSubRect(), cvShowImage().
Если базы нормально загружаются, то переходим к созданию хранилища памяти. Затем с помощью функции cvNamedWindow() создаём окно, в которое будут выводиться результаты детектирования, и программа входит цикл, в котором последовательно выполняется загрузка изображения в память, детектирование его с использованием функции detect_and_draw(), удаление изображения из памяти.
- Подробное описание процесса детектирования в функции detect_and_draw().
Первоначально определяется массив colors - в нём содержатся цвета для окружностей, которыми будут выделяться лица и глаза. С помощью функции cvCreateImage() создаются два дополнительных изображения (IplImage *gray, *small_img;), на которых и будет осуществляться детектирование. Эти изображения представлены в градациях серого, для перевода в этот формат использовалась функция cvCvtColor(). Далее обнуляется хранилище памяти cvClearMemStorage().
С использованием функции cvHaarDetectObjects() в последовательность faces возвращаются все участки на картинке, которые соответствуют лицу человека. Параметры этой функции характеризуют шаг, через который просматриваются объекты лица, минимальный размер области лица и дополнительные флаги. Посчитав время на детектирование лиц, и выведя его в стандартный поток печати, программа переходит к циклу, где перебираются все участки, соответствующие лицам, которые нашлись.
Первоначально на экран исходное изображение img выводится с помощью cvCircle() окружность. Затем, если база для детектирования глаз загрузилась успешно, программа с использованием cvGetSubRect() устанавливает границы, внутри которых будут искаться глаза. А затем, использую ту же функцию cvHaarDetectObjects() детектируются глаза внутри области лица. Программа опять входит в цикл, в котором перебираются все найденные глаза и обводятся окружностью.
Используя cvShowImage() выводим на экран результат детектирования лица. Ждём секунду (cvWaitKey(1000)) ожидание нажатия клавиши для завершения и, не забывая удалять созданные картинки, выходим из функции.
- Реализация отслеживания лица
2.1 Алгоритм использует следующие технологии:
1.детектируется лицо;
2.на лице выделяются контрольные точки, необходимые для осуществления мониторинга.
После детектирования лица нам известен многоугольник CvRect, который передаём в функцию cvSetImageROI для текущего изображения с Web-камеры, то есть CvRect накладывается на изображение.
2.2 Значение использование Tracking(отслеживание)
Tracking — это специальная технология, лежащая в основе взаимодействия человека с виртуальным миром. Она предназначена для определения позиции и ориентации реального объекта (например, руки, головы или специального устройства) в виртуальной среде с помощью нескольких степеней свободы.
Без использования пакета распараллеливания процедура детектирования лица полностью занимает ресурсы современного персонального компьютера, причём так, что не успевают обрабатываться все кадры. А при отслеживании лиц - на обычном компьютере затрачиваются не более 5% ресурсов центрального процессора в случае распараллеливания.
Для определения положения лица и его наклона будем оперироват
2.3 Начальное определение после детектирования лица
Первоначально точки обнуляются. Затем перебираются все точки отслеживания, к которым прибавляется смещение CvRect лица - RectFace. В Point1 суммируются все точки – итоговая расчетная точка будет нам показывать, где центр лица. Для определения наклона используется простое соображение - первоначально считается, что лицо расположено прямо, и выделяются все точки, которые выше центра лица
CenterFace. Этим точкам устанавливается специальный статус. После завершения цикла вычисляются средние значения точек. Собственно, проведя линию между Point1 и Point2, мы получаем наклон оси.
При осуществлении отслеживания, необходимо обновлять значения точек Point1 и Point2, где точка Point1
это средняя всех точек, а точка Point2 - это средняя точка всех точек со статусом point_status.
Для вывода другого лица поверх своего необходимо получение координаты точки вывода и наклона лица.
- Наложение другого изображения на область лица
При разработке различных систем наложения изображений часто бывает необходимо сделать один из цветов прозрачным. Такая возможность поддерживается функцией cvCopy.
cvCopy (lplImage *Image1, lplImage *Image2, lplImage *Image)
Пусть у нас есть некоторое изображение в 24 битном формате в
IplImage – Image1. Тогда для копирования изображения туда, куда надо (Image2) с прозрачным цветом . Для этого третьим параметром (Image) необходимо передать маску изображения, которую можно получить, переведя исходное изображение в изображение в градациях серого. При выделении лица — происходит наложение другого изображения поверх выделенной области и перемещение его в соответствующую позицию.
ЗАКЛЮЧЕНИЕ
При реализации этого курсового проекта были закреплены навыки работы с библиотекой OpenCV. Более детально в данной работе методы детектирование лиц, отслеживание лиц, и наложение другого изображения на выделенную область. После захвата изображения с видеокамеры, детектируется лицо человека. По результатам работы программы происходит наложения изображений на область лица. Для реализации решения задачи с использованием описанных выше методов была создана программа в среде программирования С++, которая обладает возможностью захвата изображения, последующей обработки полученного изображения, выделяет границы чего на изображении и находит среди них нужную.
Для ускорения процесса создания программы были использованы возможности библиотеки машинного зрения с открытым исходным кодом OpenCV . При разработке курсового проекта были использованы два модуля OpenCV: CV-модуль обработки изображений и компьютерного зрения, а так же Highgui-модуль для ввода/вывода изображений и видео.
Список использованных источников
- «Распознавание образов с использованием OpenCV» (источник - library/opencv/opencvkruchinin
.pdf) - http://robocraft.ru/page/
opencv/ - http://www.digital-sky.ru/
point-3/artcateg-17/article- 11.html - «Техническое зрение в системах управления-2011» http://tvcs2011.
technicalvision.ru/docs/ Abstracts2011.pdf
Приложение А
Результат работы программы
Приложение B
Исходный код программы
#include "cv.h"
#include "highgui.h"
#include <iostream>
#include <cstdio>
#ifdef _EiC
#define WIN32
#endif
using namespace std;
using namespace cv;
void detectAndDraw( Mat& img,
CascadeClassifier& cascade, CascadeClassifier& nestedCascade,
double scale);
String cascadeName =
"haarcascade_frontalface_alt.
String nestedCascadeName =
"haarcascade_eye_tree_
int main( int argc, const char** argv )
{
CvCapture* capture = 0;
Mat frame, frameCopy, image;
const String scaleOpt = "--scale=";
size_t scaleOptLen = scaleOpt.length();
const String cascadeOpt = "--cascade=";
size_t cascadeOptLen = cascadeOpt.length();
const String nestedCascadeOpt = "--nested-cascade";
size_t nestedCascadeOptLen = nestedCascadeOpt.length();
String inputName;
CascadeClassifier cascade, nestedCascade;
double scale = 1;
for( int i = 1; i < argc; i++ )
{
if( cascadeOpt.compare( 0, cascadeOptLen, argv[i], cascadeOptLen ) == 0 )
cascadeName.assign( argv[i] + cascadeOptLen );
else if( nestedCascadeOpt.compare( 0, nestedCascadeOptLen, argv[i], nestedCascadeOptLen ) == 0 )
{
if( argv[i][nestedCascadeOpt.
nestedCascadeName.assign( argv[i] + nestedCascadeOpt.length() + 1 );
if( !nestedCascade.load( nestedCascadeName ) )
cerr << "WARNING: Could not load classifier cascade for nested objects" << endl;
}
else if( scaleOpt.compare( 0, scaleOptLen, argv[i], scaleOptLen ) == 0 )
{
if( !sscanf( argv[i] + scaleOpt.length(), "%lf", &scale ) || scale < 1 )
scale = 1;
}
else if( argv[i][0] == '-' )
{
cerr << "WARNING: Unknown option %s" << argv[i] << endl;
}
else
inputName.assign( argv[i] );
}
if( !cascade.load( cascadeName ) )
{
cerr << "ERROR: Could not load classifier cascade" << endl;
cerr << "Usage: facedetect [--cascade=\"<cascade_path>\"]
" [--nested-cascade[=\"nested_
" [--scale[=<image scale>\n"
" [filename|camera_index]\n" ;
return -1;
}
if( inputName.empty() || (isdigit(inputName.c_str()[0]) && inputName.c_str()[1] == '\0') )
capture = cvCaptureFromCAM( inputName.empty() ? 0 : inputName.c_str()[0] - '0' );
else if( inputName.size() )
{
image = imread( inputName, 1 );
if( image.empty() )
capture = cvCaptureFromAVI( inputName.c_str() );
}
else
image = imread( "lena.jpg", 1 );
cvNamedWindow( "result", 1 );
if( capture )
{
for(;;)
{
IplImage* iplImg = cvQueryFrame( capture );
frame = iplImg;
if( frame.empty() )
break;
if( iplImg->origin == IPL_ORIGIN_TL )
frame.copyTo( frameCopy );
else
flip( frame, frameCopy, 0 );
detectAndDraw( frameCopy, cascade, nestedCascade, scale );
if( waitKey( 10 ) >= 0 )
goto _cleanup_;
}
waitKey(0);
_cleanup_:
cvReleaseCapture( &capture );
}
else
{
if( !image.empty() )
{
detectAndDraw( image, cascade, nestedCascade, scale );
waitKey(0);
}
else if( !inputName.empty() )
{
FILE* f = fopen( inputName.c_str(), "rt" );
if( f )
{
char buf[1000+1];
while( fgets( buf, 1000, f ) )
{
int len = (int)strlen(buf), c;
while( len > 0 && isspace(buf[len-1]) )
len--;
buf[len] = '\0';
cout << "file " << buf << endl;
image = imread( buf, 1 );
if( !image.empty() )
{
detectAndDraw( image, cascade, nestedCascade, scale );
c = waitKey(0);