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 + -
显示快捷键?