📄 wi.cpp
字号:
// 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 + -