matchdb.cpp
来自「这是一个用c++编写的实现指纹识别的程序」· C++ 代码 · 共 340 行
CPP
340 行
// MatchDb.cpp : implementation file
//
#include "stdafx.h"
#include "eFinger.h"
#include "MatchDb.h"
#include "Matching.h"
#include "bmp.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// MatchDb dialog
MatchDb::MatchDb(CWnd* pParent /*=NULL*/)
: CDialog(MatchDb::IDD, pParent)
{
//{{AFX_DATA_INIT(MatchDb)
m_score = _T("");
m_method = _T("");
//}}AFX_DATA_INIT
}
void MatchDb::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(MatchDb)
DDX_Control(pDX, IDC_COMBO2, m_image2);
DDX_Control(pDX, IDC_COMBO1, m_image1);
DDX_Control(pDX, IDC_bmp2, m_bmp2);
DDX_Control(pDX, IDC_bmp1, m_bmp1);
DDX_Text(pDX, IDC_matchScore, m_score);
DDX_CBString(pDX, IDC_COMBO3, m_method);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(MatchDb, CDialog)
//{{AFX_MSG_MAP(MatchDb)
ON_BN_CLICKED(IDC_match, Onmatch)
ON_CBN_SELCHANGE(IDC_COMBO1, OnSelchangeCombo1)
ON_CBN_SELCHANGE(IDC_COMBO2, OnSelchangeCombo2)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// MatchDb message handlers
BOOL MatchDb::GetBitmapFileName(TCHAR *filename, int len, HWND hWnd)
{
OPENFILENAME ofn;
ZeroMemory(&ofn, sizeof(OPENFILENAME));
ofn.lStructSize = sizeof(OPENFILENAME);
ofn.hwndOwner = hWnd;
ofn.lpstrFilter = _T("Bitmap Files (*.bmp)\0*.bmp\0All Files (*.*)\0*.*\0\0");
ofn.lpstrFile = filename;
ofn.nMaxFile = len;
ofn.lpstrTitle = _T("Browse");
ofn.Flags = /*OFN_FILEMUSTEXIST |*/ OFN_HIDEREADONLY;
return GetOpenFileName(&ofn);
}
///////////////////////////////////////////////////////////////
///////////// matching the thinned image using shift /////////
///////////////////////////////////////////////////////////////
void MatchDb::MatchMethod2(char finalThin1[],char finalThin2[])
{
int i, j;
Image *image1,*image2;
image1 = new Image;
image2 = new Image;
int rows1,rows2,cols1,cols2;
char mesg[256], score[256];
int **thinData1,**thinData2;
readBmp(finalThin1,image1);
readBmp(finalThin2,image2);
rows1 = image1->Vres;
cols1 = image1->Hres;
rows2 = image2->Vres;
cols2 = image2->Hres;
sprintf(mesg,"%d %d",rows1,cols1);
//AfxMessageBox(mesg);
thinData1 = new int*[rows1];
for(i=0;i<rows1;i++)
thinData1[i] = new int[cols1];
thinData2 = new int*[rows2];
for(i=0;i<rows2;i++)
thinData2[i] = new int[cols2];
for(i=0;i<rows1;i++)
{
for(j=0;j<cols1;j++)
{
thinData1[i][j] = image1->p[i][j];
}
}
for(i=0;i<rows2;i++)
{
for(j=0;j<cols2;j++)
{
thinData2[i][j] = image2->p[i][j];
}
}
float percentage = match2(thinData1,rows1,cols1,thinData2,rows2,cols2);
sprintf(score,"matching score = %d \n (accepted above 130)",int(100.0*percentage));
m_score = CString(score);
}
////////////////////////////////////////////////////////////
///////// matching using minutiae's
////////////////////////////////////////////////////////////
void MatchDb::MatchMethod123(int method){
FILE *index,*data1,*data2;
int no,mat=0,x,y,i,noMinutiae1=0,noMinutiae2=0;
char data[256],image[256],finalData1[256],finalData2[256],score[256],thin[256];
char img1[256],img2[256],finalThin1[256],finalThin2[256];
float percentage;
index = fopen("Database/index.txt","r");
m_image1.GetLBText( m_image1.GetCurSel(), img1 );
m_image2.GetLBText( m_image2.GetCurSel(), img2 );
while(!feof(index))
{
fscanf(index,"%d %s %s %s\n",&no,image,data,thin);
if(strcmp(img1,thin)==0)
{
sprintf(finalData1,data);
sprintf(finalThin1,thin);
mat++;
if(mat==2)
break;
}
if(strcmp(img2,thin)==0)
{
sprintf(finalData2,data);
sprintf(finalThin2,thin);
mat++;
if(mat==2)
break;
}
if(feof(index))
{
return;
}
}
fclose(index);
data1 = fopen(finalData1,"r");
while(!feof(data1))
{
fscanf(data1,"%d %d \n",&x,&y);
if(feof(data1))
{
break;
}
noMinutiae1++;
}
fclose(data1);
data2 = fopen(finalData2,"r");
while(!feof(data2))
{
fscanf(data2,"%d %d \n",&x,&y);
if(feof(data2))
{
break;
}
noMinutiae2++;
}
fclose(data2);
int **minData1,**minData2;
minData1 = new int*[noMinutiae1];
for(i=0;i<noMinutiae1;i++)
minData1[i] = new int[2];
minData2 = new int*[noMinutiae2];
for(i=0;i<noMinutiae2;i++)
minData2[i] = new int[2];
data1 = fopen(finalData1,"r");
for(i=0;i<noMinutiae1;i++)
{
fscanf(data1,"%d %d \n",&x,&y);
if(feof(data1))
{
break;
}
minData1[i][0]=x;
minData1[i][1]=y;
}
fclose(data1);
data2 = fopen(finalData2,"r");
for(i=0;i<noMinutiae2;i++)
{
fscanf(data2,"%d %d \n",&x,&y);
if(feof(data2))
{
break;
}
minData2[i][0]=x;
minData2[i][1]=y;
}
fclose(data2);
if( method == 1 ){
percentage = match1(minData1, noMinutiae1, minData2, noMinutiae2);
sprintf(score,"matching score = %d \n (accepted above 250)",int (10.0*percentage));
m_score = CString(score);
}
else if( method == 2){
MatchMethod2( finalThin1, finalThin2);
}
else if( method == 3){
percentage = match3(minData1, noMinutiae1, minData2, noMinutiae2);
sprintf(score,"matching score = %d \n ( accepted above 60)",(int)percentage);
m_score = CString(score);
}
}
void MatchDb::Onmatch()
{
// TODO: Add your control notification handler code here
UpdateData(true );
if( m_method[0] == '2')
MatchMethod123(2);
if( m_method[0] == '1')
MatchMethod123(1);
if( m_method[0] == '3')
MatchMethod123(3);
UpdateData(false);
}
BOOL MatchDb::OnInitDialog()
{
CDialog::OnInitDialog();
// TODO: Add extra initialization here
FILE *index;
int no,mat=0,noMinutiae1=0,noMinutiae2=0;
char data[256],image[256], thin[256];
index = fopen("Database/index.txt","r");
fscanf(index,"%d %s %s %s\n",&no,image,data, thin);
while(!feof(index))
{
fscanf(index,"%d %s %s %s\n",&no,image,data, thin);
m_image1.AddString(thin);
m_image2.AddString(thin);
if(feof(index))
{
break;
}
}
fclose(index);
//Onmatch();
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
void MatchDb::OnSelchangeCombo1()
{
// TODO: Add your control notification handler code here
HBITMAP newBmp;
CString test;
m_image1.GetLBText( m_image1.GetCurSel(), test );
newBmp = (HBITMAP) LoadImage(NULL, test, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
m_bmp1.SetBitmap(newBmp);
MatchMethod123(1);
UpdateData( false );
}
void MatchDb::OnSelchangeCombo2()
{
// TODO: Add your control notification handler code here
HBITMAP newBmp;
CString test;
m_image2.GetLBText( m_image2.GetCurSel(), test );
newBmp = (HBITMAP) LoadImage(NULL, test, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
m_bmp2.SetBitmap(newBmp);
MatchMethod123(1);
UpdateData( false );
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?