📄 featuremanage.~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 + -