原文地址:http://www.cnblogs.com/hangxin1940/archive/2012/01/13/2321507.html
Android OCR 之 tesseract
OCR屬於CV的範疇,也就是計算機視覺,目前來看,除了opencv這個龍頭老大,也就是hp開發的tesseract比較好用,雖然年頭比較長了,但現在歸google維護並託管在google code上了。
現在有android版本的
地址:http://code.google.com/p/tesseract-android-tools/
這個版本得自己git 三個庫 leptonica tesseract libjpeg ,我自己是編譯成功了,但測試的時候native層總是crash。
於是發現了tess的android的另一個分支 tess-two
推薦linux上編譯
一、下載&編譯
1、首先下載tess-two
git clone git://github.com/rmtheis/tess-two tess
2、進入 tess目錄,裏面有三個項目,我們只需要進入tess-two就可以直接編譯了
cd tess/tess-two ndk-build
3、編譯好後,將src下的兩個包以及libs導入到自己的項目就可以用啦
這裏把我我把編譯好後的東西放出來,用的話不用再編譯了
下載:tess-two.zip
二、使用
tesseract 使用了 leptonica的圖像處理庫,對於圖像處理還是比較強大的
Android官方地址:tesseract-android-tools
但它必須要一個匹配庫,即tessdata,我們可以從官方拷貝,在前面git的項目裏面tesseract源碼目錄有現成的tessdata可以用,對於中文,google code上也有下載,當然也可以自己訓練不同語言的tessdata。
包leptonica的類我們不必使用,只要使用tess包的類就行了
TessBaseAPI
使用時,首先創建TessBaseAPI對象
TessBaseAPI baseApi=new TessBaseAPI(); //初始化tess //android下面,tessdata肯定得放到sd卡里了 //如果tessdata這個目錄放在sd卡的根目錄 //那麼path直接傳入sd卡的目錄 //eng就是英文,關於語言,按ISO 639-3標準的代碼就行,具體請移步wiki baseApi.init("tessdata文件夾的父級目錄", "eng"); //options是爲了縮放圖片,這個酌情縮放,圖片小的話可以不縮放 BitmapFactory.Options options=new BitmapFactory.Options(); //縮小爲原來的1/2 options.inSampleSize=2; //bitmap,我這裏是以流的形式,只要能形成Bitmap就行 Bitmap bitmap = BitmapFactory.decodeStream(instream,null,options); instream.close(); //如果圖片有Alpha值,那麼最好設置一下 /*ExifInterface exif = new ExifInterface(filename) int exifOrientation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL); int rotate = 0; switch (exifOrientation) { case ExifInterface.ORIENTATION_ROTATE_90: rotate = 90; break; case ExifInterface.ORIENTATION_ROTATE_180: rotate = 180; break; case ExifInterface.ORIENTATION_ROTATE_270: rotate = 270; break; } if (rotate != 0) { // Getting width & height of the given image. int w = bitmap.getWidth(); int h = bitmap.getHeight(); // Setting pre rotate Matrix mtx = new Matrix(); mtx.preRotate(rotate); // Rotating Bitmap bitmap = Bitmap.createBitmap(bitmap, 0, 0, w, h, mtx, false); // tesseract req. ARGB_8888 bitmap = bitmap.copy(Bitmap.Config.ARGB_8888, true); } */ //設置要ocr的圖片bitmap baseApi.setImage(bitmap); //根據Init的語言,獲得ocr後的字符串 String text= baseApi.getUTF8Text(); //釋放bitmap baseApi.clear(); //如果連續ocr多張圖片,這個end可以不調用,但每次ocr之後,必須調用clear來對bitmap進行釋放 //釋放native內存 baseApi.end(); ///////////////////////////其它方法////////////////////////////////// //獲取字符邊框 Pixa pixa= baseApi.getCharacters(); //同上,這個是整段文字的邊框 baseApi.getRegions(); //同上,只不過這裏是條線 baseApi.getTextlines(); //剩下的自己測試吧。 //轉爲rect數組 ,之後,可以很方便的在圖片上框出方框 //怎麼框由你 ArrayList<Rect> rects=pixa.getBoxRects();
結束。
android下ocr就這麼簡單,好好使用第三方庫就行了。
ps:在使用這套庫對12306的驗證碼進行ocr時,耗時50ms左右。