|
002 |
006 | package srtp.ys.ocrtest; |
007 | import java.util.logging.Level; |
008 | import java.util.logging.Logger; |
009 | import android.graphics.Bitmap; |
010 | import android.graphics.BitmapFactory; |
011 | import android.graphics.Canvas; |
012 | import android.graphics.Color; |
013 | import android.graphics.ColorMatrix; |
014 | import android.graphics.ColorMatrixColorFilter; |
015 | import android.graphics.Paint; |
016 | import android.graphics.Matrix; |
017 | import android.graphics.Bitmap.Config; |
018 | import android.graphics.drawable.BitmapDrawable; |
019 | import android.util.Log; |
020 | import android.widget.ImageView; |
021 | import android.app.*; |
022 | import android.app.Activity; |
023 | import android.os.Bundle; |
024 | import android.view.View; |
025 | /** |
026 | * Saves all the characters in an image to an output directory individually. |
027 | * @author William Whitney |
028 | */ |
029 | public class CharacterExtractor extends DocumentScannerListenerAdaptor |
030 | { |
031 | private DocumentScanner documentScanner = new DocumentScanner(); |
032 | private int std_width; |
033 | private int std_height; |
034 |
|
035 | public void slice( int std_width, int std_height) |
036 | { |
037 | try |
038 | { |
039 | this .std_width = std_width; |
040 | this .std_height = std_height; |
041 | Bitmap img = BitmapFactory.decodeFile( "/sdcard/test.bmp" ); |
042 | PixelImage pixelImage = new PixelImage(img); |
043 | pixelImage.toGrayScale( true ); //OK |
044 | pixelImage.filter(); // OK |
045 | documentScanner.scan(pixelImage, this , 0 , 0 , pixelImage.width, pixelImage.height); |
046 | } |
047 | catch (Exception ex) |
048 | { |
049 | Logger.getLogger(CharacterExtractor. class .getName()).log(Level.SEVERE, null , ex); |
050 | } |
051 | } |
052 |
|
053 | public static Bitmap zoomBitmap(Bitmap bitmap, int w, int h) { |
054 | int width = bitmap.getWidth(); |
055 | int height = bitmap.getHeight(); |
056 | Matrix matrix = new Matrix(); |
057 | float scaleWidth ; |
058 | float scaleHeight; |
059 | //float scaleWidth = ((float) w / width); |
060 | if (height>width) { |
061 | scaleWidth = (( float ) h / height); |
062 | scaleHeight = (( float ) h / height); |
063 | } |
064 | else |
065 | { |
066 | scaleWidth = (( float ) w / width); |
067 | scaleHeight = (( float ) w / width); |
068 | } |
069 | matrix.postScale(scaleWidth, scaleHeight); |
070 | Bitmap newBmp = Bitmap.createBitmap(bitmap, 0 , 0 , width, height, |
071 | matrix, true ); |
072 | //加上30*30白色背景 |
073 | Bitmap mbmpTest = Bitmap.createBitmap( 30 , 30 , Config.RGB_565); |
074 | Canvas canvasTemp = new Canvas(mbmpTest); //给Canvas指定一个bitmap,之后就不是画到屏幕而是画到这个bitmap上 |
075 | canvasTemp.drawColor(Color.WHITE); |
076 | Paint mPaint = new Paint(); |
077 | mPaint.setColor(Color.WHITE); |
078 | canvasTemp.drawBitmap(newBmp,((( float )( 30 -newBmp.getWidth()))/ 2 ),((( float )( 30 -newBmp.getHeight()))/ 2 ),mPaint); //画到正中间 |
079 | return mbmpTest; |
080 | } |
081 | public static Bitmap rgbtoGrayscale(Bitmap bmpOriginal) { |
082 | int width, height; |
083 | height = bmpOriginal.getHeight(); |
084 | width = bmpOriginal.getWidth(); |
085 | Bitmap bmpGrayscale = Bitmap.createBitmap(width, height, Bitmap.Config.RGB_565); |
086 | Canvas c = new Canvas(bmpGrayscale); |
087 | Paint paint = new Paint(); |
088 | ColorMatrix cm = new ColorMatrix(); |
089 | cm.setSaturation( 0 ); |
090 | ColorMatrixColorFilter f = new ColorMatrixColorFilter(cm); |
091 | paint.setColorFilter(f); |
092 | c.drawBitmap(bmpOriginal, 0 , 0 , paint); |
093 | return bmpGrayscale; |
094 | } |
095 | public void processChar( int x1, int y1, int x2, int y2, int rowY1, int rowY2) |
096 | { |
097 | try |
098 | { |
099 | int areaW = x2 - x1; |
100 | int areaH = y2 - y1; |
101 | //Extract the character |
102 | Bitmap fatherimage = BitmapFactory.decodeFile( "/sdcard/test.bmp" ); |
103 | // Drawable characterImage=new BitmapDrawable(BitmapFactory.decodeFile("/sdcard/test.jpg")); |
104 | Bitmap bitmapcharacterImage = Bitmap.createBitmap(fatherimage,x1, y1, areaW, areaH); |
105 | Log.v( "w" , "w:" +bitmapcharacterImage.getWidth()+ "H:" +bitmapcharacterImage.getHeight()); |
106 | Bitmap characterImage=zoomBitmap(bitmapcharacterImage,std_width,std_height); //缩放并添上背景 |
107 | // 显示位图 |
108 | BitmapDrawable bmpDraw= new BitmapDrawable(rgbtoGrayscale(characterImage)); |
109 | mainactivity.iv2.setImageDrawable(bmpDraw); |
110 | // int[] testImgPixels = ImageUtils.getPixels(rgbtoGrayscale(characterImage), characterImage.getWidth( ), characterImage.getHeight( )); |
111 | // int[][] binerymerticx=ImageUtils.getSymbolMatrix(testImgPixels, 2); |
112 | int [] binerymerticxforcompare = ImageUtils.getbinarymatrix(rgbtoGrayscale(characterImage)); |
113 | int countblackpoint= 0 ; |
114 | for ( int ii= 0 ;ii< 30 ;ii++) |
115 | for ( int jj= 0 ;jj< 30 ;jj++) |
116 | if (binerymerticxforcompare[ii* 30 +jj]== 1 ) |
117 | countblackpoint++; |
118 | if (countblackpoint< 10 ) |
119 | { |
120 | System.out.println(); |
121 | } |
122 | else |
123 | { |
124 | //此处进行比较并输出结果: |
125 | int i; |
126 | int j; |
127 | int maxequal= 0 ; |
128 | int maxindex= 0 ; |
129 | int count= 0 ; |
130 | for (i= 0 ;i< 26 ;i++) |
131 | { |
132 | count= 0 ; |
133 | for (j= 0 ;j< 900 ;j++) |
134 | { |
135 | if (model.CharacterModel1[j]==binerymerticxforcompare[j]) |
136 | count++; |
137 | } |
138 | // System.out.print(count); |
139 | // System.out.print(" "); |
140 | if (count>maxequal) |
141 | { |
142 | maxequal=count; |
143 | maxindex=i; |
144 | } |
145 | } |
146 | int i2; |
147 | int j2; |
148 | int maxequal2= 0 ; |
149 | int maxindex2= 0 ; |
150 | int count2= 0 ; |
151 | for (i2= 0 ;i2< 26 ;i2++) |
152 | { |
153 | count2= 0 ; |
154 | for (j2= 0 ;j2< 900 ;j2++) |
155 | { |
156 | if (model2.CharacterModel2[i2][j2]==binerymerticxforcompare[j2]) |
157 | count2++; |
158 | } |
159 | // System.out.print(count); |
160 | // System.out.print(" "); |
161 | if (count2>maxequal2) |
162 | { |
163 | maxequal2=count2; |
164 | maxindex2=i2; |
165 | } |
166 | } |
167 | char result; |
168 | if (maxequal>maxequal2) |
169 | result=( char )( 'A' +maxindex); |
170 | else |
171 | result=( char )( 'a' +maxindex2); |
172 | mainactivity.res+=result; |
173 | // System.out.print(result); |
174 | // System.out.println(); |
175 | } |
176 | } |
177 | catch (Exception ex) |
178 | { |
179 | Logger.getLogger(CharacterExtractor. class .getName()).log(Level.SEVERE, null , ex); |
180 | } |
181 | } |
182 | private static final Logger LOG = Logger.getLogger(CharacterExtractor. class .getName()); |
183 | } |