程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> Delphi >> 再看 AspriseOCR,AspriseOCR

再看 AspriseOCR,AspriseOCR

編輯:Delphi

再看 AspriseOCR,AspriseOCR


再看 AspriseOCR - OCR應用開發

我寫這個博文時間為 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
        bm.Canvas.Pixels[bx,by]:=TColor($FFFFFF);   //White
      else
        bm.Canvas.Pixels[bx,by]:=TColor($000000);  //Black
    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;

以上只做大家的參考   

寫的不好  別噴我啊

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved