for(i=width-1;i>0;i--)
{
flag=FALSE;
for(j=0;j<height;j++)
if(m_pData[j*LineBytes+i]==0)
{
flag=TRUE;
break;
}
if(flag)
break;
}
right=i;
}
/***************************************************************
* 函数名称:SetFeature()
* 函数类型:void
* 函数功能:将手写数字特征保存在变量testsample中
****************************************************************/
void GetFeature::SetFeature()
{
int i,j;
for(j=0;j<5;j++)
{
for(i=0;i<5;i++)
{
testsample[5*(4-j)+i]=Cal(j,i);//(Cal(j,i)>0.10)?1:0;//
}
}
}
/****************************************************************
* 函数名称:Cal(int row, int col)
* 函数类型:double
* 参数说明:int row, int col:第row行,第col个区域
* 函数功能:计算某一小区域内黑像素所占比例,返回某一小区域内黑像素所占比例
****************************************************************/
double GetFeature::Cal(int row, int col)
{
double w,h,count;
w=(right-left)/5;
h=(top-bottom)/5;
count=0;
for(int j=bottom+row*h;j<bottom+(row+1)*h;j++)
for(int i=left+col*w;i<left+(col+1)*w;i++)
{
if(m_pData[j*LineBytes+i]==0)
count++;
}
return (double)count/(w*h);
}
/***************************************************************
* 函数名称:Savealbe(int cls)
* 函数类型:BOOL
* 参数说明:int cls:类别
* 函数功能:判断手写数字可否保存为cls类别的一个样品
* 同一类别的样品不能有重复的
****************************************************************/
BOOL GetFeature::Saveable(int cls)
{
for(int i=0;i<pattern[cls].number;i++)
{
BOOL flag=TRUE;
for(int j=0;j<25;j++)
flag&=(pattern[cls].feature[i][j]==testsample[j])?TRUE:FALSE;
if (flag) return FALSE;
}
return TRUE;
}
/***************************************************************
* 函数名称:Save(int cls)
* 函数类型:void
* 参数说明:int cls:类别
* 函数功能:将手写数字保存为cls类别的一个样品,保存在样品的第一个
****************************************************************/
void GetFeature::Save(int cls)
{
for(int i=pattern[cls].number;i>0;i--)
for(int j=0;j<25;j++)
pattern[cls].feature[i][j]=pattern[cls].feature[i-1][j];
for(i=0;i<25;i++)
pattern[cls].feature[0][i]=testsample[i];
pattern[cls].number++;
}
int GetFeature::LeastDistance()
{
double min=10000000000;
int no;
for(int n=0;n<10;n++)
{
for(int i=0;i<pattern[n].number;i++)
{
if(pipei(pattern[n].feature[i],testsample)<min)
{
//匹配的最小值
min=pipei(pattern[n].feature[i],testsample);
no=n;//样品类别
}
}
}
return no;//返回手写数字的类别和序号
}
double GetFeature::pipei(double s1[], double s2[])
{
double count=0.0;
for(int i=0;i<25;i++)
{
count+=(s1[i]-s2[i])*(s1[i]-s2[i]);
}
return count;
} |