📄 faturemanage.~pas
字号:
unit FatureManage;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs,math;
type
NumCharPattern = record
Num: integer;
FeatureDetail: array[0..500,1..20] of real;
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 LestFeatureCompare():double;
end;
var
Featurestr:array [1..7] of real;
DefectType:integer;
t1,t2:array [1..15] of double;
implementation
uses CHILDWIN;
////////////////////////////////////////////////////////////
class procedure TFeature.SaveToFile();
var //记录每个缺陷的各个特征值
n,i,j,k,Number:integer;
SepChar:String;
PatternFile:TextFile;
pathstring:string;
begin
PathString:=ExtractFilePath(Application.ExeName)+'pattern\fature.txt';
Assignfile(PatternFile,PathString);
ReWrite(PatternFile);//写文件
SepChar:=' ';
for Number := 0 to 3 do //记录缺陷种类'0'到'3'的各特征值数据
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 //记录每个缺陷的1*15的具体特征值
Writeln(PatternFile,FloatToStr(pattern[Number].FeatureDetail[k][1]),
SepChar,FloatToStr(Pattern[Number].FeatureDetail[k][2]),
SepChar,FloatToStr(Pattern[Number].FeatureDetail[k][3]),
SepChar,FloatToStr(Pattern[Number].FeatureDetail[k][4]),
SepChar,FloatToStr(Pattern[Number].FeatureDetail[k][5]),
SepChar,FloatToStr(Pattern[Number].FeatureDetail[k][6]),
SepChar,FloatToStr(Pattern[Number].FeatureDetail[k][7]),
SepChar,FloatToStr(Pattern[Number].FeatureDetail[k][8]),
SepChar,FloatToStr(Pattern[Number].FeatureDetail[k][9]),
SepChar,FloatToStr(Pattern[Number].FeatureDetail[k][10]),
SepChar,FloatToStr(Pattern[Number].FeatureDetail[k][11]),
SepChar,FloatToStr(Pattern[Number].FeatureDetail[k][12]),
SepChar,FloatToStr(Pattern[Number].FeatureDetail[k][13]),
SepChar,FloatToStr(Pattern[Number].FeatureDetail[k][14]),
SepChar,FloatToStr(Pattern[Number].FeatureDetail[k][15]),
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,pathstring: string;
item: array [1..20] of string;
PatternFile:TextFile;
begin
Try
begin //确定特定路径的固定的文件名
PathString:=ExtractFilePath(Application.ExeName)+'pattern\fature.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
ReadLn(PatternFile,sFeatureCode);
ThisLine:=sFeatureCode;
SubStrAmout:=GetSubStrNum(ThisLine,SepChar);
for t:=1 to SubStrAmout do
Item[t]:=GetSubStr(ThisLine,SepChar); //被分隔的特征字符数组
for i:=1 to 15 do
Pattern[Number].FeatureDetail[k][i]:=StrToFloat(Item[i]);
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.LestFeatureCompare():double;
var //最小距离法判断缺陷种类
i,j,i1,j1,k,N,k1,k2:integer;
Average:array [0..3,0..10] of double;
Dict,DictTotle:array[0..3] of double ;
FeatureTotle: array [0..3,0..10] of double;
TempDict,rTotle:real;
Para: array [0..3,0..100,0..10] of double;
ParaTotle: array [0..3,0..100] of double;
ObjectPara: array [0..10] of double;
begin
for i1:=0 to 3 do //初始化数组
begin
DictTotle[i1]:=0; Dict[i1]:=0; ObjectPara[i1]:=0;
for j1:=0 to 10 do
begin
FeatureTotle[i1][j1]:=0;
Average[i1][j1]:=0;
for k1:=0 to 100 do
begin
para[i1][k1][j1]:=0;
paraTotle[i1][k1]:=0;
end;
end;
end;
for N:=0 to 3 do //轴承表面第N类缺陷,共4类
begin
for i:=0 to 10 do //第N类缺陷的第k个样本特征值的第i个特征参数
begin
for k2:=1 to Pattern[N].num do //第N类缺陷的第k个样本特征值
ParaTotle[N][k2]:=ParaTotle[N][k2]+Pattern[N].FeatureDetail[k2][i+5];
for k:=1 to Pattern[N].num do
begin
Para[N][k][i]:=(ParaTotle[N][k]-Pattern[N].FeatureDetail[k][i+5])/(ParaTotle[N][k]+0.0001);//归一化系数
FeatureTotle[N][i]:=FeatureTotle[N][i]+Para[N][k][i]*Pattern[N].FeatureDetail[k][i+5];
end; //选取细长度、圆度、矩形拟合因子和矩8个特征作为用于判断缺陷种类的特征,它们在文件中存放位置从5到15位
Average[N][i]:=FeatureTotle[N][i]/(Pattern[N].num+0.0001) ; //求平均值
rTotle:=rTotle+r[TempNum][i+5];
ObjectPara[i]:=(rTotle-r[TempNum][i+5])/(rTotle+0.0001); //待测缺陷特征值归一化系数
DictTotle[N]:= DictTotle[N]+(ObjectPara[i]*r[TempNum][i+5]-Average[N][i])*(ObjectPara[i]*r[TempNum][i+5]-Average[N][i]);
end; //r[TempNum][5]到r[TempNum][15]分别为待测图像的细长度、圆度、矩形拟合因子、8个矩特征值
Dict[N]:=sqrt(DictTotle[N]+0.0001);
end;
TempDict:=999.99;
for j:=0 to 3 do
begin
if Dict[j]<TempDict then //判断哪一类的Dict最小
begin
TempDict:=Dict[j];
DefectType:=j;
end;
end;
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -