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

📄 main.~pas

📁 模板匹配之手写数字识别系统,基于DELPHI 7.0
💻 ~PAS
📖 第 1 页 / 共 3 页
字号:
unit main;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, EightArrayFeature, CharFeatureValue, FeatureManage, StdCtrls, ExtDlgs,
  ImgList, ComCtrls, ToolWin, Menus, Mask,comobj,activex;
  var
  Pattern:array [0..9] of NumCharPattern;
  pathstring:string;
  l:integer=0 ;
  EightCode: TDoubleEightArray;
type
  TRecogForm = class(TForm)
    MouseUpTimer: TTimer;
    Panel1: TPanel;
    StretchImage: TImage;
    InputNumberLabel: TLabel;
    FeatureImage: TImage;
    FeatureImageLabel: TLabel;
    Label2: TLabel;
    NumberInputOpenPictureDialog: TOpenPictureDialog;
    MainMenu1: TMainMenu;
    SaveDialog1: TSaveDialog;
    ToolBar1: TToolBar;
    ToolButton1: TToolButton;
    ToolButton2: TToolButton;
    ToolButton3: TToolButton;
    ImageList1: TImageList;
    ToolButton4: TToolButton;
    Button1: TButton;
    Button2: TButton;
    NumberIndexEdit: TEdit;
    Panel2: TPanel;
    Panel3: TPanel;
    Panel4: TPanel;
    Panel5: TPanel;
    Panel6: TPanel;
    Panel7: TPanel;
    Panel8: TPanel;
    Panel9: TPanel;
    Panel10: TPanel;
    Panel11: TPanel;
    PatternDisplayImage1: TImage;
    PatternDisplayImage2: TImage;
    PatternDisplayImage3: TImage;
    PatternDisplayImage4: TImage;
    PatternDisplayImage5: TImage;
    PatternDisplayImage6: TImage;
    PatternDisplayImage7: TImage;
    PatternDisplayImage8: TImage;
    PatternDisplayImage9: TImage;
    PatternDisplayImage10: TImage;
    CheckBox1: TCheckBox;
    CheckBox2: TCheckBox;
    CheckBox3: TCheckBox;
    CheckBox4: TCheckBox;
    CheckBox5: TCheckBox;
    CheckBox6: TCheckBox;
    CheckBox7: TCheckBox;
    CheckBox8: TCheckBox;
    CheckBox9: TCheckBox;
    CheckBox10: TCheckBox;
    N5: TMenuItem;
    N6: TMenuItem;
    N7: TMenuItem;
    N8: TMenuItem;
    NumberEdit: TEdit;
    Label1: TLabel;
    OpenDialog1: TOpenDialog;
    SaveCurrentPatternButton: TButton;
    help: TMenuItem;
    FileMenuItem: TMenuItem;
    StudyToolButton: TToolButton;
    GroupBox1: TGroupBox;
    NumberIndexLabel: TLabel;
    GroupBox2: TGroupBox;
    RecogToolButton: TToolButton;
    GroupBox3: TGroupBox;
    ToolButton7: TToolButton;
    ToolButton8: TToolButton;
    ToolButton9: TToolButton;
    N9: TMenuItem;
    N10: TMenuItem;
    now1: TMenuItem;
    All1: TMenuItem;
    N11: TMenuItem;
    SaveAllPatternToolButton: TToolButton;
    S1: TMenuItem;
    L1: TMenuItem;
    R1: TMenuItem;
    Button3: TButton;
    GroupBox4: TGroupBox;
    Label3: TLabel;
    Label4: TLabel;
    Edit1: TEdit;
    NumberResultEdit: TEdit;
    NumberIndexResultEdit: TEdit;
    NumberLabel: TLabel;
    ToWordCheckBox: TCheckBox;
    Label5: TLabel;
    StartIndexDisplayEdit: TEdit;
    ReplaceButton: TButton;
    IndexDisplayEdit2: TEdit;
    IndexDisplayEdit6: TEdit;
    IndexDisplayEdit7: TEdit;
    IndexDisplayEdit1: TEdit;
    IndexDisplayEdit3: TEdit;
    IndexDisplayEdit4: TEdit;
    IndexDisplayEdit5: TEdit;
    IndexDisplayEdit8: TEdit;
    IndexDisplayEdit9: TEdit;
    IndexDisplayEdit10: TEdit;
    IndexDisplayButton: TButton;
    procedure StretchImageMouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure StretchImageMouseUp(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure FormCreate(Sender: TObject);
    procedure StretchImageMouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    procedure MouseUpTimerTimer(Sender: TObject);  //  对用户输入的数字进行识别
    procedure FormDestroy(Sender: TObject);
    procedure chuangNum(x:Integer);
    procedure  setmap( eight: TDoubleEightArray);
    procedure showeight(eightmap: TDoubleEightArray);
    procedure GetFeatureAndRecog(Sender: TObject);
    procedure ToolButton2Click(Sender: TObject);
    procedure ToolButton1Click(Sender: TObject);
    procedure ToolButton4Click(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure ButtonClick(Sender: TObject);
    procedure CheckBox5Click(Sender: TObject);
    procedure CheckBox2Click(Sender: TObject);
    procedure CheckBox4Click(Sender: TObject);
    procedure CheckBox3Click(Sender: TObject);
    procedure CheckBox10Click(Sender: TObject);
    procedure CheckBox9Click(Sender: TObject);
    procedure CheckBox8Click(Sender: TObject);
    procedure CheckBox7Click(Sender: TObject);
    procedure CheckBox6Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);
    procedure SaveAllPatternButtonClick(Sender: TObject);
    procedure SaveCurrentPatternButtonClick(Sender: TObject);
    procedure N2Click(Sender: TObject);
    procedure N3Click(Sender: TObject);
    procedure StudyToolButtonClick(Sender: TObject);
    procedure RecogToolButtonClick(Sender: TObject);
    procedure now1Click(Sender: TObject);
    procedure ToolButton3Click(Sender: TObject);
    procedure SaveAllPatternToolButtonClick(Sender: TObject);
    procedure L1Click(Sender: TObject);
    procedure R1Click(Sender: TObject);
    procedure N6Click(Sender: TObject);
    procedure N7Click(Sender: TObject);
    procedure N8Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure N11Click(Sender: TObject);
    procedure IndexDisplayButtonClick(Sender: TObject);
    procedure ReplaceButtonClick(Sender: TObject);
    procedure CheckBox1Click(Sender: TObject);

  private
    { Private declarations }
    drow:   boolean;        //  判断鼠标是否处于写字状态
    eight: array[1..8, 1..8] of TLabel;
    function Get_Most_LRTB: Trect;
  public
    writetype:boolean;
    function GetSubStr(var aString:String;SepChar:String):String;
    function GetSubStrNum(aString:String;SepChar:String):integer;
    { Public declarations }
  end;
var
  RecogForm: TRecogForm;
  EightArrayFeature:TEightArrayFeature;
  //analysepic: Tanalysepic;
  ImageInputStyle:Boolean;
  RecogOrStudy:Integer;
  FWord,FDoc: Variant;
  ClassID:TGUID;
  Unknown:IUnknown;
  result: idispatch;
implementation

uses about;
{$R *.dfm}

procedure TRecogForm.StretchImageMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
   if  ImageInputStyle=false then
  begin
      //  鼠标按下,处于写字状态
      drow := true;
      StretchImage.Canvas.MoveTo(x, y);
      MouseUpTimer.Enabled := false;
  end;
end;

procedure TRecogForm.StretchImageMouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
   if  ImageInputStyle=false then
  begin
    //  鼠标抬起,写字完成,并打开计时器,准备识别
    drow := false;
    MouseUpTimer.Enabled := true;
  end;
 end;

procedure TRecogForm.MouseUpTimerTimer(Sender:Tobject);    ///定时的可以不要
Var Wordstr:string;
begin
    GetFeatureAndRecog(Sender);
    if RecogOrStudy=0 then //系统为数字识别状态
    begin //将输入图像进行特征比较和分类
    FeatureManage.TFeature.FeatureCompare();
   if ToWordCheckBox.Checked=True then
     begin //将识别的字符输入到Word开关打开
     Classid:=ProgIdToClassid('Word.Application');
     //如Word已启动,获得Word服务器对象
    IF Succeeded(GetActiveobject(classid,nil,unknown))
    then FWord:=GetActiveOleObject('Word.Application')
  else //如无Word已启动,就启动Word
      begin
      FWord:=CreateOleObject('Word.Application');
      FWord.visible:= True;//显示Word窗口
      FDoc:= FWord.Documents.Add;//打开一个Word新文件
      end;
  try //在已打开的Word文件中加入一行识别结果
     Wordstr:=RecogForm.NumberResultEdit.Text;
     FWord.Selection.TypeText(Text :=WordStr);//插入识别数字
     FWord.Selection.TypeParagraph;//每一识别结果分行显示
except
     on e: Exception do
  ShowMessage(e.Message);
         end;
     end;
  end;
end;
////////////////////////////////////////////////
procedure TRecogForm.FormCreate(Sender: TObject);
 var
    i, j: integer;
begin
    RecogOrStudy:=1;//RecogOrStudy=0识别状态 ,RecogOrStudy=1学习状态
    drow := false;
    self.DoubleBuffered := true;
    ImageInputStyle:=false;
    FeatureManage.TFeature.Openfile();  //打开模板库文件
//显示8*8特征块图像
 for i := 1 to 8 do
    for j := 1 to 8 do
      begin
       eight[i][j] := TLabel.Create(self);
       eight[i][j].Parent  := self;
       eight[i][j].Width   := 20;
       eight[i][j].Height  := 20;
       eight[i][j].Left    := (i - 1) * 20 + 200;
       eight[i][j].Top     := j * 20 + 420;
       eight[i][j].Color   := clRed;
      end;
end;
procedure TRecogForm.chuangNum(x:Integer);
begin
NumberEdit.Text:= inttostr(x);
end;
procedure TRecogForm.StretchImageMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);

