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

📄 featuremanage.~pas

📁 模板匹配之手写数字识别系统,基于DELPHI 7.0
💻 ~PAS
字号:
unit FeatureManage;

interface

uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, typevalue;
type
 NumCharPattern = record
 Num: integer;
 FeatureDetail: array[0..500,1..8,1..8] of integer;
end;
    FindNumber = record
        Numb:integer;
        order: array[0..500] of integer;
    end;
type
    TFeature = class
    private
      Featuretype: array [0..500,0..63] of integer;
      class function GetSubStr(var aString:String;SepChar:String):String;
      class function GetSubStrNum(aString:String;SepChar:String):integer;
    public
      class procedure SaveToFile();
      class procedure Openfile();
      class function FeatureCompare():double;
    end;

var
    Featurestr:array [1..8,1..8] of integer;
implementation

uses main;

////////////////////////////////////////////////////////////
class procedure TFeature.SaveToFile();
var //记录每个数字的各个模板
 n,i,j,k,Number:integer;
 SepChar:String;
 PatternFile:TextFile;
 pathstring:string;
begin
     PathString:=ExtractFilePath(Application.ExeName)+'Feature\Pattern.txt';
     Assignfile(PatternFile,PathString);
     ReWrite(PatternFile);//写模板文件
      SepChar:=' ';
        for Number := 0 to 9 do //记录数字‘0’到‘9’的各模板数据
          if Pattern[Number].Num=0 then
            begin
         Writeln(PatternFile,IntToStr(Number));//记录具体的数字
         Writeln(PatternFile,IntToStr(0));//记录该数字模板的个数
            end
                   else
             if Pattern[Number].Num<>0 then
              begin
         Writeln(PatternFile,IntToStr(Number));//记录具体的数字
         Writeln(PatternFile,IntToStr(pattern[Number].Num));//记录该数字模板的个数
    for k:=1 to  Pattern[Number].Num do
      begin //记录每个模板的8*8的具体特征值
Writeln(PatternFile,IntToStr(pattern[Number].FeatureDetail[k][1,1]),
     SepChar,IntToStr(Pattern[Number].FeatureDetail[k][1,2]),
     SepChar,IntToStr(Pattern[Number].FeatureDetail[k][1,3]),
     SepChar,IntToStr(Pattern[Number].FeatureDetail[k][1,4]),
     SepChar,IntToStr(Pattern[Number].FeatureDetail[k][1,5]),
     SepChar,IntToStr(Pattern[Number].FeatureDetail[k][1,6]),
     SepChar,IntToStr(Pattern[Number].FeatureDetail[k][1,7]),
     SepChar,IntToStr(Pattern[Number].FeatureDetail[k][1,8]),SepChar);
Writeln(PatternFile,IntToStr(pattern[Number].FeatureDetail[k][2,1]),
     SepChar,IntToStr(Pattern[Number].FeatureDetail[k][2,2]),
     SepChar,IntToStr(Pattern[Number].FeatureDetail[k][2,3]),
     SepChar,IntToStr(Pattern[Number].FeatureDetail[k][2,4]),
     SepChar,IntToStr(Pattern[Number].FeatureDetail[k][2,5]),
     SepChar,IntToStr(Pattern[Number].FeatureDetail[k][2,6]),
     SepChar,IntToStr(Pattern[Number].FeatureDetail[k][2,7]),
     SepChar,IntToStr(Pattern[Number].FeatureDetail[k][2,8]),SepChar);
Writeln(PatternFile,IntToStr(Pattern[Number].FeatureDetail[k][3,1]),
     SepChar,IntToStr(Pattern[Number].FeatureDetail[k][3,2]),
     SepChar,IntToStr(Pattern[Number].FeatureDetail[k][3,3]),
     SepChar,IntToStr(Pattern[Number].FeatureDetail[k][3,4]),
     SepChar,IntToStr(Pattern[Number].FeatureDetail[k][3,5]),
     SepChar,IntToStr(Pattern[Number].FeatureDetail[k][3,6]),
     SepChar,IntToStr(Pattern[Number].FeatureDetail[k][3,7]),
     SepChar,IntToStr(Pattern[Number].FeatureDetail[k][3,8]),SepChar);
