Android調用OCR識別圖像中的文字

jopen 9年前發布 | 4K 次閱讀 Java Android

  // CharacterExtractor.java
    // Copyright (c) 2010 William Whitney
    // All rights reserved.
    // This software is released under the BSD license.
    // Please see the accompanying LICENSE.txt for details.
    package srtp.ys.ocrtest;
    import java.util.logging.Level;
    import java.util.logging.Logger;
    import android.graphics.Bitmap;
    import android.graphics.BitmapFactory;
    import android.graphics.Canvas;
    import android.graphics.Color;
    import android.graphics.ColorMatrix;
    import android.graphics.ColorMatrixColorFilter;
    import android.graphics.Paint;
    import android.graphics.Matrix;
    import android.graphics.Bitmap.Config;
    import android.graphics.drawable.BitmapDrawable;
    import android.util.Log;
    import android.widget.ImageView;
    import android.app.*;
    import android.app.Activity;
    import android.os.Bundle;
    import android.view.View;
    /**

* Saves all the characters in an image to an output directory individually.
* @author William Whitney
*/
public class CharacterExtractor extends DocumentScannerListenerAdaptor
{
    private DocumentScanner documentScanner = new DocumentScanner();
    private int std_width;
    private int std_height;
////////////////////////////////////////////////////////////////////
    public void slice(  int std_width, int std_height)
    {
        try
        {
            this.std_width = std_width;
            this.std_height = std_height;
            Bitmap img = BitmapFactory.decodeFile("/sdcard/test.bmp");
            PixelImage pixelImage = new PixelImage(img);
            pixelImage.toGrayScale(true); //OK
            pixelImage.filter(); // OK
            documentScanner.scan(pixelImage, this, 0, 0, pixelImage.width, pixelImage.height);
        }
        catch (Exception ex)
        {
            Logger.getLogger(CharacterExtractor.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
////////////////////////////////////////////////////////////////////
    public static Bitmap zoomBitmap(Bitmap bitmap, int w, int h) {
        int width = bitmap.getWidth();
        int height = bitmap.getHeight();
        Matrix matrix = new Matrix();
        float scaleWidth ;
        float scaleHeight;
        //float scaleWidth = ((float) w / width);
      if(height>width)  {
         scaleWidth = ((float) h / height);
         scaleHeight = ((float) h / height);
        }
      else
      {
                scaleWidth = ((float) w / width);
            scaleHeight = ((float) w / width);
      }
        matrix.postScale(scaleWidth, scaleHeight);
        Bitmap newBmp = Bitmap.createBitmap(bitmap, 0, 0, width, height,
                matrix, true);
        //加上30*30白色背景
        Bitmap mbmpTest = Bitmap.createBitmap(30,30, Config.RGB_565);
        Canvas canvasTemp = new Canvas(mbmpTest);//給Canvas指定一個bitmap,之后就不是畫到屏幕而是畫到這個bitmap上
        canvasTemp.drawColor(Color.WHITE);
        Paint mPaint = new Paint();
        mPaint.setColor(Color.WHITE);
        canvasTemp.drawBitmap(newBmp,(((float)(30-newBmp.getWidth()))/2),(((float)(30-newBmp.getHeight()))/2),mPaint);//畫到正中間
       return mbmpTest;
    }
    public static Bitmap rgbtoGrayscale(Bitmap bmpOriginal) {
                    int width, height;
                    height = bmpOriginal.getHeight();
                    width = bmpOriginal.getWidth();
                   Bitmap bmpGrayscale = Bitmap.createBitmap(width, height, Bitmap.Config.RGB_565);
                   Canvas c = new Canvas(bmpGrayscale);
                   Paint paint = new Paint();
                    ColorMatrix cm = new ColorMatrix();
                    cm.setSaturation(0);
                   ColorMatrixColorFilter f = new ColorMatrixColorFilter(cm);
                  paint.setColorFilter(f);
                    c.drawBitmap(bmpOriginal, 0, 0, paint);
                    return bmpGrayscale;
                }
    public void processChar(int x1, int y1, int x2, int y2, int rowY1, int rowY2)
    {
        try
        {
            int areaW = x2 - x1;
            int areaH = y2 - y1;
            //Extract the character
            Bitmap fatherimage =  BitmapFactory.decodeFile("/sdcard/test.bmp");
           // Drawable characterImage=new BitmapDrawable(BitmapFactory.decodeFile("/sdcard/test.jpg"));
            Bitmap bitmapcharacterImage = Bitmap.createBitmap(fatherimage,x1, y1, areaW, areaH);
            Log.v("w","w:"+bitmapcharacterImage.getWidth()+"H:"+bitmapcharacterImage.getHeight());
           Bitmap characterImage=zoomBitmap(bitmapcharacterImage,std_width,std_height);//縮放并添上背景
           // 顯示位圖
           BitmapDrawable bmpDraw=new BitmapDrawable(rgbtoGrayscale(characterImage));
          mainactivity.iv2.setImageDrawable(bmpDraw);
           // int[] testImgPixels = ImageUtils.getPixels(rgbtoGrayscale(characterImage), characterImage.getWidth( ),        characterImage.getHeight( ));
           // int[][] binerymerticx=ImageUtils.getSymbolMatrix(testImgPixels, 2);
          int[] binerymerticxforcompare = ImageUtils.getbinarymatrix(rgbtoGrayscale(characterImage));
           int countblackpoint=0;
           for(int ii=0;ii<30;ii++)
                   for(int jj=0;jj<30;jj++)
                           if(binerymerticxforcompare[ii*30+jj]==1)
                                   countblackpoint++;
          if(countblackpoint<10)
          {
                  System.out.println();
          }
                  else
          {
            //此處進行比較并輸出結果:
            int i;
            int j;
            int maxequal=0;
            int maxindex=0;
            int count=0;
            for(i=0;i<26;i++)
            {
                     count=0;
                    for(j=0;j<900;j++)
                    {
                            if(model.CharacterModel1[j]==binerymerticxforcompare[j])
                        count++;
                    }
            //          System.out.print(count);
            //          System.out.print(" ");
                    if(count>maxequal)
                    {
                            maxequal=count;
                            maxindex=i;
                    }
            }
            int i2;
            int j2;
            int maxequal2=0;
            int maxindex2=0;
            int count2=0;
            for(i2=0;i2<26;i2++)
            {
                     count2=0;
                    for(j2=0;j2<900;j2++)
                    {
                            if(model2.CharacterModel2[i2][j2]==binerymerticxforcompare[j2])
                        count2++;
                    }
            //          System.out.print(count);
            //          System.out.print(" ");
                    if(count2>maxequal2)
                    {
                            maxequal2=count2;
                            maxindex2=i2;
                    }
            }
                    char result;
                    if(maxequal>maxequal2)
                    result=(char)('A'+maxindex);
                  else
                          result=(char)('a'+maxindex2);
                        mainactivity.res+=result;
                        //  System.out.print(result);
                        //   System.out.println();
         }
        }
        catch (Exception ex)
        {
            Logger.getLogger(CharacterExtractor.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
    private static final Logger LOG = Logger.getLogger(CharacterExtractor.class.getName());
}

</pre>

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!