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