识别图片内的文字(提供一些资料或有偿支持)
图片上如,图片是A4单据的扫描件,扫描的时候有的会倾斜一点,识别图片的发货单号
请各位大牛提供一点学习资料或开发(可以提供点费用)
[解决办法]
这种的很好处理。没有粘连、变形、干扰,简单二值化、滤波即可,调整一下倾斜,可以做到100%识别
[解决办法]
图片不算太清楚,可能对算法要求比较高。1楼的见到图还能说“没有粘连、变形、干扰,”太佩服了。
[解决办法]
图像处理算法。。。有得楼主学了
而且楼主的图片不是很清楚,100%识别困难
[解决办法]
找的例子 你看看
- Delphi(Pascal) code
unit Unit1;interfaceuses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls, ExtDlgs, ComCtrls, ShellAPI, GIFImage, JPEG;type //字符特征码 RChar = record MyChar: char; MyCharInfo: array[0..49, 0..49] of byte; end;type //字符特征文件 RCharInfo = record Sng: integer; //文件类型标识 Ver: real; //版本号 charwidth: byte; //字符宽度 charheight: byte; //字符高度 X0: byte; //第一个字符开始x偏移 TotalChars: byte; //图象字符总数 allcharinfo: array[0..9] of RChar; end;type TForm1 = class(TForm) Image1: TImage; Button1: TButton; Edit1: TEdit; Edit2: TEdit; Label1: TLabel; Label2: TLabel; Label3: TLabel; Button2: TButton; Image2: TImage; Edit3: TEdit; Edit4: TEdit; Image3: TImage; Edit5: TEdit; Edit6: TEdit; Image4: TImage; Edit7: TEdit; Edit8: TEdit; Image5: TImage; Edit9: TEdit; Edit10: TEdit; Image6: TImage; Edit11: TEdit; Edit12: TEdit; Image7: TImage; Edit13: TEdit; Edit14: TEdit; Label4: TLabel; Label5: TLabel; Label6: TLabel; Image8: TImage; Edit15: TEdit; Edit16: TEdit; Image9: TImage; Edit17: TEdit; Edit18: TEdit; Image10: TImage; Edit19: TEdit; Edit20: TEdit; Image11: TImage; Edit21: TEdit; Edit22: TEdit; Image12: TImage; Edit23: TEdit; Edit24: TEdit; Image13: TImage; Edit25: TEdit; Edit26: TEdit; Label7: TLabel; Label8: TLabel; Label9: TLabel; Image14: TImage; Edit27: TEdit; Edit28: TEdit; Image15: TImage; Edit29: TEdit; Edit30: TEdit; Image16: TImage; Edit31: TEdit; Edit32: TEdit; Image17: TImage; Edit33: TEdit; Edit34: TEdit; Image18: TImage; Edit35: TEdit; Edit36: TEdit; Button3: TButton; Button4: TButton; Edit37: TEdit; Image19: TImage; Label10: TLabel; Label11: TLabel; Button5: TButton; Image20: TImage; SaveDialog1: TSaveDialog; OpenDialog1: TOpenDialog; Button6: TButton; ProgressBar1: TProgressBar; GroupBox1: TGroupBox; RadioButton1: TRadioButton; RadioButton2: TRadioButton; Label12: TLabel; Label13: TLabel; Edit38: TEdit; Edit39: TEdit; procedure FormCreate(Sender: TObject); procedure Button1Click(Sender: TObject); procedure Button3Click(Sender: TObject); procedure Button2Click(Sender: TObject); procedure Button4Click(Sender: TObject); procedure Button6Click(Sender: TObject); procedure Button5Click(Sender: TObject); private { Private declarations } MyCharInfo: RCharInfo; pic: array[0..17] of Timage; exepath: string; procedure ModiFyInfo(MyCanvas: TCanvas; MyChar: char; X0, CharWidth, CharHeight: integer); procedure ShowAllCharInfo; procedure GetCharInfoFromImage(MyCanvas: TCanvas; CharInfo: string); function GetStringFromImage(SBMP: TBITMAP): string; function CMPBMP(SBMP: TBITMAP; x0, m: integer): integer; procedure InteCharInfo(Charwidth, X0: integer); function Makehtm(CharWidth, X0: string): string; procedure GetCharInfoFromALLImage; function PIC2BMP(filename: string): TBITMAP; public { Public declarations } end;var Form1: TForm1;implementation{$R *.dfm}//根据不同情况初始化特征码信息procedure TForm1.InteCharInfo(Charwidth, X0: integer);begin Fillchar(MycharInfo, sizeof(RcharInfo), 1); MycharInfo.Sng := 751115327; MycharInfo.Ver := 1.1; MycharInfo.TotalChars := length(edit1.text); MycharInfo.charwidth := charwidth; MycharInfo.charheight := image1.Picture.Bitmap.Height; MycharInfo.X0 := X0;end;//procedure TForm1.FormCreate(Sender: TObject);begin exepath := ExtractFilePath(Application.ExeName); InteCharInfo(9, 1); Pic[0] := image1; Pic[1] := image2; Pic[2] := image3; Pic[3] := image4; Pic[4] := image5; Pic[5] := image6; Pic[6] := image7; Pic[7] := image8; Pic[8] := image9; Pic[9] := image10; Pic[10] := image11; Pic[11] := image12; Pic[12] := image13; Pic[13] := image14; Pic[14] := image15; Pic[15] := image16; Pic[16] := image17; Pic[17] := image18;end;//修正指定字符特征码procedure TForm1.ModiFyInfo(MyCanvas: TCanvas; MyChar: char; X0, CharWidth, CharHeight: integer);var i, j: integer;begin for i := 0 to CharWidth do for j := 0 to CharHeight do if MyCanvas.Pixels[X0 + i, j] > 0 then begin MyCharInfo.allcharinfo[strtoint(Mychar)].MyChar := Mychar; MyCharInfo.allcharinfo[strtoint(Mychar)].MyCharInfo[i, j] := 0; end;end;//根据学习后的字符特征码显示所有字符procedure TForm1.ShowAllCharInfo;var BMP: TBITMAP; i, j, k: integer;begin BMP := TBITMAP.Create; BMP.Width := (MyCharInfo.charwidth + 5) * 10 - 5; BMP.Height := MyCharInfo.charheight; BMP.Canvas.Brush.Color := clMoneygreen; BMP.Canvas.FloodFill(1, 1, clblack, fsBorder); for k := 0 to 9 do for i := 0 to MyCharInfo.charwidth do for j := 0 to MyCharInfo.charheight do if MyCharInfo.allcharinfo[K].MyCharInfo[i, j] > 0 then BMP.Canvas.Pixels[i + k * (MyCharInfo.charwidth + 5), j] := clblack; Image20.Picture.Bitmap.Assign(BMP); BMP.Free;end;
[解决办法]
继续..
- Delphi(Pascal) code
//学习一个附加码的所有字符procedure TForm1.GetCharInfoFromImage(MyCanvas: TCanvas; CharInfo: string);var i: integer; x: integer;begin for i := 1 to MycharInfo.TotalChars do begin x := MycharInfo.X0 + MycharInfo.charwidth * (i - 1); ModiFyInfo(MyCanvas, CharInfo[i], x, MycharInfo.charwidth, MycharInfo.charheight); end;end;//学习所有图片共18个procedure TForm1.GetCharInfoFromALLImage;begin GetCharInfoFromImage(image1.Picture.Bitmap.Canvas, edit1.text); GetCharInfoFromImage(image2.Picture.Bitmap.Canvas, edit3.text); GetCharInfoFromImage(image3.Picture.Bitmap.Canvas, edit5.text); GetCharInfoFromImage(image4.Picture.Bitmap.Canvas, edit7.text); GetCharInfoFromImage(image5.Picture.Bitmap.Canvas, edit9.text); GetCharInfoFromImage(image6.Picture.Bitmap.Canvas, edit11.text); GetCharInfoFromImage(image7.Picture.Bitmap.Canvas, edit13.text); GetCharInfoFromImage(image8.Picture.Bitmap.Canvas, edit15.text); GetCharInfoFromImage(image9.Picture.Bitmap.Canvas, edit17.text); GetCharInfoFromImage(image10.Picture.Bitmap.Canvas, edit19.text); GetCharInfoFromImage(image11.Picture.Bitmap.Canvas, edit21.text); GetCharInfoFromImage(image12.Picture.Bitmap.Canvas, edit23.text); GetCharInfoFromImage(image13.Picture.Bitmap.Canvas, edit25.text); GetCharInfoFromImage(image14.Picture.Bitmap.Canvas, edit27.text); GetCharInfoFromImage(image15.Picture.Bitmap.Canvas, edit29.text); GetCharInfoFromImage(image16.Picture.Bitmap.Canvas, edit31.text); GetCharInfoFromImage(image17.Picture.Bitmap.Canvas, edit33.text); GetCharInfoFromImage(image18.Picture.Bitmap.Canvas, edit35.text); ShowAllCharInfo;end;//根据设定选择不同的学习模式procedure TForm1.Button1Click(Sender: TObject);var Begincharwidth, Endcharwidth, charwidth, beginX0, endX0, X0: integer; htm: Tstrings;begin if radiobutton1.Checked then begin Begincharwidth := round(image1.Picture.Bitmap.Width / MycharInfo.TotalChars); Begincharwidth := round(Begincharwidth / 2); Endcharwidth := 2 * Begincharwidth; BeginX0 := 0; endX0 := MycharInfo.charwidth + 1; end else begin try BeginX0 := strtoint(edit38.Text); endX0 := BeginX0; Begincharwidth := strtoint(edit39.Text); Endcharwidth := strtoint(edit39.Text); except showmessage('请输入数值型字符'); exit; end; end; htm := TstringList.Create; htm.Add('<table>' + #13#10); ProgressBar1.Min := 0; ProgressBar1.Max := (endX0 - BeginX0 + 1) * (Endcharwidth - Begincharwidth + 1); ProgressBar1.Position := 0; ProgressBar1.Step := 1; for charwidth := Begincharwidth to Endcharwidth do for X0 := BeginX0 to endX0 do begin ProgressBar1.StepIt; if X0 + charWidth * MycharInfo.TotalChars > image1.Picture.Bitmap.Width then continue; InteCharInfo(charwidth, X0); GetCharInfoFromAllImage; htm.Text := htm.Text + MakeHtm(inttostr(charwidth), inttostr(X0)); end; htm.Add('</table>' + #13#10); htm.SaveToFile(exepath + 'temp\test.htm'); htm.Free; if radiobutton1.Checked then shellexecute(handle, 'open', Pchar(exepath + 'temp\test.htm'), nil, nil, SW_SHOWMAXIMIZED);end;function TForm1.Makehtm(CharWidth, X0: string): string;begin image20.Picture.SaveToFile(exepath + 'temp\' + X0 + '-' + CharWidth + '.BMP'); result := '<tr>' + #13#10; result := result + '<td>偏移:' + X0 + '</td>' + #13#10; result := result + '<td>字宽:' + CharWidth + '</td>' + #13#10; result := result + '<td><img src="' + X0 + '-' + CharWidth + '.BMP"></td>' + #13#10; result := result + '</tr>' + #13#10;end;//比较图片上X0开始的字符是否是指定字符Mfunction TForm1.CMPBMP(SBMP: TBITMAP; x0, m: integer): integer;var i, j: integer;begin result := 0; for i := 0 to MycharInfo.charwidth - 1 do for j := 0 to MycharInfo.charHeight - 1 do if (SBMP.Canvas.Pixels[x0 + i, j] > 0) and (MycharInfo.allcharinfo[m].MyCharInfo[i, j] = 1) then result := result + 1;end;//从图片中识别字串function TForm1.GetStringFromImage(SBMP: TBITMAP): string;var k, m: integer; x: integer;begin result := ''; for k := 0 to MycharInfo.TotalChars - 1 do begin x := MycharInfo.X0 + MyCharInfo.charwidth * k; for m := 9 downto 0 do begin if CMPBMP(SBMP, x, m) = 0 then begin result := result + inttostr(m); break; end; if m = 0 then result := result + '?'; end; end;end;//识别外部图片procedure TForm1.Button3Click(Sender: TObject);begin if OpenDialog1.Execute then begin Image19.Picture.Bitmap := PIC2BMP(OpenDialog1.FileName); edit37.Text := GetStringFromImage(Image19.Picture.Bitmap); end;end;//识别学习图片procedure TForm1.Button2Click(Sender: TObject);begin edit2.Text := GetStringFromImage(Image1.Picture.Bitmap); edit4.Text := GetStringFromImage(Image2.Picture.Bitmap); edit6.Text := GetStringFromImage(Image3.Picture.Bitmap); edit8.Text := GetStringFromImage(Image4.Picture.Bitmap); edit10.Text := GetStringFromImage(Image5.Picture.Bitmap); edit12.Text := GetStringFromImage(Image6.Picture.Bitmap); edit14.Text := GetStringFromImage(Image7.Picture.Bitmap); edit16.Text := GetStringFromImage(Image8.Picture.Bitmap); edit18.Text := GetStringFromImage(Image9.Picture.Bitmap); edit20.Text := GetStringFromImage(Image10.Picture.Bitmap); edit22.Text := GetStringFromImage(Image11.Picture.Bitmap); edit24.Text := GetStringFromImage(Image12.Picture.Bitmap); edit26.Text := GetStringFromImage(Image13.Picture.Bitmap); edit28.Text := GetStringFromImage(Image14.Picture.Bitmap); edit30.Text := GetStringFromImage(Image15.Picture.Bitmap); edit32.Text := GetStringFromImage(Image16.Picture.Bitmap); edit34.Text := GetStringFromImage(Image17.Picture.Bitmap); edit36.Text := GetStringFromImage(Image18.Picture.Bitmap);end;//输出特征码结构procedure TForm1.Button4Click(Sender: TObject);var P: file of RCharInfo;begin if savedialog1.Execute then begin Assignfile(P, savedialog1.FileName); rewrite(P); write(p, MycharInfo); CloseFile(P); end;end;//导入特征码结构procedure TForm1.Button6Click(Sender: TObject);var P: file of RCharInfo;begin if Opendialog1.Execute then begin Assignfile(P, Opendialog1.FileName); reset(P); read(p, MycharInfo); CloseFile(P); ShowAllCharInfo; end;end;//导入学习图片procedure TForm1.Button5Click(Sender: TObject);var i: integer;begin if OpenDialog1.Execute then begin for i := 0 to OpenDialog1.Files.Count - 1 do begin Pic[i].Picture.Bitmap := PIC2BMP(OpenDialog1.Files.Strings[i]); if i = 17 then Break; end; end;end;function TForm1.PIC2BMP(filename: string): TBITMAP;var GIF: TGIFImage; jpg: TJPEGImage; BMP: TBITMAP; FileEx: string; i, j: integer;begin FileEx := UpperCase(ExtractFileExt(filename)); BMP := TBITMAP.Create; if FileEx = '.BMP' then BMP.LoadFromFile(filename) else if FileEx = '.GIF' then begin GIF := TGIFImage.Create; GIF.LoadFromFile(filename); BMP.Assign(GIF); GIF.Free; end else if (FileEx = '.JPG') or (FileEx = '.JPEG') then begin JPG := TJPEGImage.Create; JPG.LoadFromFile(filename); JPG.Grayscale := TRUE; BMP.Assign(JPG); JPG.Free; end; for i := 0 to BMP.Width - 1 do for j := 0 to BMP.Height - 1 do begin if BMP.Canvas.Pixels[i, j] > $7FFFFF then BMP.Canvas.Pixels[i, j] := clwhite else BMP.Canvas.Pixels[i, j] := clblack; end; result := BMP;end;end.