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

📄 netunit.pas

📁 用Delphi写的车牌字符各种特征提取实验系统
💻 PAS
📖 第 1 页 / 共 4 页
字号:
       begin
         if Tout[j]=1 then Data[(i-1)*5+j+160-1]:=0.9
         else Data[(i-1)*5+j+160-1]:=0.1;
       end;

       TenToTwo(MainUnit.LineColorJmpE[i]-MainUnit.LineColorJmpS[i],Tout);
       for j:=1 to 5 do
       begin
         if Tout[j]=1 then Data[(i-1)*5+j+320-1]:=0.9
         else Data[(i-1)*5+j+160-1]:=0.1;
       end;

       TenToTwo(MainUnit.RowColorJmpE[i]-MainUnit.RowColorJmpS[i],Tout);
       for j:=1 to 5 do
       begin
         if Tout[j]=1 then Data[(i-1)*5+j+480-1]:=0.9
         else Data[(i-1)*5+j+160-1]:=0.1;
       end;        }
        Data[i]:=MainUnit.LineSum[i]/DataDiv;
        Data[i+32]:=MainUnit.RowSum[i]/DataDiv;
        Data[i+64]:=MainUnit.LineColorJmpS[i]/DataDiv;
        Data[i+96]:=MainUnit.LineColorJmpE[i]/DataDiv;
        Data[i+128]:=MainUnit.RowColorJmpS[i]/DataDiv;
        Data[i+160]:=MainUnit.RowColorJmpE[i]/DataDiv;
      end;
      for i:=1 to 4 do
      begin
        Data[i+192]:=MainUnit.FourColorCenterx[i]/DataDiv;
        Data[i+196]:=MainUnit.FourColorCentery[i]/DataDiv;
      end;
  result:=Data;
end;

function TNetForm.squash(x: double): double;
begin
  Result:=(1.0/(1.0+exp(-x)));
end;


function TNetForm.Statistic(const rect: Trect; img: TImage): integer;
var
  x,y:integer;
begin
  Result:=0;
  for x:=rect.Left  to rect.Right do
   for y:=rect.Top  to rect.Bottom  do
    if img.Canvas.Pixels[x,y]<>16777215 then
      inc(result);
end;

procedure TNetForm.w_num(n1, n2, n3: integer; name: Pchar);  //保存各层结点的数目
var
  s:TStringList;
  buffer: D1Num;
  i:integer;
begin
  s:=TStringList.Create ;
  setlength(buffer,3);
  buffer[0]:=n1;
  buffer[1]:=n2;
  buffer[2]:=n3;
  for i:=0 to 2 do
   s.Add(inttostr(buffer[i])) ;
  s.SaveToFile(name);
  s.Free;
end;
function TNetForm.r_weight(var w: D2Array; n1, n2: integer;
  s:TStringList): boolean;  //读取权值
var
  i,j:integer;
  buffer:D1Array;
begin
  setlength(buffer,(n1+1)*(n2+1));
  setlength(w,(n1+1),(n2+1));
  for i:=0 to s.Count-1 do
    buffer[i]:=strtofloat(s[i]);
  for i:=0 to n1 do
    for j:=0 to n2 do
  w[i,j]:=buffer[i*(n2+1)+j];
  setlength(buffer,0);
 // setlength(buffer,(n1+1)*(n2+1));
  result:=true;
end;

procedure TNetForm.w_weight(var w: D2Array; n1, n2: integer; name: Pchar);
var
  i,j:integer;
  s:TstringList;
  buffer:D1Array;
  Pathstring:string;
begin
  s:=TStringList.Create ;                     //??
  setlength(buffer,(n1+1)*(n2+1));
  for i:=0 to n1 do
    for j:=0 to n2 do
    begin
      buffer[i*(n2+1)+j]:=w[i,j];
      s.Add(floattostr(buffer[i*(n2+1)+j]));
    end;
    if name='汉字输入层到隐含层.txt' then WordInput:=s
    else if name='汉字隐含层到输出层.txt'then WordCenter:=s
    else if name='数字输入层到隐含层.txt'then NumberInput:=s
    else if name='数字隐含层到输出层.txt'then NumberCenter:=s
    else if name='英文输入层到隐含层.txt'then EnglishInput:=s
    else if name='英文隐含层到输出层.txt'then EnglishCenter:=s;
   Pathstring:=ExtractFilePath(Application.ExeName)+'\NetWeightParameter\' ;
   s.SaveToFile(Pathstring+name);
   s.Free;
end;

//////////////////////////////////////////////////////////////////////


procedure TNetForm.Button2Click(Sender: TObject);
var
  n:D1Num;
  n_in,n_hidden,n_out:integer;
  data:D1Array;
  //data_in:D1Array;
begin
  setlength(data,201);
  setlength(n,3);
  if r_num(n,EachLayerNumber)=false then exit
  else
    n_in:=n[0];  //获取输入层结点数目
    n_hidden:=n[1];  //获取隐含层数目
    n_out:=n[2];//获取输出层数目
    data:= rcode(Img,16,20);
   //根据特征进行样本识别
  //  Edit1.Text:=IntToStr(n_in);
    CodeRecognize(Data,n_in, n_hidden,n_out,resultlabel);
