本文介绍了正在使用的tesseract OCR Android应用的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我试图建立的tesseract使用Android上的OCR应用程序,但是当我将图片保存应用冲垮。

我已经建立了照片拍摄的教程中的 简单的Andr​​oid图像捕捉 的和OCR功能与导向的 制作一个最简单的OCR Android应用使用的tesseract 的。

这是在code我使用:

 包com.mmm.pitter;

进口的java.io.File;
进口java.io.IOException异常;

进口com.mmm.pitter.R;
进口com.google code.tesseract.android *。
进口com.google code.leptonica.android *。

进口android.app.Activity;
进口android.content.Intent;
进口android.graphics.Bitmap;
进口android.graphics.BitmapFactory;
进口android.graphics.Matrix;
进口android.media.ExifInterface;
进口android.net.Uri;
进口android.os.Bundle;
进口android.os.Environment;
进口android.provider.MediaStore;
进口android.util.Log;
进口android.view.View;
进口android.widget.Button;
进口android.widget.ImageView;
进口android.widget.TextView;

公共类PitterActivity扩展活动
{
    保护按钮_button;
    保护ImageView的_image;
    受保护的TextView _FIELD;
    保护字符串_path;
    保护布尔_taken;

    受保护的静态最后弦乐PHOTO_TAKEN =photo_taken;

    @覆盖
    公共无效的onCreate(包savedInstanceState)
    {
        super.onCreate(savedInstanceState);

        的setContentView(R.layout.main);

        _image =(ImageView的)findViewById(R.id.image);
        _FIELD =(TextView中)findViewById(R.id.field);
        _button =(按钮)findViewById(R.id.button);
        _button.setOnClickListener(新ButtonClickHandler());

        _path = Environment.getExternalStorageDirectory()+/images/make_machine_example.jpg;
    }

    公共类ButtonClickHandler实现View.OnClickListener
    {
        公共无效的onClick(视图查看){
            Log.i(MakeMachine,ButtonClickHandler.onClick());
            startCameraActivity();
        }
    }

    保护无效startCameraActivity()
    {
        Log.i(MakeMachine,startCameraActivity());
        档案文件=新的文件(_path);
        乌里outputFileUri = Uri.fromFile(文件);

        意向意图=新的意图(android.provider.MediaStore.ACTION_IM​​AGE_CAPTURE);
        intent.putExtra(MediaStore.EXTRA_OUTPUT,outputFileUri);

        startActivityForResult(意向,0);
    }

    @覆盖
    保护无效onActivityResult(INT申请code,INT结果code,意图数据)
    {
        Log.i(MakeMachine,结果code:+结果code);
        开关(结果code)
        {
            情况下0:
                Log.i(MakeMachine,用户取消);
                打破;

            情况1:
                尝试 {
                    onPhotoTaken();
                }
                赶上(IOException异常E){
                    // TODO自动生成的catch块
                    e.printStackTrace();
                }
                打破;
        }
    }

    保护无效onPhotoTaken()抛出IOException异常
    {
        Log.i(MakeMachine,onPhotoTaken);

        _taken = TRUE;

        BitmapFactory.Options选项=新BitmapFactory.Options();
        options.inSampleSize = 4;

        点阵位图= BitmapFactory.de codeFILE(_path,期权);

        _image.setImageBitmap(位);

        _field.setVisibility(View.GONE);

        // _ PATH =路径,图像以进行OCR
        ExifInterface EXIF​​ =新ExifInterface(_path);
        INT exifOrientation = exif.getAttributeInt(
                ExifInterface.TAG_ORIENTATION,
                ExifInterface.ORIENTATION_NORMAL);

        INT旋转= 0;

        开关(exifOrientation){
            案例ExifInterface.ORIENTATION_ROTATE_90:
                旋转= 90;
                打破;
            案例ExifInterface.ORIENTATION_ROTATE_180:
                旋转= 180;
                打破;
            案例ExifInterface.ORIENTATION_ROTATE_270:
                旋转= 270;
                打破;
        }

        如果(旋转!= 0){
            INT W = bitmap.getWidth();
            INT H = bitmap.getHeight();

            //设置pre旋转
            矩阵MTX =新的Matrix();
            。MTX preRotate(旋转);

            //旋转位图和放大器;转换为ARGB_8888,由苔丝要求
            位图= Bitmap.createBitmap(位图,0,0,W,H,MTX,假);
            位= bitmap.copy(Bitmap.Config.ARGB_8888,真正的);
        }

        TessBaseAPI baseApi =新TessBaseAPI();
        // DATA_PATH =路径存储
        //朗为其语言的数据存在,通常是ENG
        baseApi.init(SD卡/的tesseract / tessdata,ENG);
        baseApi.setImage(位);
        串recognizedText = baseApi.getUTF8Text();
        的System.out.println(recognizedText);
        baseApi.end();
    }

    @覆盖
    保护无效onRestoreInstanceState(包savedInstanceState){
        Log.i(MakeMachine,onRestoreInstanceState());
        如果(savedInstanceState.getBoolean(PitterActivity.PHOTO_TAKEN)){
            尝试 {
                onPhotoTaken();
            }
            赶上(IOException异常E){
                // TODO自动生成的catch块
                e.printStackTrace();
            }
        }
    }

    @覆盖
    保护无效的onSaveInstanceState(包outState){
        outState.putBoolean(PitterActivity.PHOTO_TAKEN,_taken);
    }
}
 

