您的位置:首页 > 编程语言 > ASP

再看 AspriseOCR - OCR应用开发

2015-11-24 11:35 459 查看
我写这个博文时间为 2015/11/24日,注意时间因为,网上很多文章时间上很久远,有的已经不能参考了

很多人面对从图片中识别文字或者数字0~9 A~Z 的时候都想网上查找相关的技术文章

我也找了很多,但是很可惜没有找到多少有价值的信息

大部分的信息都很老旧而且有关 AspriseOCR 的不少

尤其关于DELPHI + AspriseOCR 的更少

我从网上找到了 AspriseOCR 破解的文件 , 并且已经打包在我的上传资料上,你们可以去下载 AspriseOCR
- Crake.zip

我的开发环境 为 DELPHI7 +WIN8 64 位

这个应用有几点要注意

1. 识别的图片只能为 白底黑字 ,其他类型的图片不能正确

2. AspriseOCR.dll ,DevIL.dll ,ILU.dll

三个文件放在和你开发的APP同样的目录下

3. 调用DLL 函数定义为

//function OCR(imgname:string;imagetype:integer):PChar;stdcall;

// external 'AspriseOCR.dll';

function OCR(imgname:PChar;i:integer):PChar;stdcall;external 'AspriseOCR.dll';

function OCRBarCodes(imgname:string;imagetype:integer):PChar;stdcall;

external 'AspriseOCR.dll';

Function OCRpart(filename :String; imagetype:Integer; startX :Integer;

startY :Integer; width:Integer; height:Integer):PChar;stdcall;

external 'AspriseOCR.dll';

请看上面第一个函数的定义 OCR 的参数imagname String 或者 Pchar 哪个正确?

我可以告诉你们 都是可以编译通过的 而且 两种定义都是对的

所以很多事情需要自己验证

-----------------------

截图识别的 图片处理

//我的图列


//图片的2值化 - 网上大部分人的做法

function TFrmMain.CBmpTwoValues(Bmp:TBitmap;grayThreshold:Byte):TBitmap;

var

p: PByteArray;

Gray, x, y: Integer;

aBmp: TBitmap;

begin

aBmp:=TBitmap.Create;

//aBmp.Assign(Image1.Picture.Bitmap);

aBmp:=Bmp;

//设置为24位真彩色

aBmp.PixelFormat := pf24Bit;

randomize;

for y := 0 to aBmp.Height - 1 do

begin

p := aBmp.scanline[y];

for x := 0 to aBmp.Width - 1 do

begin

//一个象素点三个字节

// Y = 0.299 * R + 0.587 * G + 0.114 * B

Gray := Round(p[x * 3 + 2] * 0.3 + p[x * 3 + 1] * 0.59 +

p[x * 3] * 0.11);

if gray > grayThreshold then //全局阀值128

begin

p[x * 3] := 255;

p[x * 3 + 1] := 255;

p[x * 3 + 2] := 255;

end

else

begin

p[x * 3] := 0;

p[x * 3 + 1] := 0;

p[x * 3 + 2] := 0;

end;

end;

end;

//Image2.Picture.Bitmap.Assign(Bmp);

Result:=aBmp;

end;

//图片的2值化 - 我自己的做法(针对我的特定图片的)

function TFrmMain.CBmpBlackWhiteExe(aBmp: TBitmap;aMainColor:TColor;aMainTorl:Byte): TBitmap;

var

bm:TBitmap;

bx,by:Integer;

aColor:TColor;

aClr,aClg,aClb:Byte;

aChageColorEn:Boolean;

begin

bm:=TBitmap.Create;

bm:=aBmp;

for bx := 0 to bm.Width-1 do

begin

for by := 0 to bm.Height-1 do

begin

//clBlue = TColor($FF0000); clBlack = TColor($000000);

//clRed = TColor($0000FF);clWhite = TColor($FFFFFF);

//clLime = TColor($00FF00);

aColor:=bm.Canvas.Pixels[bx,by];

aChageColorEn:=False;

aClb:=Abs( Byte(aColor shr 16)- Byte(aMainColor shr 16));

if aClb<=aMainTorl then

begin

// Blue ok

aClg:=Abs( Byte(aColor shr 8)-Byte(aMainColor shr 8));

if aClg <= aMainTorl then

begin

//Green OK

aClr:=Abs( Byte(aColor)-Byte(aMainColor));

if aClr <= aMainTorl then

begin

//Red ok

aChageColorEn:=True;

end;

end;

end;

if aChageColorEn then

begin

bm.Canvas.Pixels[bx,by]:=TColor($FFFFFF); //White

end

else

begin

bm.Canvas.Pixels[bx,by]:=TColor($000000); //Black

end;

end;

end;

Result:=bm;

end;

//图片反色

procedure TFrmMain.Negative(var Bmp:TBitmap);

var

i, j: Integer;

PRGB: pRGBTriple;

begin

Bmp.PixelFormat:=pf24Bit;

for i := 0 to Bmp.Height - 1 do

begin

PRGB := Bmp.ScanLine[i];

for j := 0 to Bmp.Width - 1 do

begin

PRGB^.rgbtRed :=not PRGB^.rgbtRed ;

PRGB^.rgbtGreen :=not PRGB^.rgbtGreen;

PRGB^.rgbtBlue :=not PRGB^.rgbtBlue;

Inc(PRGB);

end;

end;

end;

以上只做大家的参考

写的不好 别喷我啊
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: