⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 wi.cpp

📁 一个在线签名鉴定程序。(人工神经网络算法实现)
💻 CPP
📖 第 1 页 / 共 4 页
字号:
// Wi.cpp: implementation of the CWi class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "WiRecognition.h"
#include "Wi.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CWi::CWi()
{
	InitHMM(&hmm, 10, VQ_M, 12);		//初始化模型参数	
}
/****************************************************************************/
/*析构函数 释放为保存样本数据而分配的内存
/*
/****************************************************************************/
CWi::~CWi()
{
	int iCount = trainSampleArray.GetSize ();
	//TRACE("iCount = %d\n", iCount);
	int i = 0;
	while (i < iCount)
	{
		struct Sample *s = (struct Sample *)trainSampleArray.GetAt (i);
		free(s);
		i++;
	}
	iCount = testSampleArray.GetSize ();
	i = 0;
	while (i < iCount)
	{
		struct Sample *s = (struct Sample *)testSampleArray.GetAt (i);
		free(s);
		i++;
	}


}

/****************************************************************************/
/*	把文件名添加到 trainSetDataFilePath 或 testSetDataFilePath
/*	strPath 是要加入的文件名
/*  flag = 0 文件加入trainSetDataFilePath flag = 1 时 文件加入trainSetDataFilePath
/****************************************************************************/
void CWi::AddSampleSetPath (CString strPath, int flag)
{
	if (flag == 0)			//train set
		trainSetDataFilePath.Add (strPath);
	else
		testSetDataFilePath.Add (strPath);
}
/****************************************************************************/
/*	删除数组中的所有文件
/*	flag = 0 删除 trainSetDataFilePath 
/*  flag = 1 删除 testSetDataFilePath
/****************************************************************************/
void CWi::DelSampleSetPath (int flag)
{
	if (flag == 0)			//train set
		trainSetDataFilePath.RemoveAll();
	else
		testSetDataFilePath.RemoveAll();
}
/****************************************************************************/
/*从文件中读取数据
/* s 保存文件数据的结构体指针	
/* filePath 文件名
/****************************************************************************/
void CWi::ParseDataFromFile1 (CWi::Sample *s, CString filePath)
{
	FILE *fdf;
	
	int i;
	int baseA,baseB,baseC;
	//open datafile
	if	((fdf = fopen (filePath, "rb")) == NULL)
	{
		TRACE(_T("Can't open file %s\n"), filePath);
		return;
	}

	fseek (fdf, 0, SEEK_SET);
	
	unsigned char firstByte, secondByte;
	unsigned int firstByteInt, secondByteInt;
	i = 0;
	while ((i < RAWDATADIM) && (!feof (fdf)))
	{
		fread (&firstByte, 1, 1, fdf);//retrieve gray data
		fread (&secondByte, 1, 1, fdf);
		firstByteInt = (int)firstByte;
		secondByteInt = (int)secondByte;
		if(i==0)
			baseC = ((firstByteInt >> 6) | (secondByteInt << 2));
		s->pressC[i] = (double) ((firstByteInt >> 6) | (secondByteInt << 2))-baseC;
		
		fread (&firstByte, 1, 1, fdf);//retrieve gray data
		fread (&secondByte, 1, 1, fdf);
		firstByteInt = (int)firstByte;
		secondByteInt = (int)secondByte;
		if(i==0)
			baseA = ((firstByteInt >> 6) | (secondByteInt << 2));
		s->pressA[i] = (double) ((firstByteInt >> 6) | (secondByteInt << 2))-baseA;
	
		fread (&firstByte, 1, 1, fdf);//retrieve gray data
		fread (&secondByte, 1, 1, fdf);
		firstByteInt = (int)firstByte;
		secondByteInt = (int)secondByte;
		if(i==0)
			baseB = ((firstByteInt >> 6) | (secondByteInt << 2));
		s->pressB[i] = (double) ((firstByteInt >> 6) | (secondByteInt << 2))-baseB;
		i++;	
			 
	}
	
	/*for (i = 0; i < RAWDATADIM; i++)
		TRACE("No. %d: c = %f, a = %f, b = %f\n", 
				i, s->pressC[i], s->pressA[i], s->pressB[i]);
	*/	
	
}