begin

   if  ImageInputStyle=false then
  begin
    //  鼠标移动,用画直线的方法画随着鼠标画出数字
    if drow then
    begin
        StretchImage.Canvas.Pen.Width := 6;
        StretchImage.Canvas.LineTo(x, y);
    end; 
  end;   
end;

////////////////////////////////////////////////////////////////
function TRecogForm.Get_Most_LRTB: TRect;
var //得到图片上的最左、最右、最上、最下的点
    i, j:  integer;
    label FindMostRight, FindMostTop,FindMostBottom, FindInMiddle;
begin
//FindMostLeft:  获得最左边的点
    for i := 1 to StretchImage.Width - 1 do
        for j := 1 to StretchImage.Height - 1 do
            if StretchImage.Canvas.Pixels[i, j] <> clWhite then
            begin
                Result.Left := i;
        goto        FindMostRight;
            end;
FindMostRight:  //获得最右边的点
    for i := StretchImage.Width - 1 downto 1 do
        for j := 1 to StretchImage.Height - 1 do
            if StretchImage.Canvas.Pixels[i, j] <> clWhite then
            begin
          Result.Right := i;goto FindMostTop;
            end;
FindMostTop:   // 获得最上面的点
    for j := 1 to StretchImage.Height - 1 do
        for i := 1 to StretchImage.Width - 1 do
            if StretchImage.Canvas.Pixels[i, j] <> clWhite then
            begin
         Result.Top := j;goto FindMostBottom;
            end;
