毕设完成心情大好,这是个小前提。
求大神收徒,一坐12个小时不起来,乐于专心研究的好学生求师傅求大腿求工作~额~好吧开个玩笑。
我的毕设是有关于Android、有关于OCR、有关于WebService的课题,没有丁点实用价值所以就不赘述了。
其中OCR部分确实花了我不少的时间来弄,网上有很多AndroidOCR解决方案,我主要学习了两种。第一是基于云端的OCR,说白了就是发给服务器一张图片,然后服务器给你识别并返回一个值,然后你取得这个数据就行了。我参看的是OCRSDK,有免费配额,貌似是50pages,过了要收费,貌似还挺贵的。网址我也贴出来有兴趣的可以看一下,www.ocrsdk.com
我最终使用的是Tesseract这套解决方案,虽然对我这只菜鸟来说磕磕绊绊一路,但是好歹也调试出来了,下面我就基于我的思路给大家屡一下。
本博客是参看 黑暗伯爵 的博文,并且使用了他编译好的tess-two库,后面附的代码转自黑暗伯爵,希望吸血鬼大大不要生气~
其实我不太好意思附上我测试用的源文件,因为里面还有webservice部分,而且UI其丑无比,或者说根本没有做除了实现功能外的任何东西,不过本着脸厚无敌的宗旨,还是贴出来吧。有什么问题可以M我。
资源下载:com.googlecode下载 tess-two下载 tessdata下载 其丑无比没脸见人的功能验证源代码外加jar包只官人求不打脸
以下是使用方法:
1.构建jar路径,将jar包加到项目里面去。jar在tess-two文件中。
2.复制 com.googlecode.xx.android两个文件夹放到src里面,如图。如果没有的话
3.复制tess-two 文件夹中libs到libs中,覆盖进去就行了。
4.将tessdata保存到相应路径。手机卡上或者模拟器的sd卡上
5.使用代码调试即可
---------------下面这个部分写给突击毕设之类的菜鸟们的小心得,高手直接无视跳过即可------------
ctrl+s 这是生命
ctrl+shift+O 自动导入
ctrl+shift+F 快速排版
ctrl+D 删除该行
alt+shift+R 重构名称,可以一次改整个代码中的相关联的名称,回车确认重构
ctrl+/ 快速注释
这几个快捷键我用到的最多,感觉比肩ctrl+s
-----------------------------------------------------------
这个是调用部分的代码。
1 TessBaseAPI baseApi=new TessBaseAPI(); 2 3 //初始化tess 4 //android下面,tessdata肯定得放到sd卡里了 5 //如果tessdata这个目录放在sd卡的根目录 6 //那么path直接传入sd卡的目录 7 //eng就是英文,关于语言,按ISO 639-3标准的代码就行,具体请移步wiki 8 baseApi.init("tessdata文件夹的父级目录", "eng"); 9 10 //options是为了缩放图片,这个酌情缩放,图片小的话可以不缩放 11 BitmapFactory.Options options=new BitmapFactory.Options(); 12 //缩小为原来的1/2 13 options.inSampleSize=2; 14 15 //bitmap,我这里是以流的形式,只要能形成Bitmap就行 16 Bitmap bitmap = BitmapFactory.decodeStream(instream,null,options); 17 instream.close(); 18 19 20 //如果图片有Alpha值,那么最好设置一下 21 /*ExifInterface exif = new ExifInterface(filename) 22 int exifOrientation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL); 23 24 25 int rotate = 0; 26 switch (exifOrientation) { 27 case ExifInterface.ORIENTATION_ROTATE_90: 28 rotate = 90; 29 break; 30 case ExifInterface.ORIENTATION_ROTATE_180: 31 rotate = 180; 32 break; 33 case ExifInterface.ORIENTATION_ROTATE_270: 34 rotate = 270; 35 break; 36 } 37 38 39 if (rotate != 0) { 40 41 // Getting width & height of the given image. 42 int w = bitmap.getWidth(); 43 int h = bitmap.getHeight(); 44 45 // Setting pre rotate 46 Matrix mtx = new Matrix(); 47 mtx.preRotate(rotate); 48 49 // Rotating Bitmap 50 bitmap = Bitmap.createBitmap(bitmap, 0, 0, w, h, mtx, false); 51 // tesseract req. ARGB_8888 52 bitmap = bitmap.copy(Bitmap.Config.ARGB_8888, true); 53 } */ 54 55 //设置要ocr的图片bitmap 56 baseApi.setImage(bitmap); 57 //根据Init的语言,获得ocr后的字符串 58 String text= baseApi.getUTF8Text(); 59 //释放bitmap 60 baseApi.clear(); 61 62 //如果连续ocr多张图片,这个end可以不调用,但每次ocr之后,必须调用clear来对bitmap进行释放 63 //释放native内存 64 baseApi.end(); 65 66 ///////////////////////////其它方法////////////////////////////////// 67 68 69 //获取字符边框 70 71 Pixa pixa= baseApi.getCharacters(); 72 73 //同上,这个是整段文字的边框 74 baseApi.getRegions(); 75 76 //同上,只不过这里是条线 77 baseApi.getTextlines(); 78 79 //剩下的自己测试吧。 80 81 //转为rect数组 ,之后,可以很方便的在图片上框出方框 82 //怎么框由你 83 ArrayList<Rect> rects=pixa.getBoxRects();