/****************************************************************************/
/* 功能:从签名文件中读取数据
/* 参数:s:保存样本数据
/*       filepath:文件路径
/****************************************************************************/
void CWi::ParseDataFromFile2 (CWi::Sample *s, CString filePath)
{
	FILE *fdf;
	
	int i;
	long length;
	//open datafile
	if	((fdf = fopen (filePath, "rb")) == NULL)
	{
		TRACE(_T("Can't open file %s\n"), filePath);
		return;
	}

	fseek (fdf, 0, SEEK_SET);
	fread (&length,sizeof(long),1,fdf);
	for(i = 0;i<RAWDATADIM;i++)
	{
		s->xLoc2[i]=s->yLoc2[i]=0.0;
		s->pressTotal2[i]=s->pressTotal[i]=0.0;
	}
	i = 0;
	while ((i < length) && (!feof (fdf)))
	{
		fread(&s->point[i],sizeof(PenPoint),1,fdf);			
		s->xLoc[i] = s->xLoc2[i] = s->point[i].x;
		s->yLoc[i] = s->yLoc2[i] = s->point[i].y;
		s->pressTotal[i] = s->pressTotal2[i] = s->point[i].pressure;
		i++;
	}
	s->effectDataNum = length;
	if(!feof(fdf))
		return;
	for( i = length; i<RAWDATADIM;i++)
	{
		s->xLoc[i] = s->xLoc2[i] = 0;
		s->yLoc[i] = s->yLoc2[i] = 0;
		s->pressTotal[i] = s->pressTotal2[i] = 0;
	}
}
/****************************************************************************/
/*
/*	
/*  
/****************************************************************************/
void CWi::ParseDataFromFile3 (CWi::Sample *s, CString filePath)
{
	FILE *fdf;
	
	int i;
	//open datafile
	if	((fdf = fopen (filePath, "rb")) == NULL)
	{
		TRACE(_T("Can't open file %s\n"), filePath);
		return;
	}

	fseek (fdf, 0, SEEK_SET);
	
	unsigned char firstByte;
	i = 0;
	while ((i < RAWDATADIM) && (!feof (fdf)))
	{
		fread (&firstByte, 1, 1, fdf);	//retrieve gray data
		s->pressC[i] = (double) firstByte;
		
		fread (&firstByte, 1, 1, fdf);	//retrieve gray data
		s->pressA[i] = (double) firstByte;
	
		fread (&firstByte, 1, 1, fdf);	//retrieve gray data
		s->pressB[i] = (double) firstByte;
		i++;	
	}
	
	for (i = 0; i < RAWDATADIM; i++)
		TRACE("No. %d: c = %f, a = %f, b = %f\n", 
				i, s->pressC[i], s->pressA[i], s->pressB[i]);
}
/****************************************************************************/
/* 功能:从一组文件中读取数据
/* 参数:samplePathArrayRef-文件路径数组
/*       sampleArrayRef:保存文件数据的数组
/****************************************************************************/
void CWi::RetrieveSample (CStringArray* samplePathArrayRef, 
							 CPtrArray* sampleArrayRef)
{
	int sampleNum;//样本数
	int i;
	sampleArrayRef->RemoveAll ();
	sampleNum = samplePathArrayRef->GetSize ();

	for (i = 0; i < sampleNum; i++)
	{
		CString sampleDataFilePath = samplePathArrayRef->GetAt (i);//路径名
		struct Sample *s = (struct Sample*) malloc (STRUCTSAMPLELEN);
		ParseDataFromFile2 (s, sampleDataFilePath);//获取数据
		/*中值滤波******/
		MedianFilter(s->pressA,RAWDATADIM);
		MedianFilter(s->pressB,RAWDATADIM);
		MedianFilter(s->pressC,RAWDATADIM);

		lowpassfilter(s->pressTotal2,0.6,s->effectDataNum);		

		//ConstructTotal (s);
		sampleArrayRef->Add (s);//样本数组
		Rotation(s->xLoc, s->yLoc,RAWDATADIM,(1+1.0/3.0)*3.1415);
	}
}
/****************************************************************************/
/*
/*	
/*  
/****************************************************************************/
void CWi::ConstructTotal (CWi::Sample* s)
{
	int i; 
	for (i = 0; i < RAWDATADIM; i++)
	{
		s->pressTotal2[i] = s->pressTotal[i] = s->pressA[i] + s->pressB[i] + s->pressC[i];
		s->xLoc[i] = (0.5 * (s->pressB[i]) + (s->pressC[i]))/s->pressTotal[i] ;			
		s->yLoc[i] =s->pressB[i] / s->pressTotal[i];
	}

}