end;

procedure TNetForm.TrainButtonClick(Sender: TObject);
var
  momentum,min_ex,eta:double;
  n_hidden,digitalcount:integer;
  data_in,data_out:D2Array;
  i,j:integer;
  E:WideString;
const
  A:array[0..22] of array[0..4] of double=((0.1,0.1,0.1,0.1,0.1),(0.1,0.1,0.1,0.1,0.9),
    (0.1,0.1,0.1,0.9,0.1),(0.1,0.1,0.1,0.9,0.9),(0.1,0.1,0.9,0.1,0.1),
    (0.1,0.1,0.9,0.1,0.9),(0.1,0.1,0.9,0.9,0.1),(0.1,0.1,0.9,0.9,0.9),
    (0.1,0.9,0.1,0.1,0.1),(0.1,0.9,0.1,0.1,0.9),(0.1,0.9,0.1,0.9,0.1),
    (0.1,0.9,0.1,0.9,0.9),(0.1,0.9,0.9,0.1,0.1),(0.1,0.9,0.9,0.1,0.9),
    (0.1,0.9,0.9,0.9,0.1),(0.1,0.9,0.9,0.9,0.9),(0.9,0.1,0.1,0.1,0.1),
    (0.9,0.1,0.1,0.1,0.9),(0.9,0.1,0.1,0.9,0.1),(0.9,0.1,0.1,0.9,0.9),
    (0.9,0.1,0.9,0.1,0.1),(0.9,0.1,0.9,0.1,0.9),(0.9,0.1,0.9,0.9,0.1));      //数字组初始化
  B:array[0..25] of array[0..4] of double=((0.1,0.1,0.1,0.1,0.1),(0.1,0.1,0.1,0.1,0.9),
    (0.1,0.1,0.1,0.9,0.1),(0.1,0.1,0.1,0.9,0.9),(0.1,0.1,0.9,0.1,0.1),
    (0.1,0.1,0.9,0.1,0.9),(0.1,0.1,0.9,0.9,0.1),(0.1,0.1,0.9,0.9,0.9),
    (0.1,0.9,0.1,0.1,0.1),(0.1,0.9,0.1,0.1,0.9),(0.1,0.9,0.1,0.9,0.1),
    (0.1,0.9,0.1,0.9,0.9),(0.1,0.9,0.9,0.1,0.1),(0.1,0.9,0.9,0.1,0.9),
    (0.1,0.9,0.9,0.9,0.1),(0.1,0.9,0.9,0.9,0.9),(0.9,0.1,0.1,0.1,0.1),
    (0.9,0.1,0.1,0.1,0.9),(0.9,0.1,0.1,0.9,0.1),(0.9,0.1,0.1,0.9,0.9),
    (0.9,0.1,0.9,0.1,0.1),(0.9,0.1,0.9,0.1,0.9),(0.9,0.1,0.9,0.9,0.1),
    (0.9,0.1,0.9,0.9,0.9),(0.9,0.9,0.1,0.1,0.1),(0.9,0.9,0.1,0.1,0.9));
    //英文组初始化
  C:array[0..28] of array[0..4] of double=((0.1,0.1,0.1,0.1,0.1),(0.1,0.1,0.1,0.1,0.9),
    (0.1,0.1,0.1,0.9,0.1),(0.1,0.1,0.1,0.9,0.9),(0.1,0.1,0.9,0.1,0.1),
    (0.1,0.1,0.9,0.1,0.9),(0.1,0.1,0.9,0.9,0.1),(0.1,0.1,0.9,0.9,0.9),
    (0.1,0.9,0.1,0.1,0.1),(0.1,0.9,0.1,0.1,0.9),(0.1,0.9,0.1,0.9,0.1),
    (0.1,0.9,0.1,0.9,0.9),(0.1,0.9,0.9,0.1,0.1),(0.1,0.9,0.9,0.1,0.9),
    (0.1,0.9,0.9,0.9,0.1),(0.1,0.9,0.9,0.9,0.9),(0.9,0.1,0.1,0.1,0.1),
    (0.9,0.1,0.1,0.1,0.9),(0.9,0.1,0.1,0.9,0.1),(0.9,0.1,0.1,0.9,0.9),
    (0.9,0.1,0.9,0.1,0.1),(0.9,0.1,0.9,0.1,0.9),(0.9,0.1,0.9,0.9,0.1),
    (0.9,0.1,0.9,0.9,0.9),(0.9,0.9,0.1,0.1,0.1),(0.9,0.9,0.1,0.1,0.9),
    (0.9,0.9,0.1,0.9,0.1),(0.9,0.9,0.1,0.9,0.9),(0.9,0.9,0.9,0.1,0.1));  //汉字组初始化
  // 初试化定义1-9-A-像。改成3个组
  n_in:integer=201;
