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

📄 faturemanage.~pas

📁 轴承表面质量缺陷识别与统计系统,基于DELPHI 7.0
💻 ~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 + -