/****************************************************************************/
/* 功能:计算均值
/* 参数:data-数组
/*       datalen-数组长度
/****************************************************************************/
double CWi::CalculateAverage(double *data,int dataLen)
{
	double temp=0.0;
	int i;
	for(i = 0;i<dataLen;i++)
	{
		temp+=data[i];
	}
	return (temp/dataLen);
}

/****************************************************************************/
/* 功能:均值归一化
/* 参数: data-数组
/*        datalen-数组长度
/*        均值
/****************************************************************************/
void CWi::AverageNormalize(double *data,int dataLen,double value)
{
	double average;
	int i;
	average = CalculateAverage(data,dataLen);
	for(i = 0;i<dataLen;i++)
	{
		data[i] = (data[i]*value)/average;
	}
}

/****************************************************************************/
/* 功能:区间范围归一化
/* 参数:data-数组
/*       datalen-数组长度
/****************************************************************************/
void CWi::NormalizeSample (double *data, int dataLen)
{
	int i;
	double dbMax, dbMin;
	dbMax = dbMin =data [0];
	for (i = 1; i < dataLen; i++)
	{
		if (dbMax < data [i])
			dbMax = data [i];
		if (dbMin > data [i])
			dbMin = data [i];
	}
	for (i = 0; i < dataLen; i++)
	{
		data [i] = (data [i] - dbMin) * 255 / (dbMax - dbMin);
	}
}

/****************************************************************************/
/* 功能:区间范围归一化,同时求出最大最小值
/* 参数:data-数组
/*       max-保存数组的最大值
/*       min-保存数组的最小值
/*       datalen-数组的长度
/****************************************************************************/

void CWi::NormalizeSample (double *data, double& max, double& min, 
								int dataLen)
{
	int i;
	double dbMax, dbMin;
	dbMax = dbMin =data [0];

	for (i = 1; i < dataLen; i++)
	{
 
		if (dbMax < data [i])
			dbMax = data [i];
		if (dbMin > data [i])
			dbMin = data [i];
	}

	for (i = 0; i < dataLen; i++)
	{
		data [i] = (data [i] - dbMin) * 255 / (dbMax - dbMin);
	//	TRACE("diff1data[%d] = %f \n", i, data[i]);
	}
	max = dbMax;
	min = dbMin;
}
/****************************************************************************/
/* 功能:对签名样本的图像进行归一化
/* 参数:s-签名样本
/****************************************************************************/
void CWi::NormalizeImage (CWi::Sample* s)
{
	int j;
	double maxXLoc, maxYLoc, minXLoc, minYLoc;
	maxXLoc = s->xLoc2[0];
	maxYLoc = s->yLoc2[0];
	minXLoc = s->xLoc2[0];
	minYLoc = s->yLoc2[0];
	int dataNum = s->effectDataNum;
	for (j = 0; j < dataNum; j++)
	{
		if (maxXLoc < s->xLoc2[j])
			maxXLoc = s->xLoc2[j];
		if (minXLoc > s->xLoc2[j])
			minXLoc = s->xLoc2[j];
		if (maxYLoc < s->yLoc2[j])
			maxYLoc = s->yLoc2[j]; 
		if (minYLoc > s->yLoc2[j])
			minYLoc = s->yLoc2[j];
	}

	for (j = 0; j < dataNum; j++)
	{
		s->xLoc2[j] = (((s->xLoc2[j] -minXLoc) / (maxXLoc - minXLoc)) * IMAGEWIDTH)-1;
		s->yLoc2[j] = (((s->yLoc2[j] -minYLoc) / (maxYLoc - minYLoc)) * IMAGEHEIGHT)-1;
	}
	s->width = maxXLoc - minXLoc;
	s->height = maxYLoc - minYLoc;
}
/****************************************************************************/
/*
/*	
/*  
/****************************************************************************/

