###前提・実現したいこと
androidでカメラからの画像を取得してtess-twoで文字認識したいと思っています。
###発生している問題・エラーメッセージ
tess-twoの導入はうまくできていると思います。
しかし、カメラで撮影した画像を取得するのに失敗してしまいます。
以下 Emulator Nexus_5X_API_24 で起動した際のエラーメッセージです。(2行目の cancel ? がカメラからの画像を取得できなかった時のエラーコードだと思われます。)
D/EGL_emulation: eglMakeCurrent: 0xa35b2360: ver 2 0 (tinfo 0x9ed9e780) D/debug: cancel ? D/EGL_emulation: eglMakeCurrent: 0xa35b2360: ver 2 0 (tinfo 0x9ed9e780) I/Tesseract(native): Initialized Tesseract API with language=jpn E/ReadFile: Bitmap must be non-null D/AndroidRuntime: Shutting down VM E/AndroidRuntime: FATAL EXCEPTION: main Process: com.reward.ocrcamera8, PID: 5081 java.lang.RuntimeException: Failed to read bitmap at com.googlecode.tesseract.android.TessBaseAPI.setImage(TessBaseAPI.java:520) at com.reward.ocrcamera8.MainActivity$1.onClick(MainActivity.java:56) at android.view.View.performClick(View.java:5610) at android.view.View$PerformClick.run(View.java:22265) at android.os.Handler.handleCallback(Handler.java:751) at android.os.Handler.dispatchMessage(Handler.java:95) at android.os.Looper.loop(Looper.java:154) at android.app.ActivityThread.main(ActivityThread.java:6077) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:866) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:756)
###該当のソースコード
java
1public class MainActivity extends AppCompatActivity { 2 3 static final String DEFAULT_LANGUAGE = "jpn"; 4 5 String filepath; 6 Bitmap bitmap = null; 7 TessBaseAPI tessBaseAPI; 8 9 10 private final static int RESULT_CAMERA = 1001; 11 12 @Override 13 protected void onCreate(Bundle savedInstanceState) { 14 super.onCreate(savedInstanceState); 15 setContentView(R.layout.activity_main); 16 17 Button button = (Button) findViewById(R.id.button1); 18 button.setOnClickListener(new View.OnClickListener() { 19 //tess-two起動 20 @Override 21 public void onClick(View view) { 22 23 filepath = getFilesDir() + "/tesseract/"; 24 25 tessBaseAPI = new TessBaseAPI(); 26 27 checkFile(new File(filepath + "tessdata/")); 28 29 tessBaseAPI.init(filepath, DEFAULT_LANGUAGE); 30 31 //9行目のエラー 32 tessBaseAPI.setImage(bitmap); 33 String result = tessBaseAPI.getUTF8Text(); 34 Intent intent2 = new Intent(MainActivity.this, Result.class); 35 intent2.putExtra("result", result); 36 startActivity(intent2); 37 } 38 }); 39 Button button2 = (Button) findViewById(R.id.button2); 40 button2.setOnClickListener(new View.OnClickListener() { 41 //カメラアプリ起動 42 @Override 43 public void onClick(View view) { 44 Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 45 startActivityForResult(intent, RESULT_CAMERA); 46 } 47 }); 48 } 49 50 @Override 51 public void onActivityResult(int requestCode, int resultCode, Intent data) { 52 if (requestCode == RESULT_CAMERA) { 53 if (data.getExtras() != null) { 54 //2行目のエラー 55 Log.d("debug", "cancel ?"); 56 return; 57 } else { 58 bitmap = (Bitmap) data.getExtras().get("data"); 59 60 int bmpWidth = bitmap.getWidth(); 61 int bmpHeight = bitmap.getHeight(); 62 Log.d("debug", String.format("w= %d", bmpWidth)); 63 Log.d("debug", String.format("h= %d", bmpHeight)); 64 } 65 } 66 } 67 68 private void checkFile(File file) { 69 if (!file.exists() && file.mkdirs()) { 70 copyFiles(); 71 } 72 if (file.exists()) { 73 String datafilepath = filepath + "/tessdata/jpn.traineddata"; 74 File datafile = new File(datafilepath); 75 76 if (!datafile.exists()) { 77 copyFiles(); 78 } 79 } 80 } 81 82 private void copyFiles() { 83 try { 84 String datapath = filepath + "/tessdata/jpn.traineddata"; 85 InputStream instream = getAssets().open("tessdata/jpn.traineddata"); 86 OutputStream outstream = new FileOutputStream(datapath); 87 88 byte[] buffer = new byte[1024]; 89 int read; 90 while ((read = instream.read(buffer)) != -1) { 91 outstream.write(buffer, 0, read); 92 } 93 94 outstream.flush(); 95 outstream.close(); 96 instream.close(); 97 98 File file = new File(datapath); 99 if (!file.exists()) { 100 throw new FileNotFoundException(); 101 } 102 } catch (Exception ex) { 103 ex.printStackTrace(); 104 } 105 } 106}
###試したこと
実機(Huawei p9 lite api24)で起動した際にも同様のエラーが発生します。
ネットからお借りしたカメラ起動のコード(補足情報に記載)を起動したときにはこのエラーは起こりませんでした。
どうすればこのエラーを回避できますか。どうぞよろしくお願いします。
###補足情報(言語/FW/ツール等のバージョンなど)
androidstudio3.0.1
tess-two8.0.0 使用
以下カメラ起動のコードです
[https://akira-watson.com/android/camera-intent.html]様よりお借りしました。
java
1public class MainActivity extends AppCompatActivity { 2 private final static int RESULT_CAMERA = 1001; 3 private ImageView imageView; 4 5 @Override 6 protected void onCreate(Bundle savedInstanceState) { 7 super.onCreate(savedInstanceState); 8 setContentView(R.layout.activity_main); 9 imageView = findViewById(R.id.image_view); 10 11 Button cameraButton = findViewById(R.id.camera_button); 12 cameraButton.setOnClickListener(new View.OnClickListener() { 13 @Override 14 public void onClick(View v) { 15 Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 16 startActivityForResult(intent, RESULT_CAMERA); 17 } 18 }); 19 } 20 @Override 21 protected void onActivityResult(int requestCode, int resultCode, Intent data) { 22 if (requestCode == RESULT_CAMERA) { 23 Bitmap bitmap; 24 // cancelしたケースも含む 25 if( data.getExtras() == null){ 26 Log.d("debug","cancel ?"); 27 return; 28 } 29 else{ 30 bitmap = (Bitmap) data.getExtras().get("data"); 31 32 // 画像サイズを計測 33 int bmpWidth = bitmap.getWidth(); 34 int bmpHeight = bitmap.getHeight(); 35 Log.d("debug",String.format("w= %d",bmpWidth)); 36 Log.d("debug",String.format("h= %d",bmpHeight)); 37 } 38 39 imageView.setImageBitmap(bitmap); 40 } 41 } 42}
回答1件
あなたの回答
tips
プレビュー