Writeln(PatternFile,IntToStr(pattern[Number].FeatureDetail[k][4,1]),
     SepChar,IntToStr(Pattern[Number].FeatureDetail[k][4,2]),
     SepChar,IntToStr(Pattern[Number].FeatureDetail[k][4,3]),
     SepChar,IntToStr(Pattern[Number].FeatureDetail[k][4,4]),
     SepChar,IntToStr(Pattern[Number].FeatureDetail[k][4,5]),
     SepChar,IntToStr(Pattern[Number].FeatureDetail[k][4,6]),
     SepChar,IntToStr(Pattern[Number].FeatureDetail[k][4,7]),
     SepChar,IntToStr(Pattern[Number].FeatureDetail[k][4,8]),SepChar);
Writeln(PatternFile,IntToStr(pattern[Number].FeatureDetail[k][5,1]),
     SepChar,IntToStr(Pattern[Number].FeatureDetail[k][5,2]),
     SepChar,IntToStr(Pattern[Number].FeatureDetail[k][5,3]),
     SepChar,IntToStr(Pattern[Number].FeatureDetail[k][5,4]),
     SepChar,IntToStr(Pattern[Number].FeatureDetail[k][5,5]),
     SepChar,IntToStr(Pattern[Number].FeatureDetail[k][5,6]),
     SepChar,IntToStr(Pattern[Number].FeatureDetail[k][5,7]),
     SepChar,IntToStr(Pattern[Number].FeatureDetail[k][5,8]),SepChar);
Writeln(PatternFile,IntToStr(pattern[Number].FeatureDetail[k][6,1]),
     SepChar,IntToStr(Pattern[Number].FeatureDetail[k][6,2]),
     SepChar,IntToStr(Pattern[Number].FeatureDetail[k][6,3]),
     SepChar,IntToStr(Pattern[Number].FeatureDetail[k][6,4]),
     SepChar,IntToStr(Pattern[Number].FeatureDetail[k][6,5]),
     SepChar,IntToStr(Pattern[Number].FeatureDetail[k][6,6]),
     SepChar,IntToStr(Pattern[Number].FeatureDetail[k][6,7]),
     SepChar,IntToStr(Pattern[Number].FeatureDetail[k][6,8]),SepChar);
Writeln(PatternFile,IntToStr(pattern[Number].FeatureDetail[k][7,1]),
     SepChar,IntToStr(Pattern[Number].FeatureDetail[k][7,2]),
     SepChar,IntToStr(Pattern[Number].FeatureDetail[k][7,3]),
     SepChar,IntToStr(Pattern[Number].FeatureDetail[k][7,4]),
     SepChar,IntToStr(Pattern[Number].FeatureDetail[k][7,5]),
     SepChar,IntToStr(Pattern[Number].FeatureDetail[k][7,6]),
     SepChar,IntToStr(Pattern[Number].FeatureDetail[k][7,7]),
     SepChar,IntToStr(Pattern[Number].FeatureDetail[k][7,8]),SepChar);
Writeln(PatternFile,IntToStr(pattern[Number].FeatureDetail[k][8,1]),
     SepChar,IntToStr(Pattern[Number].FeatureDetail[k][8,2]),
     SepChar,IntToStr(Pattern[Number].FeatureDetail[k][8,3]),
     SepChar,IntToStr(Pattern[Number].FeatureDetail[k][8,4]),
     SepChar,IntToStr(Pattern[Number].FeatureDetail[k][8,5]),
     SepChar,IntToStr(Pattern[Number].FeatureDetail[k][8,6]),
     SepChar,IntToStr(Pattern[Number].FeatureDetail[k][8,7]),
     SepChar,IntToStr(Pattern[Number].FeatureDetail[k][8,8]),SepChar);
     end;
 end;
  CloseFile(PatternFile);//关闭模板文件
end;
//////////////////////////////////////////////////////////////////////////////////
class procedure TFeature.Openfile();
var //读取每个数字类的各个模板特征
  i,j,SubStrAmout,t,k:Integer;
  Number,TotalOfOneDigital:integer;
  ThisLine,sNumber,sTotal,SepChar,sFeatureCode: string;
  item: array [1..8] of string;
  PatternFile:TextFile;
