指纹识别系统设计报告.docx
《指纹识别系统设计报告.docx》由会员分享,可在线阅读,更多相关《指纹识别系统设计报告.docx(14页珍藏版)》请在冰豆网上搜索。
指纹识别系统设计报告
人工智能实验报告
指纹识别系统
课程名称:
人工智能导论
设计题目:
指纹识别系统
姓名:
杜晓燕
学号:
201207010117
专业班级:
计科1201
指导老师:
程国建
成绩:
一、设计题目
指纹识别系统
二、设计目的
当代社会,身份鉴别越来越重要,传统的身份鉴别方法(如身份证、信用卡、口令、密码等)可能会丢失、被盗或忘记。
同时,传统的身份鉴别手段与用户并不惟一绑定,一旦他人获得,将拥有和失主同样的权力。
而指纹特征是人所固有的生理特征,具有惟一性和终生不变性的特点。
因此指纹认证在身份认证和身份识别中成为重要的手段。
三、程序设计内容
1.主要内容
本指纹识别系统主要是对用户指纹进行提取将采集的指纹模板数据写入数据库,将实时采集的指纹图像作为指纹样板和数据库中的指纹模板逐一对,从而确认指纹样板身份。
2.主要功能
指纹识别系统是一个典型的模式识别系统,包括指纹图像获取、处理、特征提取和比对等模块。
指纹图像获取:
通过专门的指纹采集仪可以采集活体指纹图像。
目前,指纹采集仪主要有活体光学式、电容式和压感式。
对于分辨率和采集面积等技术指标,公安行业已经形成了国际和国内标准,但其他还缺少统一标准。
根据采集指纹面积大体可以分为滚动捺印指纹和平面捺印指纹,公安行业普遍采用滚动捺印指纹。
另外,也可以通过扫描仪、数字相机等获取指纹图像。
指纹图像压缩:
大容量的指纹数据库必须经过压缩后存储,以减少存储空间。
指纹图像处理:
包括指纹区域检测、图像质量判断、方向图和频率估计、图像增强、指纹图像细化等。
本系统主要功能包括指纹采集、指纹识别、人员认证、人员登记。
四、功能实现的基本思路
1.模块化设计
模块化是面向对象编程中的一个特征。
把特定应用设计为一个模块,并从属性和方法两方面设计成为一个类模块。
把类模块设置在不同的名字空间就可以用这类相同的类对应不同的应用。
即使添加一个同样的类也不会影响不同名字空间的其他同类成员。
2.可扩充设计
面向对象编程从本质上支持可扩充性。
在不影响或极少影响已有代码的情况下,添加加一种功能。
它的好处是新加代码无需大量发动已有代码。
3.封装设计
由于功能被封装在类中,且类是作为一个独立实体而存在的,因此只要提供该类库,用户就可在无需知道该方法类详细实现的细节情况下,调用该功能,以达到重用代码的目的。
五、代码实现
1.主要窗体的布局设计部分
voidLiveMatch:
:
OnButtonCreate()//创建指纹数据库
{
CFileDialogdlg(TRUE,"txt",".txt",OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,"Text(*.txt)|*.TXT||");
if(dlg.DoModal()!
=IDOK)return;
DatabasePath=dlg.GetPathName();
FPA_CreateDatabase(DatabasePath,IndexList,&ListSize);
}
voidLiveMatch:
:
OnButtonSave()//保存指纹数据库
{
//TODO:
Addyourcontrolnotificationhandlercodehere
FPA_SaveDatabase(DatabasePath,IndexList,ListSize);
}
voidLiveMatch:
:
OnButtonLoad()//导入指纹数据库
{
CFileDialogdlg(TRUE,"txt",".txt",OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,"Text(*.txt)|*.TXT||");
if(dlg.DoModal()!
=IDOK)return;
DatabasePath=dlg.GetPathName();
FPA_LoadDatabase(DatabasePath,IndexList,&ListSize);
CStringmsg;
msg.Format("NumberofRecord:
%d",ListSize);
AfxMessageBox(msg);
}
voidLiveMatch:
:
OnButtonAdd()//保存指纹数据库
{
//TODO:
Addyourcontrolnotificationhandlercodehere
CStringFolderName=DatabasePath;
intt=FolderName.ReverseFind('\\');
FolderName=FolderName.Left(t);
CStringIDStr,FingerIndexStr;
GetDlgItemText(IDC_EDIT_ID,IDStr);
GetDlgItemText(IDC_EDIT_FINGERINDEX,FingerIndexStr);
intID=atoi((LPCSTR)IDStr);
intFingerIndex=atoi((LPCSTR)FingerIndexStr);
intSize;
BYTElpFeature[430];
FPA_AnalyzeFeature_File(LiveFilePath,lpFeature,&Size);
intret=FPA_AddEntry(FolderName,ID,IndexList,&ListSize,FingerIndex,lpFeature);
if(ret==0)
SetDlgItemText(IDC_STATIC_ADDSTATUS,"添加成功");
else
SetDlgItemText(IDC_STATIC_ADDSTATUS,"添加失败,请改变ID");
}
voidLiveMatch:
:
OnButtonIdentify()//开始识别
{
if(ListSize>=0)bIdentify=true;
}
voidLiveMatch:
:
OnButtonNidentify()//停止识别
{
bIdentify=false;
}
voidLiveMatch:
:
OnTimer(UINTnIDEvent)
{
//TODO:
Addyourmessagehandlercodehereand/orcalldefault
intSize;CStringt;
if(nIDEvent==1)
{
FPA_Camera_Capture_File(LiveFilePath,lpLiveData1,0);
HBITMAPm_hImage;
m_hImage=(HBITMAP)LoadImage(AfxGetInstanceHandle(),
LiveFilePath,
IMAGE_BITMAP,
0,
0,
LR_LOADFROMFILE|LR_CREATEDIBSECTION);
GetDlgItem(IDC_STATIC_LIVE)->SendMessage(STM_SETIMAGE,IMAGE_BITMAP,(LPARAM)m_hImage);
if(bIdentify)
{
intret=FPA_AnalyzeFeature_File((LPCSTR)LiveFilePath,lpFeature1,&Size);
if(ret==0)
{
ret=FPA_Identify(DatabasePath,IndexList,ListSize,lpFeature1);
if(ret!
=-1)
{
intID=IndexList[ret]/10;
intFingerIndex=IndexList[ret]%10;
t.Format("获取!
ID:
%d\t\tFingerIndex:
%d",ID,FingerIndex);
}
Else{t.Format("不能获取");}
}
Else{t.Format("捕捉中...");}
}
Else{t.Format("捕捉中...");}
SetDlgItemText(IDC_STATIC_STATUS,t);
}
CDialog:
:
OnTimer(nIDEvent);
}
voidLiveMatch:
:
OnButtonCap()//打开感应器
{
intret=FPA_Camera_Init();TCHARtchBuffer[256];
LPTSTRlpszCurDir;lpszCurDir=tchBuffer;
GetCurrentDirectory(256,lpszCurDir);CStringshowme(lpszCurDir);
LiveFilePath=showme+"\\live.bmp";SetTimer(1,1000,0);
}
voidLiveMatch:
:
OnButtonClosesensor()//关闭感应器
{
KillTimer
(1);
FPA_Camera_Exit();
}
2.指纹比对窗体部分
对各函数变量进行定义
LPVOIDlpImage1=newBYTE[SizeCDib];//输入图像句柄
LPVOIDlpImage2=newBYTE[SizeCDib];//输出图像句柄
BYTE*lpData1;//输入图像数据指针
BYTE*lpData2;//输出图像数据指针
intWidth1,Height1;//图像1宽、高
intWidth2,Height2;//图像2宽、高
CStringImagePathName1,ImagePathName2;//定义图像文件路径
voidOffineMatch:
:
OnButtonOpen1()//打开图片1
{
CFileDialogdlg(TRUE,"bmp",".bmp",OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,"Bitmap(*.BMP)|*.BMP||");//定义“打开文件”对话框的属性
HBITMAPm_hImage;//定义图像句柄
if(dlg.DoModal()!
=IDOK)return;//开启“打开文件”对话框
ImagePathName1=dlg.GetPathName();//获取文件路径
m_hImage=(HBITMAP)LoadImage(AfxGetInstanceHandle(),
dlg.GetPathName(),
IMAGE_BITMAP,
0,
0,
LR_LOADFROMFILE|LR_CREATEDIBSECTION);//导入图像
GetDlgItem(IDC_STATIC_IMG1)->SendMessage(STM_SETIMAGE,IMAGE_BITMAP,(LPARAM)m_hImage);//显示图像
FPA_CreateImage(lpImage1);//初始代输入图像句柄
FPA_LoadImage(ImagePathName1,lpImage1,&lpData1,&Width1,&Height1);
}
voidOffineMatch:
:
OnButtonOpen2()//打开图片2
{
CFileDialogdlg(TRUE,"bmp",".bmp",OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,"Bitmap(*.BMP)|*.BMP||");
HBITMAPm_hImage;
if(dlg.DoModal()!
=IDOK)return;
ImagePathName2=dlg.GetPathName();
m_hImage=(HBITMAP)LoadImage(AfxGetInstanceHandle(),
dlg.GetPathName(),
IMAGE_BITMAP,
0,
0,
LR_LOADFROMFILE|LR_CREATEDIBSECTION);
GetDlgItem(IDC_STATIC_IMG2)->SendMessage(STM_SETIMAGE,IMAGE_BITMAP,(LPARAM)m_hImage);
FPA_CreateImage(lpImage2);
FPA_LoadImage(ImagePathName2,lpImage2,&lpData2,&Width2,&Height2);
}
voidOffineMatch:
:
OnButtonMatch()//指纹比对
{
BYTElpFeature1[430];
BYTElpFeature2[430];
intlpSize1,lpSize2,score;
FPA_AnalyzeFeature_File(ImagePathName1,lpFeature1,&lpSize1);
FPA_AnalyzeFeature_File(ImagePathName2,lpFeature2,&lpSize2);
FPA_PatternMatch(lpFeature1,lpFeature2,&score);
if(score>60)
{
AfxMessageBox("认证成功,指纹相同!
");
}
Else{AfxMessageBox("认证失败,指纹相异!
");}
}
voidOffineMatch:
:
OnCancel()//取消
{
FPA_CloseImage(lpImage1);//关闭图片1句柄
FPA_CloseImage(lpImage2);//关闭图片2句柄
CDialog:
:
OnCancel();
}
3.指纹比对算法的核心代码
voidDrawMinutiae(intdx,intdy,intx,inty,CDC*pDc,CPen*Pen)
{
CPen*oldPen=pDc->SelectObject(Pen);
CRectrc;POINTp,pb;
p.x=dx+x;p.y=dy+360-y;
pb.x=p.x;pb.y=p.y;
rc.left=p.x-3;rc.top=p.y-3;
rc.bottom=p.y+3;rc.right=p.x+3;
pDc->Arc(&rc,p,p);pDc->SelectObject(&oldPen);
}
voidDrawCore(POINTcore,intx,inty,CDC*pDC)
{
CRectrc;
rc.left=core.x+x-5;rc.right=core.x+x+5;
rc.top=(360-core.y)+y-5;rc.bottom=(360-core.y)+y+5;
pDC->Draw3dRect(&rc,RGB(255,0,0),RGB(255,0,0));
}
#defineMAX_MINUTIANUM60//最大特征点数
#defineMAX_SINGULARYNUM30
typedefstructtagMinutiae{
intx;//横坐标
inty;//纵坐标
intDirection;//方向
intTriangle[3];//特征点为中心外接圆半径为定值的正三角形三个顶点的方向
intType;//类型
}MINUTIA,*MINUTIAPTR;
//指纹特征(模板)结构
typedefstructtagFeature{
intMinutiaNum;//特征点数
MINUTIAMinutiaArr[MAX_MINUTIANUM];//特征点数组
}FEATURE,*FEATUREPTR;
voidCSampleDemoDlg:
:
OnButtonFeature()
{
POINTCore[MAX_SINGULARYNUM];
intNum_Core=0;
POINTDelta[MAX_SINGULARYNUM];
intNum_Delta=0;
inti;FEATUREfeature;
FPA_GetMinutia(lpData,lpOrient,(LPVOID*)&feature,Width,Height);
FPA_GetSingulary(lpOrient,Width,Height,&Num_Core,Core,-1);
FPA_GetSingulary(lpOrient,Width,Height,&Num_Delta,Delta,1);
CStringOutImagePathName="tmp.bmp";
CDC*myDC=m_img_feature.GetDC();
COLORREFred=RGB(255,0,0);COLORREFgreen=RGB(0,255,0);
COLORREFblue=RGB(0,0,255);COLORREFyellow=RGB(255,255,0);
COLORREForange=RGB(255,102,0);COLORREFpurple=RGB(204,33,255);
COLORREFgray=RGB(192,192,192);
CBrushbr;br.CreateSolidBrush(red);
CDC*dc=myDC;dc->SelectObject(&br);
ShowImg(OutImagePathName,0,0,dc);
for(i=0;i{
intx=Core[i].x;inty=Core[i].y;
CRectrc;
rc.left=x-5;rc.right=x+5;
rc.top=360-(y-5);rc.bottom=360-(y+5);
dc->Draw3dRect(&rc,red,red);dc->DrawFocusRect(&rc);
}
for(i=0;i{
intx=Delta[i].x;inty=Delta[i].y;
CRectrc;
rc.left=x-5;rc.right=x+5;
rc.top=360-(y-5);rc.bottom=360-(y+5);
dc->Draw3dRect(&rc,yellow,yellow);dc->DrawFocusRect(&rc);
}
for(i=0;i{
intx=feature.MinutiaArr[i].x;inty=feature.MinutiaArr[i].y;
CRectrc;
rc.left=x-5;rc.right=x+5;
rc.top=360-(y-5);rc.bottom=360-(y+5);
if(feature.MinutiaArr[i].Type==1)
dc->Draw3dRect(&rc,blue,blue);
else
dc->Draw3dRect(&rc,green,green);
dc->DrawFocusRect(&rc);
}
}
六、程序运行结果
七、总结
对于这次人工智能实验,实验刚开始时感觉无从下手,之前对于人工智能涉及的领域模糊专家系统、人脸识别系统、遗传算法等知识没有完全的理解和应用,随后在XX百科里查资料才确定了这次的设计题目:
指纹识别系统。
其中核心代码指纹对比算法比较难。
它是通过获取指纹特征结构:
横坐标、纵坐标、方向、类型、识别范围等组成的数组数据与输入的指纹信息数据对比,从而来识别指纹。
通过这次实验最大的收获就是对人工智能的应用有了很大程度的了解。
发现人工智能就在我们身边,未来人类的生活多半都是智能化,通过智能机器方便人类的生活,其中指纹识别就是一个例子。
而我们要做的就是设计智能系统,开发智能系统来改变人类未来的生活。