void CWi::FTSample (double* dataSource, double* dataDest)
{

	int i;
	double* pr = dataDest;
	double pi[TAPEDDATADIM];
	//	double fr[TAPEDDATADIM];
	//	double fi[TAPEDDATADIM];

	//Initiallize
	for (i = 0; i < TAPEDDATADIM; i++)
	{
		pr [i] = dataSource[i];
		pi [i] = 0.0;
	}

	//返回时pr存放DFT的模,pi存放辐角]
	//mth.kkfft (pr, pi, TAPEDDATADIM, 10, fr, fi, 0, 1);
	//NormalizeSample (pr, TAPEDDATADIM);
}

/****************************************************************************/
/* 功能:求差分
/* 参数:dataSource-原数组
/*       dataDest-保存结果的数组
/*       dataLen-数组的长度
/****************************************************************************/
void CWi::DiffSample (double* dataSource, double* dataDest, int dataLen)
{
	int i;
	
	for (i = dataLen - 1; i >0; i--)
		dataDest[i] = dataSource[i] - dataSource[i-1];//求差分
	dataDest[0] = dataDest[1];
}
/****************************************************************************/
/*
/*	
/*  
/****************************************************************************/

void CWi::FilterNoise (CWi::Sample* s, int critical)
{
	int i, j;

	j = 0;
	for (i = 0; i < RAWDATADIM; i++)
	{
		if (s->pressA[i] > critical && s->pressB[i] > critical && s->pressC[i] >critical )
		{
			s->pressTotal2[j] = s->pressTotal[i];		
			j++;
		}
		else
			s->pressTotal2[i] = 0; 

		s->xLoc2[j] = s->xLoc[i];
		s->yLoc2[j] = s->yLoc[i];
	
	}
	s->effectDataNum = j;
}

/****************************************************************************/
/* 功能:根据签名样本创建图形
/* 参数:sampleArrayRef-输入签名样本
/****************************************************************************/
void CWi::ConstructImage (CPtrArray* sampleArrayRef)
{
	int sampleNum = sampleArrayRef->GetSize ();
	int i, j, k, t;
	struct Sample *s;

	for (i = 0; i < sampleNum; i++)
	{
		s = (struct Sample *)sampleArrayRef->GetAt (i);

		for (j = 0; j < IMAGEWIDTH; j++)
			for (k = 0; k < IMAGEHEIGHT; k++)
				s->imgPixel[j][k] = 255.0;

		for (t = 0; t < RAWDATADIM; t++)
		{
			s->imgPixel[(int)s->xLoc2[t]][(int)s->yLoc2[t]] =255.0-s->pressTotal2[t];
		}
	}			

}

/****************************************************************************/
/*功能:对输入样本进行预处理
/*参数:sampleArrayRef-输入签名样本
/*      flag-处理方法标志
/****************************************************************************/
void CWi::PreProcSample(CPtrArray* sampleArrayRef, int flag)
{
	int sampleNum;
	int count;
	double max,min;
	sampleNum = sampleArrayRef->GetSize();

	for (count = 0; count < sampleNum; count++)
	{
		struct Sample *s;
		s = (Sample *)sampleArrayRef->GetAt (count);
		
		NormalizeSample (s->pressTotal2, max, min, s->effectDataNum);	//样本归一化
		AverageNormalize(s->pressTotal2,s->effectDataNum,200.0);
		NormalizeImage (s);
	}

	ConstructImage(sampleArrayRef);
}

/****************************************************************************/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -