48759 (Реализация метода главных компонент с помощью библиотеки OpenCV)

2016-08-02СтудИзба

Описание файла

Документ из архива "Реализация метода главных компонент с помощью библиотеки OpenCV", который расположен в категории "". Всё это находится в предмете "информатика" из , которые можно найти в файловом архиве . Не смотря на прямую связь этого архива с , его также можно найти и в других разделах. Архив можно найти в разделе "остальное", в предмете "информатика, программирование" в общих файлах.

Онлайн просмотр документа "48759"

Текст из документа "48759"

Министерство образования и науки Российской Федерации

Южно-Уральский государственный университет

Кафедра Автоматика и Управление

Курсовая работа

на тему

Реализация метода главных компонент с помощью библиотеки OpenCV

Выполнил: Пушников А.А.

Группа: ПС-669

Проверил Разнополов К.О.

Дата «____» _____________2006 г.

Челябинск

2006 г

Оглавление

Метод главных компонент 2

Реализация метода главных компонент в OpenCV 3

Текст программы 4


Метод главных компонент

Метод главных компонент (Principal Component Analysis, PCA) применяется для сжатия информации без существенных потерь информативности. Он состоит в линейном ортогональном преобразовании входного вектора X размерности N в выходной вектор Y размерности M, N. При этом компоненты вектора Y являются некоррелированными и общая дисперсия после преобразования остаётся неизменной. Матрица X состоит из всех примеров изображений обучающего набора. Решив уравнение , получаем матрицу собственных векторов , где – ковариационная матрица для X, а – диагональная матрица собственных чисел. Выбрав из подматрицу , соответствующую M наибольшим собственным числам, получим, что преобразование , где – нормализованный вектор с нулевым математическим ожиданием, характеризует большую часть общей дисперсии и отражает наиболее существенные изменения X.

Выбор первых M главных компонент разбивает векторное пространство на главное (собственное) пространство , содержащее главные компоненты, и его ортогональное дополнение .

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

Для каждого изображения лица вычисляются его главные компоненты. Обычно берётся от 5 до 200 главных компонент. Остальные компоненты кодируют мелкие различия между эталоном и шум. Процесс распознавания заключается в сравнении главных компонент неизвестного изображения с компонентами всех остальных изображений. Для этого обычно применяют какую-либо метрику (простейший случай – Евклидово расстояние). При этом предполагается, что изображения, соответствующие одному эталону, сгруппированы в кластеры в собственном пространстве. Из базы данных (или тренировочного набора) выбираются изображения-кандидаты, имеющие наименьшее расстояние от входного (неизвестного) изображения.

Дальнейшее совершенствование заключалось в использовании метрики Махаланобиса и Гауссовского распределения для оценки близости изображений. Для учёта различных ракурсов в этой же работе использовалось многомодальное распределение изображений в собственном пространстве.

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

Основной недостаток – высокие требования к условиям съёмки изображений. Изображения должны быть получены в близких условиях освещённости, одинаковом ракурсе. Должна быть проведена качественная предварительная обработка, приводящая изображения к стандартным условиям (масштаб, поворот, центрирование, выравнивание яркости, отсечение фона).


Реализация метода главных компонент в OpenCV

Библиотека OpenCV реализует описанный выше алгоритм следующими функциями:

Функция, вычисляет собственные объекты эталонов:

void cvCalcEigenObjects( int nObjects, void* input, void* output, int ioFlags, int ioBufSize, void* userData, CvTermCriteria* calcLimit, IplImage* avg, float* eigVals ),

где

nObjects – число эталонов

input - указатель на массив изображений-эталонов (изображения глубиной 8 бит)

output – (выход функции) указатель на массив собственных объектов (изображения глубиной 32 бит)

ioFlags – флаги ввода/вывода. Для работы с памятью.

ioBufSize - размер буфера. Для работы с памятью.

userData – указатель на структуру для работы с памятью.

calcLimit – критерий прекращения вычислений. Два варианта: по количеству итераций и по ко точности (?)

avg – (выход функции) усредненное изображение эталонов

eigVals (выход функции) указатель на собственные числа (может быть NULL)

Функция, вычисляет коэффициенты разложения:

void cvEigenDecomposite( IplImage* obj, int eigenvec_count, void* eigInput, int ioFlags, void* userData, IplImage* avg, float* coeffs ),

где

obj – исследуемое изображение

eigenvec_count – число собственных объектов

eigInput - указатель на массив собственных объектов (изображения глубиной 32 бит)

ioFlags – флаги ввода/вывода. Для работы с памятью.

