android中ocr解決方案(tesseract)

來源:互聯網
上載者:User

  android應用中ocr的解決方案大致有兩種,而採用最多的還是tesseract.小弟就在這裡將我最近兩天解決思路寫下來,如有缺陷,歡迎拍磚:

  有兩種解決方案,一種是採用tesseract cloud-service,這鐘是把圖片資訊發送到雲端,然後獲得圖片分析資料;第二種就是不用連網,本地化分析圖片上資訊。我就說說第二種,第一種我會在最後給大家一個連結(文章很不錯)。

  搜先就是下載Tesseract native android library.這裡有兩個連結,你選哪個連結都可以:

  a.svn checkout http://tesseract-android-tools.googlecode.com/svn/trunk/ tesseract-android-tools。(如果不能checkout到,廢話別說就到官方上下:http://code.google.com/p/tesseract-android-tools/)

  b.可能上面一個下載後編譯有些人會遇到一些問題,比如找不到jgep庫,編譯不成功。所以有了這個項目:git clone git://github.com/rmtheis/tess-two.git  (這個包裡面內容太多,不過也省得下那麼多庫了)

  這裡先說採用第一個源下載:下載成功後,開啟README檔案,做下修改(如下):

git clone git://android.git.kernel.org/platform/external/jpeg.git libjpeg
修改為:
git clone https://android.googlesource.com/platform/external/jpeg libjpeg
ndk-build //這個編譯要到jni檔案夾裡面編譯

  

  對於第二個源下載,由於裡面沒有README檔案,操作命令如下:

cd <project-directory>/tess-two
export TESSERACT_PATH=${PWD}/external/tesseract-3.01
export LEPTONICA_PATH=${PWD}/external/leptonica-1.68
export LIBJPEG_PATH=${PWD}/external/libjpeg
ndk-build
android update project --path .
ant release

  最終兩個都得到你想要的libs裡面的so檔案和src裡面的對so檔案的封裝類。這個就是我們開發所用到的東東啦。

  然後建立工程,代碼如下:

public class MainActivity extends Activity {
private static final String TAG = "MainActivity ...";

private static final String TESSBASE_PATH = "/mnt/sdcard/tesseract/";
private static final String DEFAULT_LANGUAGE = "eng";
private static final String IMAGE_PATH = "/mnt/sdcard/test1.jpg";
private static final String EXPECTED_FILE = TESSBASE_PATH + "tessdata/" + DEFAULT_LANGUAGE
+ ".traineddata";

private TessBaseAPI service;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
testOcr();

}

public void testOcr(){
mHandler.post(new Runnable() {

@Override
public void run() {
Log.d(TAG, "begin>>>>>>>");
ocr();
//test();
}
});

}
public void test(){
// First, make sure the eng.traineddata file exists.
/*assertTrue("Make sure that you've copied " + DEFAULT_LANGUAGE + ".traineddata to "
+ EXPECTED_FILE, new File(EXPECTED_FILE).exists());*/
final TessBaseAPI baseApi = new TessBaseAPI();
baseApi.init(TESSBASE_PATH, DEFAULT_LANGUAGE);
final Bitmap bmp = BitmapFactory.decodeResource(getResources(), R.drawable.test);
//digits is a .jpg image I found in one of the issues here.
ImageView img = (ImageView) findViewById(R.id.image);
img.setImageBitmap(bmp);//I can see the ImageView. So we know that it should work if I sent it to the setImage()
baseApi.setImage(bmp);
Log.v("Kishore","Kishore:Working");//This statement is never reached. Futhermore, on putting some more Log.v commands in the setImage function, I found out that the native function nativeSetImagePix is never accessed. I have attached the Logcat output below to show that it is not accessed.

String outputText = baseApi.getUTF8Text();
Log.v("Kishore","Kishore:"+outputText);
baseApi.end();
bmp.recycle();
}

protected void ocr() {

BitmapFactory.Options options = new BitmapFactory.Options();
options.inSampleSize = 2;
Bitmap bitmap = BitmapFactory.decodeFile(IMAGE_PATH, options);

try {
ExifInterface exif = new ExifInterface(IMAGE_PATH);
int exifOrientation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL);

Log.v(TAG, "Orient: " + exifOrientation);

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

Log.v(TAG, "Rotation: " + rotate);

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

} catch (IOException e) {
Log.e(TAG, "Rotate or coversion failed: " + e.toString());
}

ImageView iv = (ImageView) findViewById(R.id.image);
iv.setImageBitmap(bitmap);
iv.setVisibility(View.VISIBLE);

Log.v(TAG, "Before baseApi");

TessBaseAPI baseApi = new TessBaseAPI();
baseApi.setDebug(true);
baseApi.init(TESSBASE_PATH, DEFAULT_LANGUAGE);
baseApi.setImage(bitmap);
String recognizedText = baseApi.getUTF8Text();
baseApi.end();

Log.v(TAG, "OCR Result: " + recognizedText);

// clean up and show
if (DEFAULT_LANGUAGE.equalsIgnoreCase("eng")) {
recognizedText = recognizedText.replaceAll("[^a-zA-Z0-9]+", " ");
}
if (recognizedText.length() != 0) {
((TextView) findViewById(R.id.field)).setText(recognizedText.trim());
}
}
private Handler mHandler = new Handler(){
public void handleMessage(android.os.Message msg) {

};
};
}

  當你很歡喜的運行程式的時候,發現事情沒有你想象的那麼簡單。這個檔案必須要用到一個語言套件。不然你怎麼匹配呢?想想也是:

adb shell mkdir /mnt/sdcard/tesseract
adb shell mkdir /mnt/sdcard/tesseract/tessdata
adb push eng.traineddata /mnt/sdcard/tesseract/tessdata/eng.traineddata
adb shell ls -l /mnt/sdcard/tesseract/tessdata
ls -l bin/tesseract-android-tools-test.apk
adb install -r -s bin/tesseract-android-tools-test.apk
adb shell am instrument -w -e class com.googlecode.tesseract.android.test.TessBaseAPITest com.googlecode.tesseract.android.test/android.test.InstrumentationTestRunner

  上面的額eng.traineddata這個東西。你可以搜下,網路有的。(囧,我還不知到怎麼上傳附件)

  最後效果(事實上解析結果是:44m><9。只不過那個字元不認識吧):

                                    

參考文章:

  http://wolfpaulus.com/journal/android-and-ocr

  http://labs.makemachine.net/2010/03/simple-android-photo-capture/

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.