FindMostBottom: //获得最下面的点
    for j := StretchImage.Height - 1 downto 1 do
        for i := 1 to StretchImage.Width - 1 do
            if StretchImage.Canvas.Pixels[i, j] <> clWhite then
            begin
         Result.Bottom := j;goto FindInMiddle;
            end;
FindInMiddle:
    i := Result.Right - Result.Left;//得到区域宽度
    j := Result.Bottom - Result.Top;//得到区域高度
    i := i mod 8;  i := i div 2;
    if i > 0 then  //将边缘对称于矩形的左右部分
    begin
        Dec(Result.Left, i); Inc(Result.Right, i);
    end;
    j := j mod 8; j := j div 2;
    if j > 0 then //将边缘对称于矩形的上下部分
    begin
        Dec(Result.Top, i);Inc(Result.Bottom, j);
    end;
    //对左右部分过小的图片进行加宽处理
    i := Result.Right - Result.Left;
    if i < 80 then//细长的黑色的字最小宽为80
    begin
        i := (80 - i) div 2;
        Dec(Result.Left, i); Inc(Result.Right, i);
    end;
end;
/////////////////////////////////////////
procedure TRecogForm.GetFeatureAndRecog(Sender: TObject);
var
    rect_s, rect_d: TRect;
    SaveImage:    Tbitmap;
    Eight:  TDoubleEightArray;
    x,i:  integer;
begin
    SaveImage := Tbitmap.Create;
    MouseUpTimer.Enabled := False;
    //  取得数字图片的位置 rest_d;
    Rect_s := Get_Most_LRTB;
    Rect_d.Top  := 0;
    Rect_d.Left := 0;
    Rect_d.Right := rect_s.Right - rect_s.Left;
    Rect_d.Bottom:= rect_s.Bottom - rect_s.Top;

⌨️ 快捷键说明

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