}
// 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.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.3. ХАРАКТЕРИСТИКА ПРОГРАММЫ
Программа FingerAnalyser требует для своего функционирования наличия в проекте файлов, содержащих растровые представления папиллярного узора.
В состав программы входят следующие файлы, необходимые для ее функционирования:
1) FingerAnalyser.exe – исполняемый файл, содержащий основной интерфейс программы;
2) MFC[1] – библиотеки для поддержки оконного среды;
3) blank.bmp – пустое изображение;
4) report.txt – файл отчет в который записываются все результаты сравнения;
5) sav/*.sav – файлы со структурным представлением отпечатков;
6) sav/fingbase.bse – база данных отпечатков;
7) report.txt – файл-отчет с результатами проведенных сравнений.
Программа является интерактивной, т.е. требующей взаимодействия с пользователем, поэтому время выполнения отдельных этапов обработки не превышает 0.5 с. при использовании требуемых технических средств.
П.2.4. ОБРАЩЕНИЕ К ПРОГРАММЕ
Для запуска программы необходимо убедиться в том, что необходимые библиотеки MFC находятся в том же каталоге, что и исполняемый файл или в каталоге Windows/System32.
Для корректной работы программы она должна находиться в каталоге, к которому есть права на чтение и запись.
Для запуска работы подсистемы необходимо в оболочке системы на главном окне нажать на кнопку «Анализ» - для сравнения нужного отпечатка с набором имеющимся в базе данных, или «Запомнить в базу» - для внесения указанных отпечатков в базу данных.
Интерфейс программы представлен на рис. П.2.2.
Интерфейс программы FingerAnalyser
Рис. П.2.2
На форме программы в визуальном виде представляется, после открытия через пункт «Открыть», исходное изображение, после нажатия на кнопку «Анализ», скорректированное изображение и визуальное представление структурного вида отпечатка. После чего можно нажатием на кнопку «Сравнить» отыскать в базе схожие отпечатки.
При каждом анализе отпечатка создается файл с его структурным описанием. Для того чтобы поместить отпечаток в базу данных отпечатков, для последующего сравнения с ним, необходимо нажать на кнопку «Запомнить в базу». Для запоминания в базу можно выбирать группу файлов для применения операции записи в базу данных для всех выбранных файлов.
П.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
x y alpha type
...
x y alpha type
В каждой строке файла структурного представления содержится описание одной минюции. В табл. П.2.2 приведен формат строки файла структурного описания.
Таблица П.2.2
Формат строки файла со структурным описанием
Поле | Формат | Описание |
x | Целое | Абцисса минюции на растре |
y | Целое | Ордината минюции на растре |
alpha | Целое | Ориентация минюции на растре |
type | Байт | Тип минюции. Раздвоение или окончание |
Кроме того, в результате работы программы формируется файл-отчет report.txt с результатами всех проведенных сравнений отпечатков.
report.txt имеет следующий формат:
------ Namei ------
Counti1 Pcti1 Sourcei1
Counti2 Pcti2 Sourcei2
...
Countik Pctik Sourceik
Всего в базе: NN
В табл. П.2.3 приведен формат данных файла report.txt.
Таблица П.2.3
Формат данных файла-отчета
Поле | Формат | Описание |
Name | Строка | Имя отпечатка |
Count | Целое | Абсцисса минюции на растре |
Pct | Целое | Степень сходства отпечатков в процентах, принимает значения (0, 100] |
Source | Строка | Путь к файлу, из которого были взяты параметры |
NN | Целое | Количество отпечатков имеющихся в базе данных |
На рис. П.2.1 приведен пример файла отчета.
Файл-отчет
------ 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.1
П.2.6. СООБЩЕНИЯ
Сообщения, выдаваемые программисту, приведены в табл. П.2.4.
Таблица П.2.4
Сообщения программисту
Сообщение | Действие программиста |
Отпечаток не обработан | Прежде чем запускать сравнение необьходимо провести анализ |
База данных пуста | В базе данных нет информации ни об одном отпечатке. Необходимо заполнить базу данных отпечатков |
Отпечаток не пригоден для сохранения в базу | На отпечатке либо слишком мало обнаружено минюций, менее 10, либо слишком много, более 80 |
Ни одного отпечатка не найдено | В результате поиска не совпало ни одного отпечтака |
Невозможно создать базу данных с отпечатками | Возможно нет прав на запись или нет свободного места на носителе |
Невозможно создать файл | Возможно нет прав на запись или нет свободного места на носителе |
Невозможно открыть файл | Возможно нет прав на чтение или не существует запрашиваемого файла на носителе |
Найдены схожие отпечатки | В базе данных были обнаружены отпечатки, имеющие схожее представление. |
Визуализация результатов проведения анализа приведена на рис. П.2.2 в правой части экрана.