Система идентификации личности по отпечаткам пальцев. Подсистема анализа изображения

Дипломная работа - Компьютеры, программирование

Другие дипломы по предмету Компьютеры, программирование



if(confirmVal > needVal){break;}

else{

back().absDot,tekFing->back().absDot));">ret.dots.push_back(TPairAbsDot(baseFing->back().absDot, tekFing->back().absDot));

ret.surdots.push_back(TPairSur(surroundDots1,surroundDots2));

surroundDots1->clear();

surroundDots2->clear();

}

}

}

ret.cDot = confirmDot;

ret.val = 0;

return ret;

}

П.1.8 ТЕКСТ МОДУЛЯ TAnalysePicture.h

#pragma once

#include "TFingPicture.h"

//MESSAGEOUT отображать отладочную информацию с помощью popup окон

//#define MESSAGEOUT true

#define MESSAGEOUT false

#define OUT_FILE "fingAnalyserOut.txt"//файл отчет

#define BLANK "blank.bmp"//пустое изображение

///////////////////////////////////////////////////////////////////////////////////

//важные параметры для обхода изображения

#define LEN_S 3//длина малого вектора (LEN_S точек)

#define LEN_L 4//длина большого вектора (LEN_L малых векторов)

#define KOL_L 2//необходимое количество больших векторов

#define KOL_S LEN_L*KOL_L//необходимое количество точек

#define TEST_ALPHA 130.0//тест на разворот вектора. Указывается угол в градусах

///////////////////////////////////////////////////////////////////////////////////

///////////////////////////////////////////////////////////////////////////////////

// Класс АНАЛИЗА ИЗОБРАЖЕНИЯ

///////////////////////////////////////////////////////////////////////////////////

class TAnalysePicture

{

private:

TFingPicture *pic;//Собственно сама картинка

TFingPicture *tmpPic;//копия картинки

TFingPicture *pic2;//изображение для отображения в окне

int height, width;//высота и ширина изображения

CString srcImg;//путь к изображению

int err;//Код состояния картинки

TInfo info;//сопроводительная информация

private:

int ChangeLine(list &_map);//Обработка картинки, ее изменение

TAbsFing ReadPic(list::iterator _dot);//Нахождение на изображении спец точек

list LookPic();//Сканирование картинки и нахождение линий на ней

inline double GetAlpha(const CPoint A, const CPoint B);//Направлени из точки А в В [-pi,pi)

inline double GetS(CPoint A, CPoint B);//растояние между точками

CPoint FindAcceptDot(CPoint dot, double alpha, bool type);//Поиск продолжения из окончания/раздвоения

bool TestFindDot(int _x, int _y);//тест точки: Разность направлений вперед и назад должно быть меньше 110 градусов

double ChangeAlphaInterval(double _alpha);//Приведение итрервала к [-pi,pi)

int DotsFilter(TAbsFing &_dots);

/*Фильтрование полученных точек отсеиваются близкостоящие направленные в противоположные строки

а так же точки слева и справа от которых нет линий*/

bool LeftDot(TAbsFing::iterator &iter);

/*Если точка является окончанием, то слева и справа от нее должны быть линии

если это не так, то точку нужно исключить из дальнейшего анализа*/

public:

TAnalysePicture(const CString src, CDC *screen);

~TAnalysePicture(void);

int getErr();

CString getErrMsg();

CString getPathSrc(){return srcImg;};

TAbsFing AnalysePicture();//Обработка загруженного изображения и получение образа

bool Show(int x, int y, int xt=-1, int yt=-1);

TFingPicture *GetPic1();

TFingPicture *GetPic2();

};

П.1.9 ТЕКСТ МОДУЛЯ TAnalysePicture.cpp

#include "StdAfx.h"

#include "TAnalysePicture.h"

TAnalysePicture::TAnalysePicture(const CString src, CDC *screen)

{

pic = new TFingPicture(screen);

err = -1;

if(!pic->Load(src)) err = 0;

pic->Rectangle(CPoint(0, 0), pic->GetSize(), 10);

srcImg = src;

tmpPic = new TFingPicture(screen);

tmpPic->Load(src);

pic2 = new TFingPicture(screen);

pic2->Load(BLANK);

}

TAnalysePicture::~TAnalysePicture(void)

{

delete(tmpPic);

delete(pic2);

delete(pic);

}

//Код ошибки

int TAnalysePicture::getErr()

{

return err;

}

//Сообщение ошибки

CString TAnalysePicture::getErrMsg()

{

CString msg = "";

switch (err)

{

case -1: {msg = "Ошибок при загрузке изображения нет"; break;}

case 0: {msg = "Изображение не загружено"; break;}

case 1: {msg = "Возникла ошибка при загрузке изображения"; break;}

default: {msg = "Нераспознанная ошибка";}

}

return msg;

}

// Обработка загруженного изображения и получение образа

TAbsFing TAnalysePicture::AnalysePicture()

{

TAbsFing ret, ret2;

if(err != -1)

{

if(MESSAGEOUT) MessageBox(NULL, getErrMsg(), "Ошибка", MB_OK);

return ret;

}

int prevCol;

int changeN = 0;//Счетчик произведенных изменений на изображении

list map;//Карта точек принадлежащих линиям

list::iterator imap;//Итератор для map

map = LookPic();//сканирование картинки и нахождение линий на ней

do{

changeN = 0;

prevCol = (int)map.size();

imap = map.begin();

do{//Изображение можно модифицировать

if(imap->pr1)//Линия нуждается в обработке

changeN += ChangeLine(imap, map);//Обработка (преобразование) изображения

imap++;//Переход для обработки следующей линии

}while(imap != map.end());//Изображение можно модифицировать

}while(prevCol<0.1*map.size());//Изображение можно модифицировать

map = LookPic();//сканирование картинки и нахождение линий на ней

imap = map.begin();

do{//Изображение можно модифицировать

ret.merge(ReadPic(imap));

imap++;//Переход для обработки следующей линии

}while(imap != map.end());//Изображение можно модифицировать

////////////////////////////////////////////////////////////////////

/////////////////////Фильтрование полученных точек//////////////////

///отсеиваются близкостоящие направленные в противоположные строки//

//////////а так же точки слева и справа от которых нет линий////////

int leftDots = 0;//число отсеянных точек

leftDots = DotsFilter(ret);//Фильтрование полученных точек

////////////////////////////////////////////////////////////////////

ret2.clear();

for(TAbsFing::iterator iter = ret.begin(); iter != ret.end(); iter++)

{

if(!iter->show) continue;

//рисование найденных точек (цвет окончания и раздвоения различный)

COLORREF col = (iter->type)?0xFF0000:0x000000;

pic2->Line(iter->coord, iter->coord, 5, col);

pic2->Line(iter->coord,

CPoint(iter->coord.x+(int)(10.0*cos(iter->alpha)),iter->coord.y-(int)(10.0*sin(iter->alpha))),

2, col);

ret2.push_back(*iter);

}

ret.clear();

return ret2;

}

TAbsFing TAnalysePicture::ReadPic(list::iterator _dot)

//Нахождение на изображении спец точек

{

TAbsFing retFing;//Образ отпечатка в абсолютных координатах

int kol = 0;//количество пройденных точек

int vec = 0;//н