내 프로젝트에서이 두 가지 방법을 사용하고 있습니다. 자습서를 많이 읽었지만 아무 도움도받지 못했습니다.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와 하위 폴더를 추가해야합니다.
선택하고 올바른 방법을 알 수 있습니까 tessaract에 대한 내 코드의 다른 오류가 발생합니다.
내가 지금까지 시도한 링크 -> http://imperialsoup.com/2016/04/29/simple-ocr-android-app-using-tesseract-tutorial/, https://stackoverflow.com/questions/12877235/ocr-android-application-that-using-tesseract –
왜 경로가 "/ mnt/sdcard/tesseract/tessdata"인지 stackoverflow 응답이 혼란 스럽습니다. –