userData – указатель на структуру для работы с памятью.

avg - (выход функции) усредненное изображение эталонов

coeffs - (выход функции) коэффициенты разложения (?)

Функция, вычисляет проекцию исследуемого изображения на пространство собственных объектов:

void cvEigenProjection( void* input_vecs, int eigenvec_count, int io_flags, void* userdata, float* coeffs, IplImage* avg, IplImage* proj ),

где

input_vec - указатель на массив собственных объектов (изображения глубиной 32 бит)

eigenvec_count – число собственных объектов

io_flags – флаги ввода/вывода. Для работы с памятью.

userdata – указатель на структуру для работы с памятью.

coeffs - коэффициенты разложения (?)

avg - усредненное изображение эталонов

proj - проекция исследуемого изображения на пространство собственных объектов

В полученной проекции имеет смысл убрать излишние компоненты (например, с помощью функции cvThreshold – отсечение по порогу). Далее полученный результат можно сравнивать с эталонами, для принятия решения. Способов сравнения много, это может быть, например, минимальное расстояние (Евклидово) или корреляция с эталонами.


Текст программы

//---------------------------------------------------------------------------

#include

#pragma hdrstop

#include "Unit1.h"

#include "cxcore.h"

#include "cv.h"

//---------------------------------------------------------------------------

#pragma package(smart_init)

#pragma resource "*.dfm"

TForm1 *Form1;

IplImage **Objs, *Pro, *Object;

int obj_number=3;

HINSTANCE highgui,cv,cvaux;

IplImage* (__stdcall *cvLoadImage)( const char* filename, int iscolor);

int (__stdcall *cvSaveImage)( const char* filename, const CvArr* image);

int (__stdcall *cvNamedWindow)( const char* name, int flags );

void (__stdcall *cvShowImage)( const char* name, const CvArr* image );

IplImage* (__stdcall *cvCreateImage_)( CvSize size, int depth, int channels );

double (__stdcall *cvDotProduct_)(const CvArr* src1, const CvArr* src2 );

void (__stdcall *cvMul_)(const CvArr* src1, const CvArr* src2, CvArr* dst, double scale=1 );

void (__stdcall *cvThreshold_)(const CvArr* src, CvArr* dst, double threshold,double max_value, int threshold_type);

//---------------------------------------------------------------------------

__fastcall TForm1::TForm1(TComponent* Owner)

: TForm(Owner)

{

}

//---------------------------------------------------------------------------

void show_im(TCanvas*c,IplImage *p)

{

for(int i=0;i

width;i++)

for(int j=0;j

height;j++)

{

int a=p->imageDataOrigin[p->widthStep*j+i];

c->Pixels[i][j]=a&0x0000ff|(a<<8)&0x00ff00|(a<<16)&0xff0000;

}

}

void pca(int obj_number, IplImage **Objs,CvTermCriteria limit, IplImage *Object,IplImage *Pro)

