Наложение другого изображения на область лица

Автор работы: Пользователь скрыл имя, 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, определяющую детектирование лиц и наложение другого изображения на область лица.

 

 

СОДЕРЖАНИЕ

     Техническое задание..……………………………………………………..2

     Введение ……………………………………………………………..…….4

  1. Детектирование лиц и глаз………………………………………........5

    1. Подробное описание процесса детектирования в функции 

detect_and_draw()………………………………………………........5

  1. Реализация отслеживания лица…………………………………………………7
  2. Наложение другого изображения на область лица …………………..9

Заключение……..…………………………………………………..…….10

     Список использованных источников.………………………………….11

    Приложение A Результат работы программы………………………..12

    Приложение B Исходный код программы………...…………….........13

 

 

 

 

 

ВВЕДЕНИЕ

 

Библиотека компьютерного зрения OpenCV –это коллекция функций, написанных на языке C, реализующих многие популярные алгоритмы обработки изображений и алгоритмы компьютерного зрения. Для реализации любого алгоритма из области компьютерного зрения, требуются общие - низкоуровневые, базовые моменты. К таким элементам относится манипулирование изображениями, организация структур памяти, захват видеоизображения с камеры и загрузка изображения из файла. В результате многие исследователи вынуждены были выполнять одни и те же типовые работы. Однако, как и в любой другой области знания, в компьютерном зрении со временем появляются свои стандарты. Так, де-факто стандартом является открытая библиотека OpenCV. Ее значимый вклад заключается в наличии множества функций и алгоритмов, которые можно использовать как базу для создания новых алгоритмов. Помимо базовых функций, в библиотеку OpenCV включены многие алгоритмы компьютерного зрения, успешно зарекомендовавшие себя. Изначально OpenCV разрабатывалась под эгидой компании Intel. В настоящее время библиотека OpenCV развивается как международный open-source проект. Свой вклад в ее разработку внесли исследователи из многих стран мира.

 

 

 

  1. Детектирование  лиц и глаз

OpenCV обладает возможностью детектировать лица и глаза на изображениях и видео. Первоначально с помощью функции cvLoad() загружаются базы для детектирования лиц и глаз (OpenCV\data\haarcascades\). Помимо базы для детектирования лиц в фас, есть ещё база для детектирования лиц в профиль. В этом проекте использованы функции: cvNamedWindow(), detect_and_draw(), cvCreateImage(), cvCvtColor(), cvClearMemStorage(), cvHaarDetectObjects(), cvCircle() , cvGetSubRect(), cvShowImage().

Если базы нормально загружаются, то переходим к созданию хранилища памяти. Затем с помощью функции cvNamedWindow() создаём окно, в которое будут выводиться результаты детектирования, и программа входит цикл, в котором последовательно выполняется загрузка изображения в память, детектирование его с использованием функции detect_and_draw(), удаление изображения из памяти.

 

    1. Подробное описание процесса детектирования в функции detect_and_draw().

 

Первоначально определяется массив colors - в нём содержатся цвета для окружностей, которыми будут выделяться лица и глаза. С помощью функции cvCreateImage() создаются два дополнительных изображения (IplImage *gray, *small_img;), на которых и будет осуществляться детектирование. Эти изображения представлены в градациях серого, для перевода в этот формат использовалась функция cvCvtColor(). Далее обнуляется хранилище памяти cvClearMemStorage().

С использованием функции cvHaarDetectObjects() в последовательность faces возвращаются все участки на картинке, которые соответствуют лицу человека. Параметры этой функции характеризуют шаг, через который просматриваются объекты лица, минимальный размер области лица и дополнительные флаги. Посчитав время на детектирование лиц, и выведя его в стандартный поток печати, программа переходит к циклу, где перебираются все участки, соответствующие лицам, которые нашлись.

Первоначально на экран исходное изображение img выводится с помощью cvCircle() окружность. Затем, если база для детектирования глаз загрузилась успешно, программа с использованием cvGetSubRect() устанавливает границы, внутри которых будут искаться глаза. А затем, использую ту же функцию cvHaarDetectObjects() детектируются глаза внутри области лица. Программа опять входит в цикл, в котором перебираются все найденные глаза и обводятся окружностью.

