Android OCR 之 tesseract

來源:互聯網
上載者:User

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左右。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.