|
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 |
} |