Используя cvShowImage() выводим на экран результат детектирования лица. Ждём секунду (cvWaitKey(1000)) ожидание нажатия клавиши для завершения и, не забывая удалять созданные картинки, выходим из функции.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  1. Реализация отслеживания лица

 

2.1 Алгоритм использует следующие технологии:

1.детектируется лицо;

2.на лице выделяются контрольные точки, необходимые для осуществления мониторинга.

 После детектирования лица нам известен многоугольник CvRect, который передаём в функцию cvSetImageROI для текущего изображения с Web-камеры, то есть CvRect накладывается на изображение.

 

2.2 Значение использование Tracking(отслеживание)

 

Tracking  — это специальная технология, лежащая в основе взаимодействия человека с виртуальным миром. Она предназначена для определения позиции и ориентации реального объекта (например, руки, головы или специального устройства) в виртуальной среде с помощью нескольких степеней свободы.

Без использования пакета распараллеливания процедура детектирования лица полностью занимает ресурсы современного персонального компьютера, причём так, что не успевают обрабатываться все кадры. А при отслеживании лиц - на обычном компьютере затрачиваются не более 5% ресурсов центрального процессора в случае распараллеливания.

Для определения положения лица и его наклона будем оперировать двумя переменными: Point1 и Point2.

 

2.3 Начальное определение после детектирования лица

 

Первоначально точки обнуляются. Затем перебираются все точки отслеживания, к которым прибавляется смещение CvRect лица - RectFace. В Point1 суммируются все точки – итоговая расчетная точка будет нам показывать, где центр лица. Для определения наклона используется простое соображение - первоначально считается, что лицо расположено прямо, и выделяются все точки, которые выше центра лица

CenterFace. Этим точкам устанавливается специальный статус. После завершения цикла вычисляются средние значения точек. Собственно, проведя линию между Point1 и Point2, мы получаем наклон оси.

При осуществлении отслеживания, необходимо обновлять значения точек Point1 и Point2, где точка Point1

это средняя всех точек, а точка Point2 - это средняя точка всех точек со статусом point_status.

Для вывода другого лица поверх своего необходимо получение координаты точки вывода и наклона лица.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  1. Наложение другого изображения на область лица

 

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

cvCopy (lplImage *Image1, lplImage *Image2, lplImage *Image)

Пусть у нас есть некоторое изображение  в 24 битном формате в 

IplImage – Image1. Тогда для копирования изображения туда, куда надо (Image2) с прозрачным цветом . Для этого третьим параметром (Image) необходимо передать маску изображения, которую можно получить, переведя исходное изображение в изображение в градациях серого. При выделении лица — происходит наложение другого изображения поверх выделенной области и перемещение его в соответствующую позицию.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

ЗАКЛЮЧЕНИЕ

 

При реализации этого курсового  проекта были закреплены навыки работы с библиотекой OpenCV. Более детально в данной работе методы детектирование лиц, отслеживание лиц, и наложение другого изображения на выделенную область. После захвата изображения с видеокамеры, детектируется лицо человека. По результатам работы программы происходит наложения изображений на область лица. Для реализации решения задачи с использованием описанных выше методов была создана программа в среде программирования С++, которая обладает возможностью захвата изображения, последующей обработки полученного изображения, выделяет границы чего на изображении и находит среди них нужную.

Для ускорения процесса создания программы  были использованы возможности библиотеки машинного зрения с открытым исходным кодом OpenCV . При разработке курсового проекта были использованы два модуля OpenCV: CV-модуль обработки изображений и компьютерного зрения, а так же Highgui-модуль для ввода/вывода изображений и видео.

 

 

 

 

 

 

 

 

 

Список использованных источников

 

  1. «Распознавание образов с использованием OpenCV» (источник - library/opencv/opencvkruchinin.pdf)
  2. http://robocraft.ru/page/opencv/
  3. http://www.digital-sky.ru/point-3/artcateg-17/article-11.html
  4. «Техническое зрение в системах управления-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.xml";

String nestedCascadeName =

"haarcascade_eye_tree_eyeglasses.xml";

 

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.length()] == '=' )

                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>\"]\n"

            "   [--nested-cascade[=\"nested_cascade_path\"]]\n"

            "   [--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);

Информация о работе Наложение другого изображения на область лица