Система идентификации личности по отпечаткам пальцев
Разработка алгоритма формирования относительных параметров для минюций. Подбор параметров системы допусков и критериев схожести при сравнении отпечатков. Метод пригоден для распознавания битовых изображений: символьной информации, шрифтов и подписей.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | дипломная работа |
Язык | русский |
Дата добавления | 23.06.2008 |
Размер файла | 4,0 M |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
//Обработка картинки, ее изменение
//Обработка линии на которую указывает imap
//Исправление псевдо-раздвоений и псевдо-окончаний на указанной линии
{
int changeN = 0; //количество модификаций на линии
int kol = 0; //количество пройденных точек
int vec = 0; //направление поиска очередной точки
int tekS = 0; //Текущее количество коротких векторов
CPoint A, //Начало вектора
B; //Конец вектора
TAbsFing vecDotS; //массив точек для коротких векторов
TAbsFing vecDotL; //массив точек для длинных векторов
TAbsFing historyDotL; //история точек для длинных векторов
TAbsDot _tmpDotFing;
TAbsFing::iterator iter;
TAbsDot resetDot, bestDot;
double alpha; //направление вектора (в радианах)
int stopKol = 1500; //предел шагов
int ret = 0; //счетчик шагов после прохождения начальной точки
bool homeOver = false; //признак окончания обработки
_dot->pr1 = false;
A = _dot->coord; B = _dot->coord;
CPoint olddot, dot = _dot->coord; //Текущая точка на линии
do{
//основной цикл обработки,
//варианты завершения цикла
//продолжается до тех пор пока вся линия не будет пройдена (нормальный вариант)
//зацикливание (не нормальный вариант, их несколько)
//
olddot = dot;
dot = pic->NextDotCW(dot, vec); //Поиск следующей точки _по часовой_ стрелке
if(dot.x == olddot.x && dot.y == olddot.y)
{//положение точки не изменилось => выход//
CString s;
s.Format("x = %d, y = %d, kol= %d", dot.x, dot.y, kol);
if(MESSAGEOUT)MessageBox(0, "положение точки не изменилось => выход\n" + s, "", MB_OK);
return changeN;
}
kol++; //подсчет пройденных точек
if(kol % LEN_S == 0)
{//появился новый короткий вектор
tekS++;
A = B;
B = dot;
//pic2->Line(A,B, 1, 0x999999);
_tmpDotFing.coord = A;
alpha = GetAlpha(A, B); //расчет локального направления между KOL_S пикселями (направление короткого вектора)//
double dAlpha = 0.0; //Разница углов
if(vecDotS.size() > 0) //в списке можно взять предыдущее значение
dAlpha = alpha - vecDotS.begin()->alpha;
/**/ if (abs(dAlpha) >= M_PI) //разница между новым углом и предыдущим не нормальная!
{//необходимо скорректировать текущую alpha
/**/ if (dAlpha < 0.0)
{
while (abs(dAlpha) > M_PI)
{
alpha += 2.0 * M_PI;
dAlpha += 2.0 * M_PI;
}
}else
{
while (dAlpha >= M_PI)
{
alpha -= 2.0 * M_PI;
dAlpha -= 2.0 * M_PI;
}
}
}
_tmpDotFing.alpha = alpha; //запоминание направления из точки А//
vecDotS.push_front(_tmpDotFing);
///////////////////////////////////////////////////////////////////////
///////проверяем два соседних длинных вектора при условии что//////////
///////пройдено достаточно точек, чтоб сравнивать длнинные вектора/////
if(vecDotS.size() < KOL_S) continue;
//Вычисление среднего направления LEN_L коротких векторов//
//запись данных по длинному вектору////////////////////////
double sumAlpha = 0.0;
iter = vecDotS.begin();
vecDotL.clear(); //пересчитаем длинные вектора
for(int i = 0; i < KOL_S; i++)
{
sumAlpha += iter->alpha;
if ((i+1) % LEN_L == 0)
{
_tmpDotFing = *iter;
_tmpDotFing.alpha = sumAlpha / LEN_L;
vecDotL.push_back(_tmpDotFing);
sumAlpha = 0.0;
}
iter++;
}
if (abs(vecDotL.begin()->alpha) > 3*2*M_PI)
{//слишком много оборотов//
CString s;
s.Format("alpha = %.2f", vecDotL.begin()->alpha*180);
if(MESSAGEOUT)MessageBox(0, "слишком много оборотов\n"+s, "", MB_OK);
return changeN;
}
//проверяем два соседних длинных вектора//
dAlpha = vecDotL.begin()->alpha - (++vecDotL.begin())->alpha;
if (abs(dAlpha) > (TEST_ALPHA / 180.0 * M_PI)) //сильный изгиб//
{
if (historyDotL.empty())
{ //сохранение состояния//
resetDot = vecDotL.back();
bestDot.alpha = 0.0;
}
if (dAlpha > 0) //раздвоение
alpha = (vecDotL.front().alpha - M_PI + (vecDotL.back().alpha)) / 2.0;
else //окончание
alpha = (vecDotL.front().alpha + M_PI + (vecDotL.back().alpha)) / 2.0;
_tmpDotFing = vecDotL.front();
_tmpDotFing.alpha = alpha; //направление в СТ (специфичная точка)//
_tmpDotFing.type = dAlpha<0; //тип СТ//
historyDotL.push_front(_tmpDotFing);
if(bestDot.alpha <= abs(dAlpha))
{
bestDot.coord = _tmpDotFing.coord;
bestDot.alpha = abs(dAlpha);
}
}
else //сильный изгиб//
{
if (!historyDotL.empty()) //был _пройден_ сильный изгиб
{
alpha = 0.0;
for(iter = historyDotL.begin(); iter != historyDotL.end(); iter++)
alpha += iter->alpha;
alpha /= historyDotL.size(); //среднее значение в пройденной СТ
iter = historyDotL.begin();
for(unsigned int i = 0; i<(historyDotL.size()/2); i++) iter++;
CPoint wdot = bestDot.coord; //наиболее вероятная точка для СТ
CPoint dotForAccept = FindAcceptDot(wdot, alpha, iter->type);
if (dotForAccept.x != -1)
{ //точка имеет продолжение//
COLORREF cl;
cl = (historyDotL.begin()->type)?0x000000:0xffffff;
//здесь можно поиграть с разной толщиной линии//
pic->Line(wdot, dotForAccept, 4, cl);
_dot->pr1 = true; //эту линию необходио еще раз проанализировать
changeN++;
stopKol += (stopKol-kol < 200)?200:0;
//stopKol += (kol*1.5 > stopKol)?500:0;
//загрузить начальное состояние
if(!historyDotL.begin()->type)
{ //если ликвидировано слипание то необходимо добавить новую точку на карту
_map.push_back(TMapElDot(dot));
}
//пройдена начальная точка, продлим анализ
//очень возможно, что начальную точку мы больше не попадем
if(ret-KOL_S*LEN_S < 0)
{
ret = 0;
homeOver = false;
stopKol = 500;
}
A = B = dot = resetDot.coord;
vecDotS.clear();
vecDotL.clear();
//------------------------------
}
historyDotL.clear();
}
}
}
if (dot.x == _dot->coord.x && dot.y == _dot->coord.y)
{//вероятно обход линии завершен
if (kol <= 2)
{//Линия подозрительно короткая
CString s;
s.Format("%d", kol);
if(MESSAGEOUT)MessageBox(0, "kol<=2 kol = " + s, "", MB_OK);
return changeN;
}else
{
homeOver = true; //пройти необходимо дальше начала
stopKol = kol + KOL_L*LEN_L*LEN_S;
}
}
if (homeOver) ret++;
}while(ret < (LEN_L*LEN_S*KOL_L) && ret < stopKol && kol <= stopKol);
_dot->pr2 = false;
return changeN;
}
inline double TAnalysePicture::GetAlpha(const CPoint A, const CPoint B)
//Направлени из точки А в В [-pi,pi)
{
if(A == B) return 0.0;
double alpha;
if (A.x - B.x == 0)
{
if (A.y > B.y) alpha = M_PI_2;
else alpha = -M_PI_2;
}else
{
double a = ((double)A.y-B.y)/((double)B.x-A.x);
alpha = atan(a);
if (A.x > B.x)
{
if (alpha < 0) alpha += M_PI;
else alpha -= M_PI;
if (A.y == B.y) alpha = -M_PI;
}
}
return alpha;
}
bool TAnalysePicture::TestFindDot(int _x, int _y)
//тест точки: Разность направлений вперед и назад должно быть меньше 110 градусов
{
const int len = 7;
CPoint A(_x, _y), B, C;
//первый вектор
B = A;
int vec = 0;
for(int i = 1; i<=len; i++)
B = tmpPic->NextDotCW(B, vec);
//------расчет угла-------//
double alpha1 = GetAlpha(A, B);
//второй вектор
C = B;
B = A;
vec = 0;
for(int i = 1; i<=len; i++)
{
B = tmpPic->NextDotCCW(B, vec);
if(abs(B.x-C.x) < 3 && abs(B.y-C.y) < 3) return true;
}
//------расчет угла-------//
double alpha2 = GetAlpha(A, B);
//-----alpha1, alpha2------//
alpha1 = abs(alpha2 - alpha1);
if (alpha1 > M_PI) alpha1 = 2.0*M_PI - alpha1;
return alpha1 < (110.0/180.0 * M_PI);
}
CPoint TAnalysePicture::FindAcceptDot(CPoint dot, double alpha, bool type)
//Поиск продолжения из окончания/раздвоения
{
const int maxL = 11;
const int minL = 3;
COLORREF color;
color = (type)?0x000000:0xffffff;
//окончание - ищем черную точку
//раздвоение - ищем белую точку
int i = 0;
while (i<=6) //разброс поиска в указанном направлении alpha
{
int l = minL;
int k = (i+1) / 2;
if (i % 2 == 1) k = -k;
while (l<=maxL)
{
double arg = alpha + k * M_PI * 5.0/180.0;
int x = dot.x + (int)(l*cos(arg)+0.5);
int y = dot.y - (int)(l*sin(arg)+0.5);
if (tmpPic->GetPixel(x, y) == color) //важное условие цвета точки!!!
{
if(TestFindDot(x,y)) //проверка найденной точки (на "вшивость" :) )
return CPoint(x, y); //найденная точка
else
break;
}
l++; //увеличение дальности поиска
}
i++;
}
return CPoint(-1, -1); //точка не найдена
}
bool TAnalysePicture::Show(int x, int y, int xt, int yt)
{
if(xt!=-1) pic2->Show(xt, yt);
return pic->Show(x, y);
}
TFingPicture *TAnalysePicture::GetPic1()
{
return pic;
}
TFingPicture *TAnalysePicture::GetPic2()
{
return pic2;
}
double TAnalysePicture::ChangeAlphaInterval(double _alpha)
//Приведение итрервала к [-pi,pi)
{
double ret = abs(_alpha);
while(ret >= 2.0*M_PI) ret -= 2.0*M_PI;
if(ret > M_PI) ret = 2.0*M_PI - ret;
else ret = -ret;
if(_alpha > 0) ret = -ret;
return ret;
}
/*Фильтрование полученных точек
отсеиваются близкостоящие направленные в противоположные строки
а так же точки слева и справа от которых нет линий*/
int TAnalysePicture::DotsFilter(TAbsFing &_dots)
{
int leftDots = 0;
TAbsFing::iterator iter1;
TAbsFing::iterator iter2;
for(iter1 = _dots.begin(); iter1 != _dots.end(); iter1++)
{
if(!iter1->show) continue;
//отсев точек сложным условием (условие окружения)
iter1->show = LeftDot(iter1);
}
for(iter1 = _dots.begin(); iter1 != _dots.end(); iter1++)
{
if(!iter1->show) continue;
//отсев близкостоящих точек
for(iter2 = iter1, ++iter2; iter2 != _dots.end(); iter2++)
{
if(!iter2->show) continue;
double difL = GetS(iter1->coord,iter2->coord);
if( //условия отсева
(
//на близком растоянии (15) находятся два окончания/раздвоения направленных друг на друга
(difL < 15)&&
((abs(iter2->alpha - iter1->alpha) > (165.0/180.0*M_PI))&&(abs(iter2->alpha - iter1->alpha)<(195.0/180.0*M_PI)))
)
||
(
//или просто очень близкие точки (<5..10)
(difL < 10)&&(iter1->type == iter2->type)
)
)
{
iter1->show = false;
iter2->show = false;
}
}
}
return leftDots;
}
inline double TAnalysePicture::GetS(CPoint A, CPoint B)
//растояние между точками
{
return sqrt( (double)((A.x-B.x)*(A.x-B.x)+(A.y-B.y)*(A.y-B.y)) );
}
/*Если точка является окончанием, то слева и справа от нее должны быть линии если это не так, то точку нужно исключить из дальнейшего анализа*/
bool TAnalysePicture::LeftDot(TAbsFing::iterator &iter)
{
COLORREF color = 0x000000; //ищем черную точку для окончаний
if(!iter->type) color = 0xffffff;; //ищем белую точку для раздвоений
int l, k = 35;
const int minL = 4, maxL = 12;
bool find = false;
while(k <= 55)
{
l = minL;
while(l <= maxL)
{
int x = iter->coord.x + (int)(l*cos(iter->alpha + k/180.0*M_PI)+0.5);
int y = iter->coord.y - (int)(l*sin(iter->alpha + k/180.0*M_PI)+0.5);
if(pic->GetPixel(x,y) == color) // важное условие!!!
{ find = true; break;} //нашли точку слева
l++;
}
if(find) break;
k += 10; //Поиск с шагом 10гр
}
if(!find) return false;
k = 35;
while(k <= 55)
{
l= minL;
while(l <= maxL)
{
int x = iter->coord.x + (int)(l*cos(iter->alpha - k/180.0*M_PI)+0.5);
int y = iter->coord.y - (int)(l*sin(iter->alpha - k/180.0*M_PI)+0.5);
if(pic->GetPixel(x,y) == color) // важное условие!!!
return true; //нашли точку справа
l++;
}
k += 10;
}
return false;
}
П.1.10. ТЕКСТ МОДУЛЯ TFingPicture.h
#pragma once
#include "Fing.h"
///////////////////////////////////////////////////////////////////////////////
//Класс изображения.
//Хранение изображения, выполнение простейших операции над ним
///////////////////////////////////////////////////////////////////////////////
class TFingPicture
{
private:
CDC pic; //указатель на изображение
BITMAP bmp; //изображение
bool IsLoad; //изображение загружено
CDC *Screen; //указатель на окно программы
public:
TFingPicture(CDC *_Screen); //_Screen - указатель на окно
~TFingPicture(void);
bool Load(const CString src); //загрузить изображение из файла src
bool Show(int X, int Y); //отобразить изображение на окне в координатах (X,Y)
bool SetPixel(CPoint dot, COLORREF color); //установка цвета пикселя dot
bool SetPixel(int x, int y, COLORREF color); //установка цвета пикселя (x,y)
COLORREF GetPixel(CPoint dot); //взятие цвета пикселя dot
COLORREF GetPixel(int x, int y); //взятие цвета пикселя (x,y)
bool FloodFill(CPoint dot, COLORREF color=0xffffff); //заливка области (по умолчанию черным цветом)
bool FloodFill(int x, int y, COLORREF color=0xffffff); //заливка области (по умолчанию черным цветом)
bool Line(CPoint from, CPoint to, int width, COLORREF color);//рисование линии
bool Rectangle(CPoint from, CPoint to, int width=2, COLORREF color=0xffffff); //рисование прямоугольника
bool Copy(TFingPicture &from); //копирование изображения
CPoint NextDotCW(const CPoint dot, int &vec); //Поиск следующей точки "_по часовой_ стрелке"
CPoint NextDotCCW(const CPoint dot, int &vec); //Поиск следующей точки "_против часовой_ стрелке"
CPoint GetSize(); //получение размера изображения
};
П.1.11. ТЕКСТ МОДУЛЯ TFingPicture.cpp
#include "StdAfx.h"
#include "TFingPicture.h"
///////////////////////////////////////////////////////////////////////////////
//Класс изображения.
//Хранение изображения, выполнение простейших операции над ним
///////////////////////////////////////////////////////////////////////////////
//координаты окружающих точек
const CPoint incXY[8]=
{
CPoint(-1, -1),
CPoint(0, -1),
CPoint(1, -1),
CPoint(1, 0),
CPoint(1, 1),
CPoint(0, 1),
CPoint(-1, 1),
CPoint(-1, 0)};
TFingPicture::TFingPicture(CDC *_Screen)
{
Screen = _Screen;
pic.CreateCompatibleDC(Screen);
IsLoad = false;
}
TFingPicture::~TFingPicture(void){}
//отобразить изображение на окне в координатах (X,Y)
bool TFingPicture::Show(int X, int Y)
{
if (!IsLoad) return false;
int kx = bmp.bmWidth;
int ky = bmp.bmHeight;
return Screen->StretchBlt(X, Y, bmp.bmWidth, bmp.bmHeight, &pic, 0, 0, kx, ky, SRCCOPY)>0;
}
//загрузить изображение из файла src
bool TFingPicture::Load(const CString src)
{
IsLoad = false;
CBitmap bm;
bm.Detach();
IsLoad = bm.Attach(LoadImage(0, src, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE))>0;
bm.GetObject(sizeof(BITMAP), &bmp);
pic.SelectObject(&bm);
return IsLoad;
}
// color = BGR;
bool TFingPicture::SetPixel(CPoint dot, COLORREF color)
{
if (!IsLoad) return false;
pic.SetPixel(dot.x, dot.y, color);
return true;
}
bool TFingPicture::SetPixel(int x, int y, COLORREF color)
{
if (!IsLoad) return false;
pic.SetPixel(x, y, color);
return true;
}
// color = BGR;
COLORREF TFingPicture::GetPixel(CPoint dot)
{
if (!IsLoad) return false;
return pic.GetPixel(dot.x, dot.y);
}
COLORREF TFingPicture::GetPixel(int x, int y)
{
if (!IsLoad) return false;
return pic.GetPixel(x, y);
}
bool TFingPicture::FloodFill(CPoint dot, COLORREF color)
{
if(!IsLoad) return false;
COLORREF col = GetPixel(dot);
CBrush br(color);
pic.SelectObject(&br);
pic.ExtFloodFill(dot.x, dot.y, col, FLOODFILLSURFACE);
return true;
}
bool TFingPicture::FloodFill(int x, int y, COLORREF color)
{
if(!IsLoad) return false;
COLORREF col = GetPixel(x, y);
CBrush br(color);
pic.SelectObject(&br);
pic.ExtFloodFill(x, y, col, FLOODFILLSURFACE);
return true;
}
bool TFingPicture::Line(CPoint from, CPoint to, int width, COLORREF color)
{
if(!IsLoad) return false;
CPen pen(PS_SOLID, width, color);
pic.SelectObject(&pen);
pic.MoveTo(from.x, from.y);
pic.LineTo(to.x, to.y);
return true;
}
bool TFingPicture::Rectangle(CPoint from, CPoint to, int width, COLORREF color)
{
if(!IsLoad) return false;
Line(from, CPoint(from.x, to.y), width, color);
Line(CPoint(from.x, to.y), to, width, color);
Line(to, CPoint(to.x, from.y), width, color);
Line(CPoint(to.x, from.y), from, width, color);
return true;
}
bool TFingPicture::Copy(TFingPicture &from)
{
bmp = from.bmp;
IsLoad = from.IsLoad;
Screen = from.Screen;
return pic.BitBlt(0, 0, bmp.bmWidth, bmp.bmHeight, &from.pic, 0, 0, SRCCOPY)>0;
}
CPoint TFingPicture::NextDotCW(const CPoint dot, int &vec)
//Поиск следующей точки "_по часовой_ стрелке"
//vec вероятное направление поиска
{
int i = vec,
step = 0;
CPoint newdot = dot;
COLORREF clMas[9];
clMas[8] = clMas[0] = GetPixel(dot.x-1, dot.y-1);
clMas[1] = GetPixel(dot.x, dot.y-1);
clMas[2] = GetPixel(dot.x+1, dot.y-1);
clMas[3] = GetPixel(dot.x+1, dot.y);
clMas[4] = GetPixel(dot.x+1, dot.y+1);
clMas[5] = GetPixel(dot.x, dot.y+1);
clMas[6] = GetPixel(dot.x-1, dot.y+1);
clMas[7] = GetPixel(dot.x-1, dot.y);
do{
if(clMas[i+1] < clMas[i])
{
vec = (i + 1) % 8;
newdot.x = dot.x + incXY[vec].x;
newdot.y = dot.y + incXY[vec].y;
if(vec % 2 == 0) SetPixel(dot.x + incXY[vec+1].x, dot.y + incXY[vec+1].y, 0x000000);
vec = (vec + 5) % 8;
return newdot; //найдена новая точка
}
i = (i + 1) % 8;
step++;
}while(step <= 8);
return dot; //поиск ни к чему не привел
}
CPoint TFingPicture::NextDotCCW(const CPoint dot, int &vec)
//Поиск следующей точки "_против часовой_ стрелке"
//vec вероятное направление поиска
{
int i = vec,
step = 0;
CPoint newdot = dot;
COLORREF clMas[9];
clMas[8] = clMas[0] = GetPixel(dot.x-1, dot.y-1);
clMas[1] = GetPixel(dot.x-1, dot.y);
clMas[2] = GetPixel(dot.x-1, dot.y+1);
clMas[3] = GetPixel(dot.x, dot.y+1);
clMas[4] = GetPixel(dot.x+1, dot.y+1);
clMas[5] = GetPixel(dot.x+1, dot.y);
clMas[6] = GetPixel(dot.x+1, dot.y-1);
clMas[7] = GetPixel(dot.x, dot.y-1);
do{
if(clMas[i+1] < clMas[i])
{
vec = (i + 1) % 8;
newdot.x = dot.x + incXY[(8-vec)%8].x;
newdot.y = dot.y + incXY[(8-vec)%8].y;
if(vec % 2 == 0) SetPixel(dot.x + incXY[8-vec-1].x, dot.y + incXY[8-vec-1].y, 0x000000);
vec = (vec + 5) % 8;
return newdot; //найдена новая точка
}
i = (i + 1) % 8;
step++;
}while(step <= 8);
return dot; //поиск ни к чему не привел
}
CPoint TFingPicture::GetSize()
//получение размера изображения
{ if(!IsLoad) return false;
return CPoint(bmp.bmWidth, bmp.bmHeight);}
ПРИЛОЖЕНИЕ 2 РУКОВОДСТВО ПРОГРАММИСТА
П.2.1. НАЗНАЧЕНИЕ ПРОГРАММЫ
Программа распознавания личности по отпечаткам пальцев имеет идентификатор FingerAnalyser и предназначена для автоматической идентификации личности по папиллярному узору. Программа FingerAnalyser выполняет следующие функции:
1) модификация изображения, исправление искажений;
2) выделение локальных особенностей - минюций. Формирование списка минюций в абсолютных параметрах;
3) сортировка списка абсолютных параметров, исключение ложных и ненадежных минюций;
4) конвертирование абсолютных параметров в отностительные, формирование списка относительных параметров;
5) установка системы допусков для учета корреляцции изображений
6) сравнение одного отпечатка с множеством других.
Данная работа реализует такое преобразование изображения, при котором данные о расположение уникальных особенностей сохраняются наиболее полно и с наименьшим содержанием ложной информации.
Создаваемая система облегчит разработку алгоритмов обработки изображений, упростит анализ экспериментальных данных и выявление общих закономерностей.
П.2.2. УСЛОВИЯ ПРИМЕНЕНИЯ ПРОГРАММЫ
Программа FingerAnalyser предъявляет следующие требования к техническим средствам:
- стандартный x86-совместимый ПК;
- тактовая частота процессора 900 МГц или более;
- объем оперативной памяти не менее 64 Мб;
- разрешение экрана монитора не менее 1024x768.
Программа FingerAnalyser предъявляет следующие требования к программным средствам:
- операционная система семейства Windows (Windows 9x/ME/NT/2000/XP);
- среда для разработки приложений Microsoft Visual Studio C++ 2003.
Интерфейс программы представлен на рис. П.2.1.
Интерфейс программы FingerAnalyser
Рис. П.2.1
На форме программы в визуальном виде представляется, после открытия через пункт «Открыть», исходное изображение, после нажатия на кнопку «Анализ», скорректированное изображение и визуальное представление структурного вида отпечатка. После чего можно нажатием на кнопку «Сравнить» отыскать в базе схожие отпечатки.
При каждом анализе отпечатка создается файл с его структурным описанием. Для того чтобы поместить отпечаток в базу данных отпечатков, для последующего стравнения с ним, необходимо нажать на кнопку «Запомнить в базу». Для запоминания в базу можно выбирать группу файлов для применения операции записи в базу данных для всех выбранных файлов.
П.2.3. ХАРАКТЕРИСТИКА ПРОГРАММЫ
Программа FingerAnalyser требует для своего функционирования наличия в проекте файлов, содержащих растровые представления папиллярного узора.
В состав программы входят следующие файлы, необходимые для ее функционирования:
1) FingerAnalyser.exe - исполняемый файл, содержащий основной интерфейс программы;
2) MFC - библиотеки для поддержки оконного среды;
3) blank.bmp - пустое изображение;
4) report.txt - файл отчет в который записываются все результаты сравнения
5) sav/*.sav - файлы со структурным представлением отпечатков
6) sav/fingbase.bse - база данных отпечатков
7) dll библиотеки MFC
Программа является интерактивной, требующей взаимодействия с пользователем, поэтому время выполнения отдельных этапов обработки не превышает 0.5 с. при использовании требуемых технических средств.
П.2.4. ОБРАЩЕНИЕ К ПРОГРАММЕ
Для запуска программы необходимо убедиться в том, что необходимые библиотеки MFC находятся в том же каталоге, что и исполняемый файл или в каталоге Windows/System32.
Для корректной работы программы она должна находиться в каталоге, к которому есть права на чтение и запись.
Для запуска подсистемы необходимо в оболочке системы на главном окне нажать на кнопку «Анализ» - для сравнения нужного отпечатка с набором имеющимся в базе данных, или «Запомнить в базу» - для внесения указанных отпечатков в базу данных.
П.2.5. ВХОДНЫЕ И ВЫХОДНЫЕ ДАННЫЕ
Входными и выходными данными для программы является файл базы данных отпечатков sav/fingbase.bse. Структура файла:
src [kol] [dpi] [date] [description]
src [kol] [dpi] [date] [description]
src [kol] [dpi] [date] [description]
В каждой строке файла базы данных отпечатков содержится описание одного отпечатка. В табл. П.2.1 приведен формат записи в файле базы данных.
Таблица П.2.1
Формат записи файла базы данных
Поле |
Формат |
Описание |
|
src |
Строка |
путь к образу из которого была получена информация |
|
kol |
Целое |
количество точек |
|
dpi |
Целое |
качество исходного отпечатка (dot per inch) |
|
date |
Дата |
дата отпечатка |
|
description |
строка |
описание |
Выходными данными для программы является файл sav/*.sav со структурным представлением, содержащий статистические характеристики минюций на отпечатке. Этот файл имеет следующий формат:
x y alpha type [show]
x y alpha type [show]
x y alpha type [show]
В каждой строке файла структурного представления содержится описание одной минюции. В табл. П.2.2 приведен формат строки со структурным описанием минюции в абсолютных параметрах.
Таблица П.2.2
Формат строки файла со структурным описанием
Поле |
Формат |
Описание |
|
x |
Целое |
Абцисса минюции на растре |
|
y |
Целое |
Ордината минюции на растре |
|
alpha |
Целое |
Ориентация минюции на растре |
|
type |
Байт |
Тип минюции. Раздвоение или окончание |
Кроме того, выходной информацией для данной подсистемы является файл отчет report.txt, содержащий отпечатки из базы данных, в которых были обнаружены сходства с обрабатываемым отпечатком.
В каждой строке отчета содержится описание отпечатка, его имя, количество совпавших точек при распознавании и степень сходства.
В табл. П.2.3 приведен формат данных. На рис. П.2.2 приведен пример файла отчета.
report.txt имеет следующий формат:
------ Namei ------
Counti1 Pcti1 Sourcei1
Counti2 Pcti2 Sourcei2
Countik Pctik Sourceik
Всего в базе: NN
Таблица П.2.3
Формат данных файла-отчета
Поле |
Формат |
Описание |
|
Name |
Строка |
Имя отпечатка |
|
Count |
Целое |
Абсцисса минюции на растре |
|
Pct |
Целое |
Степень сходства отпечатков в процентах, принимает значения (0, 100] |
|
Source |
Строка |
Путь к файлу, из которого были взяты параметры |
|
NN |
Целое |
Количество отпечатков имеющихся в базе данных |
Файл-отчет
------ hedgeR1_2.bmp ------ 7 70 с:\мои документы\fing\fingc\fingeranalyser\pic\base\hedger1_1.bmp Всего в базе: 58 ------ starkyR2_2.bmp ------ 5 50 с:\мои документы\fing\fingc\fingeranalyser\pic\base\starkyr2_1.bmp Всего в базе: 58 ------ karR2_2.bmp ------ 3 30 с:\мои документы\fing\fingc\fingeranalyser\pic\base\karr2_1.bmp Всего в базе: 58 ------ vasL1_2.bmp ------ 21 100 с:\мои документы\fing\fingc\fingeranalyser\pic\vasl1_1.bmp 56 100 с:\мои документы\fing\fingc\fingeranalyser\pic\vasl1_2.bmp 12 100 с:\мои документы\fing\fingc\fingeranalyser\pic\vasl1_3.bmp Всего в базе: 58 ------ tatL1_2.bmp ------ Ни одного отпечатка не найдено! |
Рис. П.2.2
П.2.6. СООБЩЕНИЯ
Сообщения, выдаваемые программисту, приведены в табл. П.2.4.
Таблица П.2.4
Сообщения программисту
Сообщение |
Действие программиста |
|
Отпечаток не обработан |
Прежде чем запускать сравнение необьходимо провести анализ |
|
База данных пуста |
В базе данных нет информации ни об одном отпечатке. Необходимо заполнить базу данных отпечатков |
|
Отпечаток не пригоден для сохранения в базу |
На отпечатке либо слишком мало обнаружено минюций, менее 10, либо слишком много, более 80 |
|
Ни одного отпечатка не найдено |
В результате поиска не совпало ни одного отпечтака |
|
Невозможно создать базу данных с отпечатками |
Возможно нет прав на запись или нет свободного места на носителе |
|
Невозможно создать файл |
Возможно нет прав на запись или нет свободного места на носителе |
|
Невозможно открыть файл |
Возможно нет прав на чтение или не сеществует запрашиваемого файла на носителе |
|
Обнаружены сходства |
В базе данных были обнаружены отпечатки, имеющие схожее представление. |
Визуализация результатов проведения анализа приведена на рис. П.2.2.
ПРИЛОЖЕНИЕ 3 РУКОВОДСТВО ОПЕРАТОРА
П.3.1. НАЗНАЧЕНИЕ ПРОГРАММЫ
Программа распознавания личности по отпечаткам пальцев имеет идентификатор FingerAnalyser и предназначена для автоматической идентификации личности по папиллярному узору. Программа FingerAnalyser выполняет следующие функции:
1) модификация изображения, исправление искажений;
2) выделение локальных особенностей - минюций. Формирование списка минюций в абсолютных параметрах;
3) сортировка списка абсолютных параметров, исключение ложных и ненадежных минюций;
4) конвертирование абсолютных параметров в отностительные, формирование списка относительных параметров;
5) установка системы допусков для учета корреляцции изображений;
6) сравнение одного отпечатка с множеством других.
Данная работа реализует такое преобразование изображения, при котором данные о расположение уникальных особенностей сохраняются наиболее полно и с наименьшим содержанием ложной информации.
Создаваемая система облегчит разработку алгоритмов обработки изображений, упростит анализ экспериментальных данных и выявление общих закономерностей.
П.3.2. УСЛОВИЯ ВЫПОЛНЕНИЯ ПРОГРАММЫ
Программа FingerAnalyser предъявляет следующие требования к техническим средствам:
- стандартный x86-совместимый ПК;
- тактовая частота процессора 900 МГц или более;
- объем оперативной памяти не менее 64 Мб;
- разрешение экрана монитора не менее 1024x768.
Программа FingerAnalyser предъявляет следующие требования к программным средствам:
- операционная система семейства Windows (Windows 9x/ME/NT/2000/XP);
- dll библиотеки MFC
П.3.3. ВЫПОЛНЕНИЕ ПРОГРАММЫ
Интерфейс программы представлен на рис. П.3.1.
Интерфейс программы FingerAnalyser
Рис. П.3.1
На форме программы в визуальном виде представляется, после открытия через пункт «Открыть», исходное изображение, после нажатия на кнопку «Анализ», скорректированное изображение и визуальное представление структурного вида отпечатка. Для вызова работы подсистемы необходимо в оболочке системы на главном окне нажать на кнопку «Сравнить».
При каждом анализе отпечатка создается файл с его структурным описанием. Для того чтобы поместить отпечаток в базу данных отпечатков, для последующего стравнения с ним, необходимо нажать на кнопку «Запомнить в базу». Для запоминания в базу можно выбирать группу файлов для применения операции записи в базу данных для всех выбранных файлов.
П.3.4. СООБЩЕНИЯ ОПЕРАТОРУ
Сообщения, выдаваемые оператору, приведены в табл. П.3.1.
Таблица П.3.1
Сообщения оператору
Сообщение |
Действие оператора |
|
Отпечаток не обработан |
Прежде чем запускать сравнение необьходимо провести анализ |
|
База данных пуста |
В базе данных нет информации ни об одном отпечатке. Необходимо заполнить базу данных отпечатков |
|
Отпечаток не пригоден для сохранения в базу |
На отпечатке либо слишком мало обнаружено минюций, менее 10, либо слишком много, более 80 |
|
Ни одного отпечатка не найдено |
В результате поиска не совпало ни одного отпечтака |
|
Невозможно создать базу данных с отпечатками |
Возможно нет прав на запись или нет свободного места на носителе |
|
Невозможно создать файл |
Возможно нет прав на запись или нет свободного места на носителе |
|
Невозможно открыть файл |
Возможно нет прав на чтение или не сеществует запрашиваемого файла на носителе |
|
Обнаружены сходства |
В базе данных были обнаружены отпечатки, имеющие схожее представление. |
Визуализация результатов проведения сравнения приведена на рис. П.3.1.
ПРИЛОЖЕНИЕ 4 РЕЗУЛЬТАТЫ ТЕСТИРОВАНИЯ
В табл. П.4.1 приведены результаты сравнения всех отпечатков полученных при испытаниях. Для проверки правильности работы имена файлам давались таким образом, что бы можно было определить принадлежность отпечатка.
Формат результата сравнения: A/B,
где A - количество совпавших минюций;
B - процент совпадения.
Формат имени файла: <Name><R|L><C>_<E>.bmp
где Name - имя человека, которому принадлежит отпечаток;
R - отпечаток с правой руки, L - отпечаток с левой руки;
С - порядковый номер пальца, начиная с большого;
E - экземпляр отпечатка.
Таблица П.4.1
Результаты сравнения
vovR2_1.bmp |
1L1_1.BMP |
1L2_1.BMP |
1L3_1.BMP |
1R1_1.BMP |
1R2_1.BMP |
1R3_1.BMP |
1R4_1.bmp |
2l1_1.bmp |
2l2_1.bmp |
2r1_0.bmp |
2r2_0.bmp |
||
1L1_2.bmp |
|
24/100 |
|
|
|
|
|
|
|
|
|
|
|
1L2_2.BMP |
|
|
9/90 |
|
|
|
|
|
|
|
|
|
|
1R1_2.BMP |
|
|
|
|
23/100 |
|
|
|
|
|
|
|
|
1R2_1rotate2.bmp |
|
|
|
|
|
23/100 |
|
|
|
|
|
|
|
1R2_2.BMP |
|
|
|
|
|
16/100 |
|
|
|
|
|
|
|
1R3_2.BMP |
|
|
|
|
|
|
1/10 |
3/30 |
|
|
|
|
|
1R4_2.bmp |
|
|
|
|
|
|
|
15/100 |
|
|
|
|
|
2l1_2.bmp |
|
|
|
|
|
|
|
|
14/100 |
|
|
|
|
2l2_2.bmp |
|
|
|
|
|
|
|
|
|
8/80 |
|
|
|
2r1_1.bmp |
|
|
|
|
|
|
|
|
|
|
|
|
|
2r2_1.bmp |
|
1/10 |
|
|
|
|
|
|
|
|
|
|
|
2r3_1.bmp |
|
|
|
|
|
|
|
|
|
|
|
|
|
3l1_2rotate.bmp |
|
|
|
|
|
|
|
|
|
|
|
|
|
3l2_2.bmp |
|
|
|
|
|
|
|
|
|
|
|
|
|
alexR1_3.bmp |
|
|
|
|
|
|
|
|
|
|
|
|
|
alexR2_3.bmp |
|
|
|
|
|
|
|
|
|
|
|
|
|
1L1_2.bmp |
|
|
|
|
|
|
|
|
|
|
|
|
|
1L2_2.BMP |
|
|
|
|
|
|
|
|
|
|
|
|
|
1R1_2.BMP |
|
|
|
|
|
|
|
|
|
|
|
|
|
1R2_1rotate2.bmp |
|
|
|
|
|
|
|
|
|
|
|
|
|
1R2_2.BMP |
|
|
|
|
|
|
|
|
|
|
|
|
|
1R3_2.BMP |
|
|
|
|
|
|
|
|
|
|
|
|
|
1R4_2.bmp |
|
|
|
|
|
|
|
|
|
|
|
|
|
2l1_2.bmp |
|
|
|
|
|
|
|
|
|
|
|
|
|
2l2_2.bmp |
|
|
|
|
|
|
|
|
|
|
|
|
|
2r1_1.bmp |
|
|
|
2/20 |
|
|
|
|
|
|
|
|
|
2r2_1.bmp |
|
|
|
|
|
|
|
|
|
|
|
|
|
2r3_1.bmp |
48/100 |
|
|
|
|
|
|
|
|
|
|
|
|
3l1_2rotate.bmp |
|
24/100 |
|
|
1/10 |
|
|
|
|
|
|
|
|
3l2_2.bmp |
|
|
21/100 |
|
|
|
|
|
|
|
|
|
|
alexR1_3.bmp |
|
|
|
|
|
4/40 |
|
|
|
|
|
|
|
alexR2_3.bmp |
|
|
|
|
|
|
4/40 |
|
|
|
|
|
|
apmAR1_2.bmp |
|
|
|
|
|
|
|
4/40 |
|
|
|
|
|
apmAR2_2.bmp |
|
|
|
|
|
|
|
|
9/90 |
|
|
|
|
apmAR3_2.bmp |
|
|
|
|
|
|
|
|
|
|
|
|
|
apmBR1_2.bmp |
|
|
|
|
|
|
|
|
|
|
12/100 |
|
|
apmBR2_2.bmp |
|
|
|
|
|
|
|
|
|
|
|
20/100 |
|
apmBR3_2.bmp |
|
|
|
|
|
|
|
|
|
|
|
|
|
hedgeR1_2.bmp |
|
|
|
|
|
|
|
|
|
|
|
|
|
hedgeR2_3.bmp |
|
|
|
|
|
|
|
|
|
|
|
|
|
karR1_2.bmp |
|
|
|
|
|
|
|
|
|
|
|
|
|
karR2_2.bmp |
|
|
|
|
|
|
|
|
|
|
|
|
|
starkyR1_2.bmp |
|
|
|
|
|
|
|
|
|
|
|
|
|
starkyR2_2.bmp |
|
|
|
|
|
|
|
|
|
|
|
|
|
starR1_2.bmp |
|
|
|
|
|
|
|
|
|
|
|
|
|
vasL1_2.bmp |
|
|
|
|
|
|
|
|
|
|
|
|
|
vasL2_2.bmp |
|
|
|
|
|
|
|
|
|
|
|
|
|
vasR1_2.bmp |
|
|
|
|
|
|
|
|
|
|
|
|
|
vovR1_2.bmp |
|
|
|
|
|
|
|
|
|
|
|
|
|
1L1_2.bmp |
|
|
|
|
|
|
|
|
|
|
|
|
|
1L2_2.BMP |
|
|
|
|
|
|
|
|
|
|
|
|
|
1R1_2.BMP |
|
|
|
|
|
|
|
|
|
|
|
|
|
1R2_1rotate2.bmp |
|
|
|
|
|
|
|
|
|
|
|
|
|
1R2_2.BMP |
|
|
|
|
|
|
|
|
|
|
|
|
|
1R3_2.BMP |
|
|
|
|
|
|
|
|
|
|
|
|
|
1R4_2.bmp |
|
|
|
|
|
|
|
|
|
|
|
|
|
2l1_2.bmp |
|
|
|
|
|
|
|
|
|
|
|
|
|
2l2_2.bmp |
|
|
|
|
|
|
|
1/10 |
|
|
|
|
|
2r1_1.bmp |
|
|
|
|
|
|
|
|
|
|
|
|
|
2r2_1.bmp |
|
|
|
|
|
|
|
|
|
|
|
|
|
2r3_1.bmp |
|
|
|
|
|
|
|
|
|
|
|
|
|
3l1_2rotate.bmp |
|
|
|
|
|
|
|
|
|
|
|
|
|
3l2_2.bmp |
|
|
|
|
|
|
|
|
|
|
|
|
|
alexR1_3.bmp |
|
|
|
|
|
|
|
|
|
|
|
|
|
alexR2_3.bmp |
|
|
|
|
|
|
|
|
|
|
|
|
|
apmAR1_2.bmp |
|
|
|
|
|
|
|
|
|
|
|
|
|
apmAR2_2.bmp |
|
|
|
|
|
|
|
|
|
|
|
|
|
apmAR3_2.bmp |
|
|
|
|
|
|
|
|
|
|
|
|
|
apmBR1_2.bmp |
|
|
|
|
|
|
|
|
|
|
|
|
|
apmBR2_2.bmp |
|
|
|
|
|
|
|
|
|
|
|
|
|
apmBR3_2.bmp |
14/100 |
|
|
|
|
|
|
|
|
|
|
|
|
hedgeR1_2.bmp |
|
7/70 |
|
|
|
|
|
|
|
|
|
|
|
hedgeR2_3.bmp |
|
|
6/60 |
|
|
|
|
|
|
|
|
|
|
karR1_2.bmp |
|
|
|
15/100 |
|
|
|
|
|
|
|
|
|
karR2_2.bmp |
|
|
|
|
2/20 |
|
|
|
|
|
|
|
|
starkyR1_2.bmp |
|
|
|
|
|
12/100 |
|
|
|
|
|
|
|
starkyR2_2.bmp |
|
|
|
|
|
|
6/60 |
|
|
|
|
|
|
starR1_2.bmp |
|
|
|
|
|
|
|
22/100 |
|
|
|
|
|
vasL1_2.bmp |
|
|
|
|
|
|
|
|
20/100 |
|
|
|
|
vasL2_2.bmp |
|
|
|
|
|
|
|
|
|
10/100 |
|
|
|
vasR1_2.bmp |
|
|
|
|
|
|
|
|
|
|
15/100 |
|
|
vovR1_2.bmp |
|
|
|
|
|
|
|
|
|
|
|
49/100 |
ПРИЛОЖЕНИЕ 5 АЛЬТЕРНАТИВНОЕ ИСПОЛЬЗОВАНИЕ ПРОГРАММЫ
Для тестирования программы было использовано 2 метода распознавания. Метод 1 не зависит от ориентации буквы на плоскости, метод 2 имеет привязанность к вертикальному положению буквы. При распознавании символьной информации было не распознано около 18% по методу 2 и 22% по методу 1. Результат сравнения приведен в табл. П.5.1.
Формат результата сравнения: A/B,
где A - количество совпавших минюций;
B - процент совпадения.
Таблица П.5.1
Результат распознавания символов
Открытый образ |
Результат сравнения (метод 2) |
Открытый образ |
Результат сравнения (метод 1) |
|||
Первое обнару-женное значение |
Второе обнаруженное значение |
Первое обнаруженное значение |
Второе обнаруженное значение |
|||
_a1.bmp |
А (4/80) |
Н (5/62) |
_a1.bmp |
Н (2 25) |
Ы (1 20) |
|
_a2.bmp |
А (5/100) |
Н (3/37) |
_a2.bmp |
А (2 40) |
Ц (1 11) |
|
_б1.bmp |
Б (5/100) |
Г (3/60) |
_б1.bmp |
Б (5 100) |
Ш (4 44) |
|
_б2.bmp |
Б (5/83) |
Е (5/55) |
_б2.bmp |
Б (5 83) |
Ш (4 44) |
|
_в1.bmp |
В (3/100) |
_в1.bmp |
В (3 100) |
Е (1 11) |
||
_в2.bmp |
В (3/100) |
_в2.bmp |
В (3 100) |
Б (1 20) |
||
_г1.bmp |
Г (3/75) |
Б (3/60) |
_г1.bmp |
Г (3 75) |
Б (3 60) |
|
_г2.bmp |
Г (4/66) |
Е (5/55) |
_г2.bmp |
Г (4 66) |
Щ (3 20) |
|
_д1.bmp |
Д (8/80) |
Щ (7/46) |
_д1.bmp |
Д (8 80) |
Г (3 30) |
|
_д2.bmp |
Д (8/80) |
Щ (5/33) |
_д2.bmp |
Д (9 90) |
Щ (3 20) |
|
_е1.bmp |
Е (7/70) |
Ы (8/61) |
_е1.bmp |
Е (7 70) |
Э (5 50) |
|
_ж1.bmp |
Ж (10/83) |
Х (7/58) |
_ж1.bmp |
Ж (10 83) |
Х (7 58) |
|
_ж2.bmp |
Ж (10/83) |
Ж (6/50) |
_ж2.bmp |
Ж (10 83) |
Х (7 58) |
|
_з1.bmp |
З (5/55) |
Д (4/40) |
_з1.bmp |
З (5 55) |
Э (4 44) |
|
_з2.bmp |
Э (4/57) |
Щ (3/20) |
_з2.bmp |
Е (5 55) |
Ю (1 14) |
|
_и1.bmp |
И (5/83) |
Х (4/57) |
_и1.bmp |
И (4 66) |
К (4 57) |
|
_и2.bmp |
И (4/66) |
Ы (3/50) |
_и2.bmp |
И (4 66) |
М (5 62) |
|
_к1.bmp |
К (7/100) |
Ж (6/54) |
_к1.bmp |
К (7 100) |
Ж (6 54) |
|
_к2.bmp |
К (7/100) |
М (4/50) |
_к2.bmp |
К (7 100) |
Ж (7 63) |
|
_л1.bmp |
П (5/83) |
Л (4/57) |
_л1.bmp |
П (4 66) |
Л (4 57) |
|
_л2.bmp |
П (5/83) |
Л (4/57) |
_л2.bmp |
П (5 83) |
Л (4 57) |
|
_м1.bmp |
М (6/75) |
Ж (7/63) |
_м1.bmp |
М (7 87) |
Ж (3 27) |
|
_м2.bmp |
М (8/100) |
И (6/75) |
_м2.bmp |
М (8 100) |
Ъ (2 25) |
|
_н1.bmp |
Н (8/100) |
Ю (6/66) |
_н1.bmp |
Н (8 100) |
Ч (6 75) |
|
_н2.bmp |
Н (8/100) |
Ч (6/75) |
_н2.bmp |
Н (8 100) |
Ч (6 75) |
|
_о1.bmp |
_о1.bmp |
|||||
_о2.bmp |
_о2.bmp |
|||||
_п1.bmp |
П (6/100) |
Л (5/71) |
_п1.bmp |
П (6 100) |
Ш (6 66) |
|
_п2.bmp |
П (6/100) |
Г (3/50) |
_п2.bmp |
П (6 100) |
Ш (6 66) |
|
_р1.bmp |
Д (3/30) |
Г (1/25) |
_р1.bmp |
Р (1 25) |
П (1 16) |
|
_р2.bmp |
Х (3/42) |
Н (3/37) |
_р2.bmp |
Р (3 75) |
Х (3 42) |
|
_с1.bmp |
С (2/40) |
Ц (2/22) |
_с1.bmp |
С (3 60) |
Ц (2 22) |
|
_с2.bmp |
К (1/14) |
Ж (1/9) |
_с2.bmp |
Щ (1 6) |
||
_т1.bmp |
Т (5/100) |
Г (3/60) |
_т1.bmp |
Т (5 100) |
Г (2 40) |
|
_т2.bmp |
Т (5/100) |
Г (3/60) |
_т2.bmp |
Т (4 80) |
Г (3 60) |
|
_у1.bmp |
У (5/83) |
Ч (5/71) |
_у1.bmp |
Ю (4 44) |
Ш (4 44) |
|
_у2.bmp |
У (4/80) |
Щ (4/26) |
_у2.bmp |
У (1 20) |
К (1 14) |
|
_ф1.bmp |
Ф (3/100) |
П (3/50) |
_ф1.bmp |
П (3 37) |
Ц (3 33) |
|
_ф2.bmp |
Ф (3/100) |
П (3/50) |
_ф2.bmp |
Ф (3 100) |
Ц (3 33) |
|
_х1.bmp |
Х (7/87) |
Ж (7/63) |
_х1.bmp |
Х (7 87) |
Ч (4 50) |
|
_х2.bmp |
Х (7/87) |
К (6/75) |
_х2.bmp |
Х (6 75) |
К (5 62) |
|
_ц1.bmp |
Ц (8/88) |
Ш (5/55) |
_ц1.bmp |
Ц (8 88) |
П (4 50) |
|
_ц2.bmp |
Ц (9/100) |
Ш (6/66) |
_ц2.bmp |
Ц (7 77) |
Ш (6 66) |
|
_ч1.bmp |
Ч (7/100) |
Ц (7/77) |
_ч1.bmp |
Ч (7 100) |
Н (5 62) |
|
_ч2.bmp |
Ч (7/100) |
Ц (7/77) |
_ч2.bmp |
Ч (7 100) |
П (5 71) |
|
_ш1.bmp |
Ш (6/66) |
Ц (5/55) |
_ш1.bmp |
Ш (6 66) |
П (5 62) |
|
_ш2.bmp |
Ш (6/66) |
Ц (5/55) |
_ш2.bmp |
П (5 62) |
Ы (3 37) |
|
_щ1.bmp |
Ц (9/81) |
Ю (8/72) |
_щ1.bmp |
Ц (6 54) |
Щ (7 46) |
|
_ъ1.bmp |
Ъ (5/83) |
Д (3/30) |
_ъ1.bmp |
Ъ (4 66) |
Г (3 60) |
|
_ъ2.bmp |
Ъ (5/83) |
З (2/33) |
_ъ2.bmp |
Ъ (5 83) |
Ы (4 30) |
|
_ы1.bmp |
Ы (4/66) |
Ч (4/57) |
_ы1.bmp |
Ь (3 50) |
Ы (2 33) |
|
_ы2.bmp |
Ы (4/66) |
Ь (3/50) |
_ы2.bmp |
Ы (5 83) |
Ь (3 50) |
|
_ь1.bmp |
Ь (3/75) |
Ы (3/60) |
_ь2.bmp |
Ь (3 60) |
Н (2 25) |
|
_ь2.bmp |
Ю (2/22) |
Щ (2/13) |
_ь1.bmp |
Ь (3 75) |
Я (3 42) |
|
_э1.bmp |
Э (3/50) |
Л (1/14) |
_э1.bmp |
Э (3 50) |
Ш (1 11) |
|
_э2.bmp |
Э (5/100) |
Щ (1/6) |
_э2.bmp |
Е (5 55) |
Э (1 20) |
|
_ю1.bmp |
Ю (8/88) |
Н (7/77) |
_ю1.bmp |
Ю (7 77) |
Ч (6 66) |
|
_ю2.bmp |
Н (7/77) |
Ю (6/66) |
_ю2.bmp |
Н (6 66) |
Ю (5 55) |
|
_я1.bmp |
Я (5/71) |
Ж (4/36) |
_я1.bmp |
Я (5 71) |
Ж (1 9) |
|
_я2.bmp |
Я (4/57) |
Ю (4/44) |
_я2.bmp |
Я (3 42) |
Ь (2 33) |
|
Тестирование на чувствительность к ориентации образа на плоскости: |
||||||
_А_10.bmp |
А (4 80) |
Х (3 42) |
_А_10.bmp |
А (1 20) |
Р (1 20) |
|
_А_90.bmp |
Е (3 33) |
Б (2 33) |
_А_90.bmp |
А (4 80) |
Ж (3 27) |
|
_А_30.bmp |
Ю (4 66) |
Ч (3 50) |
_А_30.bmp |
А (4 80) |
Ж (3 25) |
|
_А_15.bmp |
Ю (3 50) |
Ц (3 42) |
_А_15.bmp |
А (3 60) |
Щ (4 26) |
Итого по методу 2: 11 нераспознано и 15 распознано лучше, чем метод 1.
Итого по методу 1: 13 нераспознано и 6 распознано лучше, чем метод 2.
Подобные документы
Подсистема анализа изображения отпечатка пальца в составе системы идентификации личности по отпечаткам пальцев на основе папиллярного узора для дальнейшего распознавания личности. Характеристика функциональных возможностей системы и код програмы.
дипломная работа [3,1 M], добавлен 01.07.2008Проблема улучшения качества отпечатков пальца с целью повышения эффективности работы алгоритмов биометрической аутентификации. Обзор алгоритмов обработки изображений отпечатков пальцев. Анализ алгоритма, основанного на использовании преобразования Габора.
дипломная работа [4,5 M], добавлен 16.07.2014Анализ биометрических систем идентификации личности по отпечаткам пальцев, форме кисти руки, оболочке глаза. Лицо как биометрический идентификатор. Анализ рынка систем распознавания личности. Оценка эффективности систем идентификации по геометрии лица.
курсовая работа [1,8 M], добавлен 30.05.2013Разработка эскизного и технического проекта программы идентификации личности по отпечатку. Назначение и область применения, описание алгоритма, входных и выходных данных. Выбор состава технических и программных средств. Тестирование и внедрение продукта.
курсовая работа [61,9 K], добавлен 12.05.2015Оптико-электронная система идентификации объектов подвижного состава железнодорожного транспорта. Автоматический комплекс распознавания автомобильных номеров. Принципы и этапы работы систем оптического распознавания. Особенности реализации алгоритмов.
дипломная работа [887,3 K], добавлен 26.11.2013Основные цели и задачи построения систем распознавания. Построение математической модели системы распознавания образов на примере алгоритма идентификации объектов военной техники в автоматизированных телекоммуникационных комплексах систем управления.
дипломная работа [332,2 K], добавлен 30.11.2012Использование паролей как способ защиты от несанкционированного доступа к программам и данным, хранящимися на компьютере. Биометрические системы идентификации по отпечаткам пальцев, геометрии ладони руки, характеристикам речи, радужной оболочке глаза.
презентация [679,6 K], добавлен 06.05.2015Состав и принцип работы аппаратуры. Выбор параметров корреляционного анализа и Фурье-анализа. Разработка и применение алгоритма корреляционного анализа. Реализация алгоритма Фурье-анализа на языке С++ и алгоритма корреляционного анализа на языке С#.
дипломная работа [4,6 M], добавлен 30.11.2016Методы предобработки изображений текстовых символов. Статистические распределения точек. Интегральные преобразования и структурный анализ. Реализация алгоритма распознавания букв. Анализ алгоритмов оптического распознавания символов. Сравнение с эталоном.
курсовая работа [2,1 M], добавлен 20.09.2014Необходимость в системах распознавания символов. Виды сканеров и их характеристики. Оптимальное разрешение при сканировании. Программы распознавания текста. Получение электронного документа. FineReader - система оптического распознавания текстов.
презентация [469,2 K], добавлен 15.03.2015