{

CvSize size;

int m1=obj_number;

IplImage **EigObjs, *Avg;

float *coeffs;

HINSTANCE hDLL = LoadLibrary("cvaux100.dll");

if (!hDLL) return;

void (__stdcall *cvCalcEigenObjects)( int nObjects, void* input, void* output, int ioFlags, int ioBufSize, void* userData, CvTermCriteria* calcLimit, IplImage* avg, float* eigVals );

cvCalcEigenObjects = (void(__stdcall *)( int nObjects, void* input, void* output, int ioFlags, int ioBufSize, void* userData, CvTermCriteria* calcLimit, IplImage* avg, float* eigVals ))GetProcAddress(hDLL, "cvCalcEigenObjects");

if (!cvCalcEigenObjects) return;

void (__stdcall *cvEigenDecomposite)( IplImage* obj, int nEigObjs, void* eigInput, int ioFlags, void* userData, IplImage* avg, float* coeffs );

cvEigenDecomposite = (void(__stdcall *)( IplImage* obj, int nEigObjs, void* eigInput, int ioFlags, void* userData, IplImage* avg, float* coeffs ))GetProcAddress(hDLL, "cvEigenDecomposite");

if (!cvEigenDecomposite) return;

void (__stdcall *cvEigenProjection)( void* eigInput, int nEigObjs, int ioFlags, void* userData, float* coeffs, IplImage* avg, IplImage* proj );

cvEigenProjection = (void(__stdcall *)( void* eigInput, int nEigObjs, int ioFlags, void* userData, float* coeffs, IplImage* avg, IplImage* proj ))GetProcAddress(hDLL, "cvEigenProjection");

if (!cvEigenProjection) return;

EigObjs=new IplImage*[m1];

coeffs=new float[m1];

size.width = Object->width; size.height = Object->height;

Avg = cvCreateImage_( size, IPL_DEPTH_32F, 1 );

for(int i=0; i

{

EigObjs[i] = cvCreateImage_( size, IPL_DEPTH_32F, 1 );

}

cvCalcEigenObjects( obj_number, (void*)Objs, (void*)EigObjs, 0, 0, NULL, &limit, Avg, NULL );

cvEigenDecomposite( Object, m1, (void*)EigObjs, 0, NULL, Avg, coeffs );

cvEigenProjection ( (void*)EigObjs, m1, 0, NULL, coeffs, Avg, Pro );

FreeLibrary(hDLL);

// cvReleaseImage( &Avg );

// for(int i=0; i

// {

// cvReleaseImage( &EigObjs[i] );

// }

// cvFree( &coeffs);

}

void __fastcall TForm1::FormCreate(TObject *Sender)

{

highgui = LoadLibrary("highgui100.dll");

if (!highgui) return;

cvLoadImage = (IplImage*(__stdcall *)( const char* filename, int iscolor))GetProcAddress(highgui, "cvLoadImage");

if (!cvLoadImage) return;

cvSaveImage = (int(__stdcall *)( const char* filename, const CvArr* image))GetProcAddress(highgui, "cvSaveImage");

if (!cvSaveImage) return;

cvNamedWindow = (int(__stdcall *)( const char* name, int flags ))GetProcAddress(highgui, "cvNamedWindow");

if (!cvNamedWindow) return;

cvShowImage = (void(__stdcall *)( const char* name, const CvArr* image ))GetProcAddress(highgui, "cvShowImage");

if (!cvShowImage) return;

cv = LoadLibrary("cxcore100.dll");

if (!cv) return;

cvCreateImage_ = (IplImage*(__stdcall *)( CvSize size, int depth, int channels ))GetProcAddress(cv, "cvCreateImage");

if (!cvCreateImage_) return;

cvDotProduct_ = (double(__stdcall *)( const CvArr* src1, const CvArr* src2))GetProcAddress(cv, "cvDotProduct");

if (!cvDotProduct_) return;

cvMul_ = (void(__stdcall *)( const CvArr* src1, const CvArr* src2, CvArr* dst, double scale=1))GetProcAddress(cv, "cvMul");

if (!cvMul_) return;

cvaux = LoadLibrary("cv100.dll");

if (!cvaux) return;

cvThreshold_ = (void(__stdcall *)(const CvArr* src, CvArr* dst, double threshold,double max_value, int threshold_type))GetProcAddress(cvaux, "cvThreshold");

if (!cvThreshold_) return;

Objs=new IplImage*[obj_number];

Objs[0] = cvLoadImage( ".\\et\\1.bmp", 0);

show_im(Image1->Canvas,Objs[0]);

Objs[1] = cvLoadImage( ".\\et\\2.bmp", 0);

show_im(Image2->Canvas,Objs[1]);

Objs[2] = cvLoadImage( ".\\et\\3.bmp", 0);

show_im(Image3->Canvas,Objs[2]);

String fname="6.bmp";

Object = cvLoadImage((".\\in\\"+fname).c_str(), 0);

show_im(Image4->Canvas,Object);

}

//---------------------------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)

{

float e[3];

CvTermCriteria limit;

CvSize size;

size.width = Object->width; size.height = Object->height;

Pro = cvCreateImage_( size, IPL_DEPTH_8U, 1 );

limit.type = CV_TERMCRIT_EPS;

limit.max_iter = 1;

limit.epsilon = 0.1;

show_im(Image4->Canvas,Object);

pca(obj_number,Objs,limit,Object,Pro);

show_im(Image5->Canvas,Pro);

cvThreshold_(Pro,Object,200,255,CV_THRESH_BINARY);

show_im(Image6->Canvas,Object);

cvMul_(Object,Objs[0],Pro);

show_im(Image7->Canvas,Pro);

cvMul_(Object,Objs[1],Pro);

show_im(Image8->Canvas,Pro);

cvMul_(Object,Objs[2],Pro);

show_im(Image9->Canvas,Pro);

e[0]=cvDotProduct_(Object,Objs[0])/cvDotProduct_(Objs[0],Objs[0]);

e[1]=cvDotProduct_(Object,Objs[1])/cvDotProduct_(Objs[1],Objs[1]);

e[2]=cvDotProduct_(Object,Objs[2])/cvDotProduct_(Objs[2],Objs[2]);

Label1->Caption=FloatToStr(int(e[0]*1000)/1000.);

Label2->Caption=FloatToStr(int(e[1]*1000)/1000.);

Label3->Caption=FloatToStr(int(e[2]*1000)/1000.);

if(e[0]>e[1])

if(e[0]>e[2])

ShowMessage("1");

if(e[1]>e[0])

if(e[1]>e[2])

ShowMessage("2");

if(e[2]>e[1])

if(e[2]>e[0])

ShowMessage("3");

}

//---------------------------------------------------------------------------

Свежие статьи
Популярно сейчас
Почему делать на заказ в разы дороже, чем купить готовую учебную работу на СтудИзбе? Наши учебные работы продаются каждый год, тогда как большинство заказов выполняются с нуля. Найдите подходящий учебный материал на СтудИзбе!
Ответы на популярные вопросы
Да! Наши авторы собирают и выкладывают те работы, которые сдаются в Вашем учебном заведении ежегодно и уже проверены преподавателями.
Да! У нас любой человек может выложить любую учебную работу и зарабатывать на её продажах! Но каждый учебный материал публикуется только после тщательной проверки администрацией.
Вернём деньги! А если быть более точными, то автору даётся немного времени на исправление, а если не исправит или выйдет время, то вернём деньги в полном объёме!
Да! На равне с готовыми студенческими работами у нас продаются услуги. Цены на услуги видны сразу, то есть Вам нужно только указать параметры и сразу можно оплачивать.
Отзывы студентов
Ставлю 10/10
Все нравится, очень удобный сайт, помогает в учебе. Кроме этого, можно заработать самому, выставляя готовые учебные материалы на продажу здесь. Рейтинги и отзывы на преподавателей очень помогают сориентироваться в начале нового семестра. Спасибо за такую функцию. Ставлю максимальную оценку.
Лучшая платформа для успешной сдачи сессии
Познакомился со СтудИзбой благодаря своему другу, очень нравится интерфейс, количество доступных файлов, цена, в общем, все прекрасно. Даже сам продаю какие-то свои работы.
Студизба ван лав ❤
Очень офигенный сайт для студентов. Много полезных учебных материалов. Пользуюсь студизбой с октября 2021 года. Серьёзных нареканий нет. Хотелось бы, что бы ввели подписочную модель и сделали материалы дешевле 300 рублей в рамках подписки бесплатными.
Отличный сайт
Лично меня всё устраивает - и покупка, и продажа; и цены, и возможность предпросмотра куска файла, и обилие бесплатных файлов (в подборках по авторам, читай, ВУЗам и факультетам). Есть определённые баги, но всё решаемо, да и администраторы реагируют в течение суток.
Маленький отзыв о большом помощнике!
Студизба спасает в те моменты, когда сроки горят, а работ накопилось достаточно. Довольно удобный сайт с простой навигацией и огромным количеством материалов.
Студ. Изба как крупнейший сборник работ для студентов
Тут дофига бывает всего полезного. Печально, что бывают предметы по которым даже одного бесплатного решения нет, но это скорее вопрос к студентам. В остальном всё здорово.
Спасательный островок
Если уже не успеваешь разобраться или застрял на каком-то задание поможет тебе быстро и недорого решить твою проблему.
Всё и так отлично
Всё очень удобно. Особенно круто, что есть система бонусов и можно выводить остатки денег. Очень много качественных бесплатных файлов.
Отзыв о системе "Студизба"
Отличная платформа для распространения работ, востребованных студентами. Хорошо налаженная и качественная работа сайта, огромная база заданий и аудитория.
Отличный помощник
Отличный сайт с кучей полезных файлов, позволяющий найти много методичек / учебников / отзывов о вузах и преподователях.
Отлично помогает студентам в любой момент для решения трудных и незамедлительных задач
Хотелось бы больше конкретной информации о преподавателях. А так в принципе хороший сайт, всегда им пользуюсь и ни разу не было желания прекратить. Хороший сайт для помощи студентам, удобный и приятный интерфейс. Из недостатков можно выделить только отсутствия небольшого количества файлов.
Спасибо за шикарный сайт
Великолепный сайт на котором студент за не большие деньги может найти помощь с дз, проектами курсовыми, лабораторными, а также узнать отзывы на преподавателей и бесплатно скачать пособия.
Популярные преподаватели
Добавляйте материалы
и зарабатывайте!
Продажи идут автоматически
5173
Авторов
на СтудИзбе
436
Средний доход
с одного платного файла
Обучение Подробнее