2017-11-14 15 views
0

내 프로젝트에서이 두 가지 방법을 사용하고 있습니다. 자습서를 많이 읽었지만 아무 도움도받지 못했습니다.Tesseract TessBaseApi init() 오류

package com.example.shaur.ocrapp; 

import android.content.Intent; 
import android.database.Cursor; 
import android.graphics.Bitmap; 
import android.graphics.BitmapFactory; 
import android.net.Uri; 
import android.os.Environment; 
import android.provider.MediaStore; 
import android.support.annotation.Nullable; 
import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.View; 
import android.widget.Button; 
import android.widget.ImageView; 
import android.widget.TextView; 

import com.googlecode.tesseract.android.TessBaseAPI; 

import java.io.IOException; 

public class MainActivity extends AppCompatActivity { 

    private static int RESULT_LOAD_IMAGE = 1; 

    Button button; 
    ImageView image; 
    TextView result; 
    Bitmap bitmap; 
    private static final int GALLERY = 4; 

    private static String TESSBASE_PATH= Environment.getRootDirectory().getPath(); 
    private static final String DEFAULT_LANGUAGE = "eng"; 


    @Override 
    protected void onCreate(@Nullable Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     button = (Button) findViewById(R.id.button); 
     image = (ImageView) findViewById(R.id.image); 
     result = (TextView) findViewById(R.id.result); 

     button.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       Intent intent = new Intent(Intent.ACTION_PICK); 
       intent.setType("image/*"); 

       startActivityForResult(intent, GALLERY); 
      } 
     }); 
    } 

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

     if (requestCode == GALLERY) { 
      Uri uri = data.getData(); 
      try { 
       bitmap = MediaStore.Images.Media.getBitmap(this.getContentResolver(), uri); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
      image.setImageBitmap(bitmap); 


      final TessBaseAPI baseApi = new TessBaseAPI(); 

      //Error HERE 
      baseApi.init(TESSBASE_PATH, DEFAULT_LANGUAGE); 
      baseApi.setPageSegMode(TessBaseAPI.PageSegMode.PSM_SINGLE_LINE); 
      baseApi.setVariable(TessBaseAPI.VAR_SAVE_BLOB_CHOICES, TessBaseAPI.VAR_TRUE); 

      baseApi.setImage(bitmap); 
      String outputText = baseApi.getUTF8Text(); 
      baseApi.end(); 

      Log.i("TEXT:",outputText); 
      if(DEFAULT_LANGUAGE.equalsIgnoreCase("eng")){ 
       outputText = outputText.replaceAll("[^a-zA-Z0-9]+", " "); 
      } 
      result.setText(outputText); 



     } 
    } 
} 

데이터 경로를 getFilesDir() + "/ tesseract /"로 설정했습니다. 이 메소드는 작동하지 않습니다. 그런 다음 PATH -> "/ mnt/sdcard/tessract /"를 시도했습니다.

내 eng.traineddata는 assets 폴더에 있습니다.

로그 메시지 경우 오류 Comes->

