2012-05-12 124 views
0

我按照本教程了解有关android中的ocr。 http://gaut.am/making-an-ocr-android-app-using-tesseract/运行Android简单OCR应用程序后强制关闭

在我的设备上成功运行程序后,拍摄一张照片,强制关闭。好像它未能分析图像。

我已经把我的/资产训练有素的数据/ TESTDATA/

训练有素的数据是从下载: http://code.google.com/p/tesseract-ocr/downloads/list

我logcat的表演,我已经在 java.lang.ExceptionInInitializerError错误

你能教我如何解决它吗?

这是代码:

package com.datumdroid.android.ocr.simple; 

import java.io.File; 
import java.io.FileInputStream; 
import java.io.FileOutputStream; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.OutputStream; 
import java.util.zip.GZIPInputStream; 

import android.app.Activity; 
import android.content.Intent; 
import android.content.res.AssetManager; 
import android.graphics.Bitmap; 
import android.graphics.BitmapFactory; 
import android.graphics.Matrix; 
import android.media.ExifInterface; 
import android.net.Uri; 
import android.os.Bundle; 
import android.os.Environment; 
import android.provider.MediaStore; 
import android.util.Log; 
import android.view.View; 
import android.widget.Button; 
import android.widget.EditText; 

import com.googlecode.tesseract.android.TessBaseAPI; 

public class SimpleAndroidOCRActivity extends Activity { 
    public static final String PACKAGE_NAME = "com.datumdroid.android.ocr.simple"; 
    public static final String DATA_PATH = Environment 
      .getExternalStorageDirectory().toString() + "/SimpleAndroidOCR/"; 

    // You should have the trained data file in assets folder 
    // You can get them at: 
    // http://code.google.com/p/tesseract-ocr/downloads/list 
    public static final String lang = "eng"; 

    private static final String TAG = "SimpleAndroidOCR.java"; 

    protected Button _button; 
    // protected ImageView _image; 
    protected EditText _field; 
    protected String _path; 
    protected boolean _taken; 

    protected static final String PHOTO_TAKEN = "photo_taken"; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 

     String[] paths = new String[] { DATA_PATH, DATA_PATH + "tessdata/" }; 

     for (String path : paths) { 
      File dir = new File(path); 
      if (!dir.exists()) { 
       if (!dir.mkdirs()) { 
        Log.v(TAG, "ERROR: Creation of directory " + path 
          + " on sdcard failed"); 
        return; 
       } else { 
        Log.v(TAG, "Created directory " + path + " on sdcard"); 
       } 
      } 

     } 

     // lang.traineddata file with the app (in assets folder) 
     // You can get them at: 
     // http://code.google.com/p/tesseract-ocr/downloads/list 
     // This area needs work and optimization 
     if (!(new File(DATA_PATH + "tessdata/" + lang + ".traineddata")) 
       .exists()) { 
      try { 

       AssetManager assetManager = getAssets(); 
       InputStream in = assetManager.open("tessdata/eng.traineddata"); 
       // GZIPInputStream gin = new GZIPInputStream(in); 
       OutputStream out = new FileOutputStream(DATA_PATH 
         + "tessdata/eng.traineddata"); 

       // Transfer bytes from in to out 
       byte[] buf = new byte[1024]; 
       int len; 
       // while ((lenf = gin.read(buff)) > 0) { 
       while ((len = in.read(buf)) > 0) { 
        out.write(buf, 0, len); 
       } 
       in.close(); 
       // gin.close(); 
       out.close(); 

       Log.v(TAG, "Copied " + lang + " traineddata"); 
      } catch (IOException e) { 
       Log.e(TAG, 
         "Was unable to copy " + lang + " traineddata " 
           + e.toString()); 
      } 
     } 

     super.onCreate(savedInstanceState); 

     setContentView(R.layout.main); 

     // _image = (ImageView) findViewById(R.id.image); 
     _field = (EditText) findViewById(R.id.field); 
     _button = (Button) findViewById(R.id.button); 
     _button.setOnClickListener(new ButtonClickHandler()); 