这是日志:

  10-13 23:13:51.191:I / MakeMachine(29787):ButtonClickHandler.onClick()
10-13 23:13:51.191:I / MakeMachine(29787):startCameraActivity()
10-13 23:13:51.851:D /剪贴板(29787):隐藏剪贴板对话框,在开始输入:由别人完成了...!
10-13 23:13:51.866:W / IInputConnectionWrapper(29787):showStatusIcon上的非活动InputConnection
10-13 23:14:07.431:I / MakeMachine(29787):onRestoreInstanceState()
10-13 23:14:07.431:I / MakeMachine(29787):因此code:-1
10-13 23:14:07.431:I / MakeMachine(29787):onPhotoTaken
10-13 23:14:07.431:我/的System.out(29787):不是一个DRM文件,开放notmally
10-13 23:14:07.436:E / jhead的(29787):无法打开
10-13 23:14:07.436:D / dalvikvm(29787):试图加载LIB /data/data/com.mmm.pitter/lib/liblept.so 0x4154e9a0
10-13 23:14:07.436:D / dalvikvm(29787):增加了共享库/data/data/com.mmm.pitter/lib/liblept.so 0x4154e9a0
10-13 23:14:07.446:D / dalvikvm(29787):试图加载LIB /data/data/com.mmm.pitter/lib/libtess.so 0x4154e9a0
10-13 23:14:07.456:D / dalvikvm(29787):增加了共享库/data/data/com.mmm.pitter/lib/libtess.so 0x4154e9a0
10-13 23:14:07.471:D / AndroidRuntime(29787):关闭虚拟机
10-13 23:14:07.471:W / dalvikvm(29787):主题ID = 1:螺纹退出与未捕获的异常(组= 0x40c5b1f8)
10-13 23:14:07.476:E / AndroidRuntime(29787):致命异常:主要
10-13 23:14:07.476:E / AndroidRuntime(29787):java.lang.RuntimeException的:无法恢复活动{com.mmm.pitter / com.mmm.pitter.PitterActivity}:java.lang.RuntimeException的:不提供结果ResultInfo {谁= NULL,请求= 0,结果= -1,数据= NULL}到活动{com.mmm.pitter / com.mmm.pitter.PitterActivity}:java.lang.IllegalArgumentException:如果数据路径中必须包含子文件夹tessdata !
10-13 23:14:07.476:E / AndroidRuntime(29787):在android.app.ActivityThread.performResumeActivity(ActivityThread.java:2456)
10-13 23:14:07.476:E / AndroidRuntime(29787):在android.app.ActivityThread.handleResumeActivity(ActivityThread.java:2484)
10-13 23:14:07.476:E / AndroidRuntime(29787):在android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1998)
10-13 23:14:07.476:E / AndroidRuntime(29787):在android.app.ActivityThread.handleRelaunchActivity(ActivityThread.java:3363)
10-13 23:14:07.476:E / AndroidRuntime(29787):在android.app.ActivityThread.access $ 700(ActivityThread.java:127)
10-13 23:14:07.476:E / AndroidRuntime(29787):在android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1163)
10-13 23:14:07.476:E / AndroidRuntime(29787):在android.os.Handler.dispatchMessage(Handler.java:99)
10-13 23:14:07.476:E / AndroidRuntime(29787):在android.os.Looper.loop(Looper.java:137)
10-13 23:14:07.476:E / AndroidRuntime(29787):在android.app.ActivityThread.main(ActivityThread.java:4507)
10-13 23:14:07.476:E / AndroidRuntime(29787):在java.lang.reflect.Method.invokeNative(本机方法)
10-13 23:14:07.476:E / AndroidRuntime(29787):在java.lang.reflect.Method.invoke(Method.java:511)
10-13 23:14:07.476:E / AndroidRuntime(29787):在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:790)
10-13 23:14:07.476:E / AndroidRuntime(29787):在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:557)
10-13 23:14:07.476:E / AndroidRuntime(29787):在dalvik.system.NativeStart.main(本机方法)
10-13 23:14:07.476:E / AndroidRuntime(29787):java.lang.RuntimeException的:产生的原因未能交付结果ResultInfo {谁= NULL,请求= 0,结果= -1,数据= NULL}到活动{ com.mmm.pitter / com.mmm.pitter.PitterActivity}:java.lang.IllegalArgumentException:如果数据路径中必须包含子文件夹tessdata!
10-13 23:14:07.476:E / AndroidRuntime(29787):在android.app.ActivityThread.deliverResults(ActivityThread.java:2992)
10-13 23:14:07.476:E / AndroidRuntime(29787):在android.app.ActivityThread.performResumeActivity(ActivityThread.java:2443)
10-13 23:14:07.476:E / AndroidRuntime(29787):13 ...更多
10-13 23:14:07.476:E / AndroidRuntime(29787):java.lang.IllegalArgumentException异常:数据路径必须包含子文件夹tessdata产生的原因!
10-13 23:14:07.476:E / AndroidRuntime(29787):在com.google code.tesseract.android.TessBaseAPI.init(TessBaseAPI.java:178)
10-13 23:14:07.476:E / AndroidRuntime(29787):在com.mmm.pitter.PitterActivity.onPhotoTaken(PitterActivity.java:146)
10-13 23:14:07.476:E / AndroidRuntime(29787):在com.mmm.pitter.PitterActivity.onActivityResult(PitterActivity.java:88)
10-13 23:14:07.476:E / AndroidRuntime(29787):在android.app.Activity.dispatchActivityResult(Activity.java:4649)
10-13 23:14:07.476:E / AndroidRuntime(29787):在android.app.ActivityThread.deliverResults(ActivityThread.java:2988)
10-13 23:14:07.476:E / AndroidRuntime(29787):14 ...更多
10-13 23:19:32.376:I /流程(29787):发送信号。 PID:29787 SIG:9
 

