{$cfg_webname}
主页 > 计算机 > 论文 >

基于模式识别的手写汉字识别毕业设计论文(5)

来源:56doc.com  资料编号:5D4022 资料等级:★★★★★ %E8%B5%84%E6%96%99%E7%BC%96%E5%8F%B7%EF%BC%9A5D4022
资料以网页介绍的为准,下载后不会有水印.资料仅供学习参考之用. 帮助
资料介绍

 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;
}

推荐资料