     _path = DATA_PATH + "/ocr.jpg"; 
    } 

    public class ButtonClickHandler implements View.OnClickListener { 
     public void onClick(View view) { 
      Log.v(TAG, "Starting Camera app"); 
      startCameraActivity(); 
     } 
    } 

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

    protected void startCameraActivity() { 
     File file = new File(_path); 
     Uri outputFileUri = Uri.fromFile(file); 

     final Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
     intent.putExtra(MediaStore.EXTRA_OUTPUT, outputFileUri); 

     startActivityForResult(intent, 0); 
    } 

    @Override 
    protected void onActivityResult(int requestCode, int resultCode, Intent data) { 

     Log.i(TAG, "resultCode: " + resultCode); 

     if (resultCode == -1) { 
      onPhotoTaken(); 
     } else { 
      Log.v(TAG, "User cancelled"); 
     } 
    } 

    @Override 
    protected void onSaveInstanceState(Bundle outState) { 
     outState.putBoolean(SimpleAndroidOCRActivity.PHOTO_TAKEN, _taken); 
    } 

    @Override 
    protected void onRestoreInstanceState(Bundle savedInstanceState) { 
     Log.i(TAG, "onRestoreInstanceState()"); 
     if (savedInstanceState.getBoolean(SimpleAndroidOCRActivity.PHOTO_TAKEN)) { 
      onPhotoTaken(); 
     } 
    } 

    protected void onPhotoTaken() { 
     _taken = true; 

     BitmapFactory.Options options = new BitmapFactory.Options(); 
     options.inSampleSize = 4; 

     Bitmap bitmap = BitmapFactory.decodeFile(_path, options); 

     try { 
      ExifInterface exif = new ExifInterface(_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); 
      } 

      // Convert to ARGB_8888, required by tess 
      bitmap = bitmap.copy(Bitmap.Config.ARGB_8888, true); 
      System.out.println("Bitmap Selesai"); 
     } catch (IOException e) { 
      Log.e(TAG, "Couldn't correct orientation: " + e.toString()); 
     } 

     // _image.setImageBitmap(bitmap); 
     //System.loadLibrary("tess"); 
     System.out.println("Masuk"); 
     Log.v(TAG, "Before baseApi"); 

     TessBaseAPI baseApi = new TessBaseAPI(); 
     baseApi.setDebug(true); 
     baseApi.init(DATA_PATH, lang); 
     baseApi.setImage(bitmap); 
     String recognizedText = baseApi.getUTF8Text(); 
     baseApi.end(); 
     System.out.println("Keluar"); 
     // You now have the text in recognizedText var, you can do anything with 
     // it. 
     // We will display a stripped out trimmed alpha-numeric version of it 
     // (if lang is eng) 
     // so that garbage doesn't make it to the display. 

     Log.v(TAG, "OCRED TEXT: " + recognizedText); 

     if (lang.equalsIgnoreCase("eng")) { 
      recognizedText = recognizedText.replaceAll("[^a-zA-Z0-9]+", " "); 
     } 

     recognizedText = recognizedText.trim(); 

     if (recognizedText.length() != 0) { 
      _field.setText(_field.getText().toString().length() == 0 ? recognizedText 
        : _field.getText() + " " + recognizedText); 
      _field.setSelection(_field.getText().toString().length()); 
     } 

     // Cycle done. 
    } 

    // www.Gaut.am was here 
    // Thanks for reading! 
} 

回答

0

你可以尝试初始化的Tesseract-OCR之前添加System.loadLibrary("tess");

+0

你TessBaseAPI之前是什么意思?不,它不能 – farissyariati

+0

或者像这样:http://code.google.com/p/tesseract-android-tools/source/browse/tesseract-android-tools/src/com/googlecode/tesseract/android/TessBaseAPI。 java吗?名称= thursday_cl#40 –

1

你有这个在你的AndroidManifest.xml?:

<uses-permission android:name="WRITE_EXTERNAL_STORAGE" /> 

我注意到你想在初始化过程中创建的文件/目录,也许这将帮助