begin
   Try
     begin //确定特定路径的固定的文件名
  PathString:=ExtractFilePath(Application.ExeName)+'\Feature\Pattern.txt';
  AssignFile(PatternFile,PathString);
  Reset(PatternFile);
    SepChar:=' ';//定义分格符
    While not Eof(PatternFile)do
       begin //读取具体的数字类
       ReadLn(PatternFile,sNumber);
       Number:=StrToInt(sNumber);
       ReadLn(PatternFile,sTotal);////读取具体的数字类的模板个数
        TotalOfOneDigital:=StrToInt(sTotal);
          if TotalOfOneDigital <> 0  then
          begin
          Pattern[Number].num:=TotalOfOneDigital;
             for k:=1 to  TotalOfOneDigital do //每个数字类的模板总数
            begin
                 for i:=1 to  8 do
                   begin   //得到用空格分隔的8行特征
                  ReadLn(PatternFile,sFeatureCode);
                  ThisLine:=sFeatureCode;
                  SubStrAmout:=GetSubStrNum(ThisLine,SepChar);
        begin
          for t:=1 to SubStrAmout do  //取每一行的8个特征值
          Item[t]:=GetSubStr(ThisLine,SepChar); //被分隔的特征字符数组
         end;
  for j:= 1 to  8  do //用全程变量记录各特征值
       Pattern[Number].FeatureDetail[k][i][j]:=StrToInt(Item[j]);
              end;
           end;
       end;
     end;
end;
  CloseFile(PatternFile);//关闭模板文件
 Finally
  end;
end;
///////////////////////////////////////////////////////////////////////
class function TFeature.GetSubStr(var aString:String;SepChar:String):String;
var//得到分隔字符的子程序
  SingleChar:String;
  StrLen:Integer;
  SepCharPos:Integer;
 begin
   StrLen:=Length(aString);
   SepCharPos:=Pos(SepChar,aString); //计算分割符在子串中的位置
   SingleChar:=Copy(aString,1,SepCharPos-1); //将分割符前所有字符放到SingleChar串中
   Delete(aString,1,SepCharPos); //除去分割符和分割符前的子串
   GetSubStr:=SingleChar; //返回一个字段
end;
///////////////////////////////////////////////////////////////////////////////////////
class function TFeature.GetSubStrNum(aString:String;SepChar:String):integer;
 var//得到一行中分隔字符个数的子程序
  i:Integer;
  StrLen:Integer;
  Num:Integer;
 begin
   StrLen:=Length(aString);
   Num:=0;
    For i:=1 to StrLen do
      If Copy(aString,i,1) = SepChar then
        Num:=Num+1;
        result:=Num;
 end;
///////////////////////////////////////////////////////////
class function TFeature.FeatureCompare():double;
var //特征距离计算比较函数
  i,j,k,Number:integer;
  CodeAsSame,CodeSameMax,ReconFinalNumber,ReconFinalNumberIndex:integer;
 begin
    ReconFinalNumber:=-1;// 如没识别,则识别的数字为‘-1’
    ReconFinalNumberIndex:=-1; //如没识别,则识别的数字序号为‘-1’
    CodeSameMax:=0;//被识别数字和模板库中数字的64个特征中最大的相同数目
  for number:=0 to 9   do
  begin //对于数字‘0’到‘9’的每个模板都比较分析
   if  pattern[Number].num <> 0 then
   begin //对于每个数字中的每个模板都比较分析
     for k:=1 to Pattern[Number].num do
     begin
         CodeAsSame:=0;//64个特征的相同值初设为0
      for i := 1 to 8 do
          for j := 1 to 8 do
        begin//64个特征的相同性越大,它们的特征距离越小
          if (Pattern[Number].FeatureDetail[k][i][j]=EightCode[j][i])
             then CodeAsSame:=CodeAsSame+1;
        end;
           if CodeSameMax<CodeAsSame then
              begin
              CodeSameMax:=CodeAsSame; ReconFinalNumber:=Number;//识别的数字
              ReconFinalNumberIndex:=k;//这个数字在模板中的序号
              end;
          end;
        end;
  end;//显示识别的数字结果和该数字在这个数字模板中的序号
     RecogForm.NumberResultEdit.Text:= IntToStr(ReconFinalNumber);
     RecogForm.NumberIndexResultEdit.Text:= IntToStr(ReconFinalNumberIndex);
     RecogForm.NumberLabel.Caption:=IntToStr(ReconFinalNumber);
end;
///////////////////////////////////////////////////////////////////////

end.

⌨️ 快捷键说明

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