begin
  E:=memo3.Text;
  digitalcount:=length(E);
  momentum:=strtofloat(m_a.Text );
  min_ex:=strtofloat(m_ex.Text );
  eta:=strtofloat(m_eta.Text );
  n_hidden:=strtoint(m_hn.Text );
  setlength(data_in,digitalcount+1,201);
  setlength(data_out,digitalcount,5);
  data_in:=code(Sender,Img,digitalcount,16,20);
     for i:=0 to digitalcount-1 do //输出节点值赋值
        for j:=0 to 4 do
        if nhyschar='数字' then
          data_out[i,j]:=A[i,j]
        else if nhyschar='英文' then
          data_out[i,j]:=B[i,j]
       else if nhyschar='汉字' then
          data_out[i,j]:=C[i,j];
     // 不同的训练读A,B,C数组
   //训练BP网络
  BPTrain(Sender,Data_in, Data_out, n_in, n_hidden,min_ex, momentum, eta, digitalcount);
end;

procedure TNetForm.ComboBox1Change(Sender: TObject);
var
PathString:string;
begin
nhyschar:='';
memo3.Clear;
Pathstring:=ExtractFilePath(Application.ExeName)+'\carNumber\'+combobox1.Text+'.txt';
memo3.Lines.LoadFromFile(Pathstring);
trainButton.Enabled:=true;
//RecognizeInChar.Enabled:=true;
if combobox1.Text='汉字' then
begin
  TextInput.Text:=WordInput.Text;
  TextCenter.Text:=WordCenter.Text;
end else if  combobox1.Text='数字' then
begin
  TextInput.Text:=NumberInput.Text;
  TextCenter.Text:=NumberCenter.Text;
end else if  combobox1.Text='英文' then
begin
  TextInput.Text:=EnglishInput.Text;
  TextCenter.Text:=EnglishCenter.Text;
end;
  nhyschar:=Combobox1.Text;
end;

procedure TNetForm.Button1Click(Sender: TObject);
begin
if NetOpenPictureDialog.Execute then
begin
  CharImage.Picture.LoadFromFile(NetOpenPictureDialog.FileName);
  if nhyschar<>'汉字' then TextForm.ClearSmall(Sender,CharImage,CharImage);
  GetRegion(CharImage.Picture.Bitmap);
  zoom;
 // TextForm.XiHua1(NormalImage.Picture.Bitmap);
  ImageViewForm.SqImage.Picture:=NormalImage.Picture;
  //TextForm.GuiYi(Image1,ImageViewForm.ZTImage,ImageViewForm.SqImage);
  Img.Picture:=NormalImage.Picture;
 // TextForm.LetterXH2.Click;
  TextForm.ImageTeZheng(NormalImage);
end;
end;

procedure TNetForm.FormCreate(Sender: TObject);
var
  FPas:string;
begin
FPas:=ExtractFilePath(Application.ExeName)+'\NetWeightParameter\';
EachLayerNumber:=TStringList.Create;
WordInput:=TStringList.Create;
WordCenter:=TStringList.Create;
NumberInput:=TStringList.Create;
NumberCenter:=TStringList.Create;
EnglishInput:=TStringList.Create;
EnglishCenter:=TStringList.Create;
EachLayerNumber.LoadFromFile(FPas+'各层结点数.txt');
WordInput.LoadFromFile(FPas+'汉字输入层到隐含层.txt');
WordCenter.LoadFromFile(FPas+'汉字隐含层到输出层.txt');
NumberInput.LoadFromFile(FPas+'数字输入层到隐含层.txt');
NumberCenter.LoadFromFile(FPas+'数字隐含层到输出层.txt');
EnglishInput.LoadFromFile(FPas+'英文输入层到隐含层.txt');
EnglishCenter.LoadFromFile(FPas+'英文隐含层到输出层.txt');
TextInput:=TStringList.Create;
TextCenter:=TStringList.Create;
TextInput.Text:=WordInput.Text;
TextCenter.Text:=WordCenter.Text;
nhyschar:=Combobox1.Text;
end;

procedure TNetForm.BitBtn1Click(Sender: TObject);
begin
NetForm.Hide;
TextForm.show;
if TextForm.N3.Checked=True then ChartForm.show
else ChartForm.Hide;
if TextForm.N6.Checked=True then ImageViewForm.show
else ImageViewForm.Hide;
if TextForm.N4.Checked=True then FileListForm.show
else FileListForm.Hide;
if TextForm.N2.Checked=True then TextViewForm.show
else TextViewForm.Hide;
end;

procedure TNetForm.FormClose(Sender: TObject; var Action: TCloseAction);
begin
NetForm.Hide;
TextForm.show;
if TextForm.N3.Checked=True then ChartForm.show
else ChartForm.Hide;
if TextForm.N6.Checked=True then ImageViewForm.show
else ImageViewForm.Hide;
if TextForm.N4.Checked=True then FileListForm.show
else FileListForm.Hide;
if TextForm.N2.Checked=True then TextViewForm.show
else TextViewForm.Hide;
end;

end.

⌨️ 快捷键说明

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