com.example.shaur.ocrapp의 E/AndroidRuntime : 치명적인 예외 : 주요 프로세스 : com.example.shaur.ocrapp, PID : 5736 java.lang의 .RuntimeException : 결과 전달 실패 ResultInfo {who = null, 요청 = 4, 결과 = -1, 데이터 = 의도 { dat = content : // media/external/images/media/43105 flg = 0x1 launchParam = MultiScreenLaunchParams { mDisplayId = 0 mBaseDisplayId = 0 mFlags = 0} (엑스트라가 있음)}} 액티비티 {com.example.shaur.ocra pp/com.example.shaur.ocrapp.MainActivity} : java.lang.IllegalArgumentException : 데이터 경로에 하위 폴더 tessdata가 있어야합니다! android.app.ActivityThread.-wrap22 (ActivityThread.java) 에서 android.app.ActivityThread.handleSendResult (ActivityThread.java:4563)에서 android.app.ActivityThread.deliverResults (ActivityThread.java:4520) 에서 에서 android.app.ActivityThread $ H.handleMessage android.os.Looper.loop (Looper.java:154)에서 android.os.Handler.dispatchMessage (Handler.java:102)에서 (ActivityThread.java:1698) android.app.ActivityThread.main (ActivityThread.java:6776) at java.lang.reflect.Method.invoke (네이티브 메소드) 에 com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.java:1518) 에서 com.android.internal.os.ZygoteInit.main (ZygoteInit.java:1408) 발생 원인 : java.lang. IllegalArgumentException : 데이터 경로는 하위 폴더 tessdata를 포함해야합니다! com.example.shaur에서 com.googlecode.tesseract.android.TessBaseAPI.init com.googlecode.tesseract.android.TessBaseAPI.init (TessBaseAPI.java:284)에서 (TessBaseAPI.java:311) 에서 로이드에서 .ocrapp.MainActivity.onActivityResult (MainActivity.java:73) android.app.ActivityThread.deliverResults (ActivityThread.java:4516)에서 android.app.Activity.dispatchActivityResult (Activity.java:7295) 에서 . app.ActivityThread.handleSendResult (ActivityThread.java:4563) android.app.ActivityThread.-wrap22 (ActivityThread.java) at android.app.ActivityThread $ H.handleMessage (ActivityThread.java:1698) at android.os.Handler.dispatchMessage (Handler.java:102) at android.os.Looper.loop (Looper.java:154)) android.app.ActivityThread.main (ActivityThread.java:6776) at java.lang.reflect.Method.호출 com.android.internal.os.ZygoteInit.main에서 com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.java:1518) 에서 (기본 방법) (ZygoteInit.java:1408)

로그 메시지에 "원인 : java.lang.IllegalArgumentException : 데이터 경로에 하위 폴더 tessdata가 있어야합니다!"라는 메시지가 명확하게 표시됩니다. 어디서이 디렉토리를 만들어야할까요? 그것은 내 전화 sdcard 어디 수동으로 폴더를 만들고 tesseract로 이름을 지정하고 eng.traineddata 데 tessdata와 하위 폴더를 추가해야합니다.

Image of my directory view

선택하고 올바른 방법을 알 수 있습니까 tessaract에 대한 내 코드의 다른 오류가 발생합니다.

+0

내가 지금까지 시도한 링크 -> http://imperialsoup.com/2016/04/29/simple-ocr-android-app-using-tesseract-tutorial/, https://stackoverflow.com/questions/12877235/ocr-android-application-that-using-tesseract –

+0

왜 경로가 "/ mnt/sdcard/tesseract/tessdata"인지 stackoverflow 응답이 혼란 스럽습니다. –

답변

1

Tesseract는 assets 폴더를 처리하지 않으므로 .datas를/data/Android/yourapppackage/assets/tesseract와 같은 액세스 할 수있는 곳으로 복사하고 해당 경로를 사용해야합니다.

나는 Tesseract 작품 만 만들었고, Tess-Two가 그 사건을 처리하는지는 모르겠다.

그런 다음 코드에서 당신이 자산에서 스트림을 취득/당신은/자산에 데이터를 추가한다고 가정하고 당신이 그것을 사용 IMPL 정팔 포체에서 다음, 내가 언급 한 경로에 장치 내부에 파일을 복사 할 수 있습니다

+0

github repo가 ​​있으면 공유 할 수 있습니까? –

+0

또한 Tessdata 폴더를 여기에 저장하는 경로를 정교하게 할 수 있습니다. C : \ Users \ shaur \ AndroidStudioProjects \ OCRapp \ app \ src \ main \ assets \ tessdata 어떻게 경로를 설정합니까? –

+0

액세스 할 수있는 폴더에서 장치에 복사해야합니다. –