解决方案

您需要放在 tessdata 目录中的数据文件,并指定的的父目录在init 的tessdata的():

  baseApi.init(到/ mnt / SD卡/的tesseract,ENG);
 

I'm trying to build an OCR application on Android using Tesseract, but when I save the picture the application crushes.

I've build the photo capture with the tutorial Simple Android Photo Captureand the OCR function with the guide Making a Simple OCR Android App using Tesseract.

This is the code I'm using:

package com.mmm.pitter;

import java.io.File;
import java.io.IOException;

import com.mmm.pitter.R;
import com.googlecode.tesseract.android.*;
import com.googlecode.leptonica.android.*;

import android.app.Activity;
import android.content.Intent;
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.ImageView;
import android.widget.TextView;

public class PitterActivity extends Activity
{
    protected Button _button;
    protected ImageView _image;
    protected TextView _field;
    protected String _path;
    protected boolean _taken;

    protected static final String PHOTO_TAKEN = "photo_taken";

    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.main);

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

        _path = Environment.getExternalStorageDirectory() + "/images/make_machine_example.jpg";
    }

    public class ButtonClickHandler implements View.OnClickListener
    {
        public void onClick( View view ){
            Log.i("MakeMachine", "ButtonClickHandler.onClick()" );
            startCameraActivity();
        }
    }

    protected void startCameraActivity()
    {
        Log.i("MakeMachine", "startCameraActivity()" );
        File file = new File( _path );
        Uri outputFileUri = Uri.fromFile( file );

        Intent intent = new Intent(android.provider.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( "MakeMachine", "resultCode: " + resultCode );
        switch( resultCode )
        {
            case 0:
                Log.i( "MakeMachine", "User cancelled" );
                break;

            case -1:
                try {
                    onPhotoTaken();
                }
                catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                break;
        }
    }

    protected void onPhotoTaken() throws IOException
    {
        Log.i( "MakeMachine", "onPhotoTaken" );

        _taken = true;

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

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

        _image.setImageBitmap(bitmap);

        _field.setVisibility( View.GONE );

        //_path = path to the image to be OCRed
        ExifInterface exif = new ExifInterface(_path);
        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) {
            int w = bitmap.getWidth();
            int h = bitmap.getHeight();

            // Setting pre rotate
            Matrix mtx = new Matrix();
            mtx.preRotate(rotate);

            // Rotating Bitmap & convert to ARGB_8888, required by tess
            bitmap = Bitmap.createBitmap(bitmap, 0, 0, w, h, mtx, false);
            bitmap = bitmap.copy(Bitmap.Config.ARGB_8888, true);
        }

        TessBaseAPI baseApi = new TessBaseAPI();
        // DATA_PATH = Path to the storage
        // lang for which the language data exists, usually "eng"
        baseApi.init(""sdcard/tesseract/tessdata", "eng");
        baseApi.setImage(bitmap);
        String recognizedText = baseApi.getUTF8Text();
        System.out.println(recognizedText);
        baseApi.end();
    }

    @Override
    protected void onRestoreInstanceState( Bundle savedInstanceState){
        Log.i( "MakeMachine", "onRestoreInstanceState()");
        if( savedInstanceState.getBoolean( PitterActivity.PHOTO_TAKEN ) ) {
            try {
                onPhotoTaken();
            }
            catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }

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

And this is the log:

10-13 23:13:51.191: I/MakeMachine(29787): ButtonClickHandler.onClick()
10-13 23:13:51.191: I/MakeMachine(29787): startCameraActivity()
10-13 23:13:51.851: D/CLIPBOARD(29787): Hide Clipboard dialog at Starting input: finished by someone else... !
10-13 23:13:51.866: W/IInputConnectionWrapper(29787): showStatusIcon on inactive InputConnection
10-13 23:14:07.431: I/MakeMachine(29787): onRestoreInstanceState()
10-13 23:14:07.431: I/MakeMachine(29787): resultCode: -1
10-13 23:14:07.431: I/MakeMachine(29787): onPhotoTaken
10-13 23:14:07.431: I/System.out(29787): Not a DRM File, opening notmally
10-13 23:14:07.436: E/JHEAD(29787): can't open
10-13 23:14:07.436: D/dalvikvm(29787): Trying to load lib /data/data/com.mmm.pitter/lib/liblept.so 0x4154e9a0
10-13 23:14:07.436: D/dalvikvm(29787): Added shared lib /data/data/com.mmm.pitter/lib/liblept.so 0x4154e9a0
10-13 23:14:07.446: D/dalvikvm(29787): Trying to load lib /data/data/com.mmm.pitter/lib/libtess.so 0x4154e9a0
10-13 23:14:07.456: D/dalvikvm(29787): Added shared lib /data/data/com.mmm.pitter/lib/libtess.so 0x4154e9a0
10-13 23:14:07.471: D/AndroidRuntime(29787): Shutting down VM
10-13 23:14:07.471: W/dalvikvm(29787): threadid=1: thread exiting with uncaught exception (group=0x40c5b1f8)
10-13 23:14:07.476: E/AndroidRuntime(29787): FATAL EXCEPTION: main
10-13 23:14:07.476: E/AndroidRuntime(29787): java.lang.RuntimeException: Unable to resume activity {com.mmm.pitter/com.mmm.pitter.PitterActivity}: java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=0, result=-1, data=null} to activity {com.mmm.pitter/com.mmm.pitter.PitterActivity}: java.lang.IllegalArgumentException: Data path must contain subfolder tessdata!
10-13 23:14:07.476: E/AndroidRuntime(29787):     at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2456)
10-13 23:14:07.476: E/AndroidRuntime(29787):     at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:2484)
10-13 23:14:07.476: E/AndroidRuntime(29787):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1998)
10-13 23:14:07.476: E/AndroidRuntime(29787):     at android.app.ActivityThread.handleRelaunchActivity(ActivityThread.java:3363)
10-13 23:14:07.476: E/AndroidRuntime(29787):     at android.app.ActivityThread.access$700(ActivityThread.java:127)
10-13 23:14:07.476: E/AndroidRuntime(29787):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1163)
10-13 23:14:07.476: E/AndroidRuntime(29787):     at android.os.Handler.dispatchMessage(Handler.java:99)
10-13 23:14:07.476: E/AndroidRuntime(29787):     at android.os.Looper.loop(Looper.java:137)
10-13 23:14:07.476: E/AndroidRuntime(29787):     at android.app.ActivityThread.main(ActivityThread.java:4507)
10-13 23:14:07.476: E/AndroidRuntime(29787):     at java.lang.reflect.Method.invokeNative(Native Method)
10-13 23:14:07.476: E/AndroidRuntime(29787):     at java.lang.reflect.Method.invoke(Method.java:511)
10-13 23:14:07.476: E/AndroidRuntime(29787):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:790)
10-13 23:14:07.476: E/AndroidRuntime(29787):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:557)
10-13 23:14:07.476: E/AndroidRuntime(29787):     at dalvik.system.NativeStart.main(Native Method)
10-13 23:14:07.476: E/AndroidRuntime(29787): Caused by: java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=0, result=-1, data=null} to activity {com.mmm.pitter/com.mmm.pitter.PitterActivity}: java.lang.IllegalArgumentException: Data path must contain subfolder tessdata!
10-13 23:14:07.476: E/AndroidRuntime(29787):     at android.app.ActivityThread.deliverResults(ActivityThread.java:2992)
10-13 23:14:07.476: E/AndroidRuntime(29787):     at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2443)
10-13 23:14:07.476: E/AndroidRuntime(29787):     ... 13 more
10-13 23:14:07.476: E/AndroidRuntime(29787): Caused by: java.lang.IllegalArgumentException: Data path must contain subfolder tessdata!
10-13 23:14:07.476: E/AndroidRuntime(29787):     at com.googlecode.tesseract.android.TessBaseAPI.init(TessBaseAPI.java:178)
10-13 23:14:07.476: E/AndroidRuntime(29787):     at com.mmm.pitter.PitterActivity.onPhotoTaken(PitterActivity.java:146)
10-13 23:14:07.476: E/AndroidRuntime(29787):     at com.mmm.pitter.PitterActivity.onActivityResult(PitterActivity.java:88)
10-13 23:14:07.476: E/AndroidRuntime(29787):     at android.app.Activity.dispatchActivityResult(Activity.java:4649)
10-13 23:14:07.476: E/AndroidRuntime(29787):     at android.app.ActivityThread.deliverResults(ActivityThread.java:2988)
10-13 23:14:07.476: E/AndroidRuntime(29787):     ... 14 more
10-13 23:19:32.376: I/Process(29787): Sending signal. PID: 29787 SIG: 9
解决方案

You need to put the data files in the tessdata directory, and specify the parent directory of tessdata in your init():

baseApi.init("/mnt/sdcard/tesseract", "eng");

这篇关于正在使用的tesseract OCR Android应用的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

07-23 11:17
查看更多