質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

Q&A

解決済

1回答

648閲覧

androidstudioでカメラ画像を取得できない

reward

総合スコア8

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

1グッド

2クリップ

投稿2018/01/13 20:52

編集2018/01/13 21:44

###前提・実現したいこと
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}
退会済みユーザー👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

aja

2018/01/15 03:02

ファイルの操作方法が古いような気がします。参考サイトの保存をしている方を参考にすべきで、上のコードは画像を保存しないケース。
guest

回答1

0

自己解決

ajaさん、ご指摘ありがとうございます。
画像を保存する方法で試してみましたところ、うまくtessーtwoに画像を渡すことができました。
今のところはまだうまく認識できず、認識結果に漢字や記号がたくさん表示されてしまうのですが、画像は渡すことができたので質問を閉じさせて頂きます。ありがとうございました。
念のため、ソースコードを以下に載せておきます。

java

1public class MainActivity extends AppCompatActivity { 2 3 private final static int RESULT_CAMERA = 1001; 4 private final static int REQUEST_PERMISSION = 1002; 5 static final String DEFAULT_LANGUAGE = "jpn"; 6 7 String filepath; 8 9 TessBaseAPI tessBaseAPI; 10 11 ImageView imageView; 12 private Uri cameraUri; 13 private String filePath; 14 15 Bitmap bitmap; 16 17 @Override 18 protected void onCreate(Bundle savedInstanceState) { 19 super.onCreate(savedInstanceState); 20 Log.d("debug","onCreate()"); 21 setContentView(R.layout.activity_main); 22 imageView = findViewById(R.id.image_view); 23 24 25 26 Button button = (Button) findViewById(R.id.button); 27 button.setOnClickListener(new View.OnClickListener() { 28 @Override 29 public void onClick(View view) { 30 31 32 filepath = getFilesDir() + "/tesseract/"; 33 34 tessBaseAPI = new TessBaseAPI(); 35 36 checkFile(new File(filepath + "tesseract/tessdata/")); 37 38 tessBaseAPI.init(filepath, DEFAULT_LANGUAGE); 39 40 tessBaseAPI.setImage(bitmap); 41 String result = tessBaseAPI.getUTF8Text(); 42 Intent intent2 = new Intent(MainActivity.this, Result.class); 43 intent2.putExtra("result", result); 44 startActivity(intent2); 45 46 } 47 }); 48 49 Button cameraButton = findViewById(R.id.camera_button); 50 cameraButton.setOnClickListener(new View.OnClickListener() { 51 @Override 52 public void onClick(View v) { 53 // Android 6, API 23以上でパーミッシンの確認 54 if (Build.VERSION.SDK_INT >= 23) { 55 checkPermission(); 56 } 57 else { 58 cameraIntent(); 59 } 60 } 61 }); 62 } 63 64 private void cameraIntent(){ 65 Log.d("debug","cameraIntent()"); 66 67 // 保存先のフォルダーを作成 68 File cameraFolder = new File( 69 Environment.getExternalStoragePublicDirectory( 70 Environment.DIRECTORY_PICTURES),"IMG"); 71 cameraFolder.mkdirs(); 72 73 // 保存ファイル名 74 String fileName = new SimpleDateFormat( 75 "ddHHmmss", Locale.US).format(new Date()); 76 filePath = String.format("%s/%s.jpg", cameraFolder.getPath(),fileName); 77 Log.d("debug","filePath:"+filePath); 78 79 // capture画像のファイルパス 80 File cameraFile = new File(filePath); 81 cameraUri = FileProvider.getUriForFile( 82 MainActivity.this, 83 getApplicationContext().getPackageName() + ".provider", 84 cameraFile); 85 86 Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 87 intent.putExtra(MediaStore.EXTRA_OUTPUT, cameraUri); 88 startActivityForResult(intent, RESULT_CAMERA); 89 90 Log.d("debug","startActivityForResult()"); 91 } 92 93 @Override 94 public void onActivityResult(int requestCode, 95 int resultCode, Intent intent) { 96 if (requestCode == RESULT_CAMERA) { 97// tess-twoに渡すためにurlからbitmapに変換 98 if(cameraUri != null) { 99 try { 100 bitmap = MediaStore.Images.Media.getBitmap(getContentResolver(), cameraUri); 101 } catch (IOException e) { 102 e.printStackTrace(); 103 } 104//撮影した画像のプレビュー 105 imageView.setImageBitmap(bitmap); 106 registerDatabase(filePath); 107 }else{ 108 Log.d("debug","cameraUri == null"); 109 } 110 } 111 } 112 113 // アンドロイドのデータベースへ登録する 114 private void registerDatabase(String file) { 115 ContentValues contentValues = new ContentValues(); 116 ContentResolver contentResolver = MainActivity.this.getContentResolver(); 117 contentValues.put(MediaStore.Images.Media.MIME_TYPE, "image/jpeg"); 118 contentValues.put("_data", file); 119 contentResolver.insert( 120 MediaStore.Images.Media.EXTERNAL_CONTENT_URI,contentValues); 121 } 122 123 // Runtime Permission check 124 private void checkPermission(){ 125 // 既に許可している 126 if (ActivityCompat.checkSelfPermission(this, 127 Manifest.permission.WRITE_EXTERNAL_STORAGE) == 128 PackageManager.PERMISSION_GRANTED){ 129 cameraIntent(); 130 } 131 // 拒否していた場合 132 else{ 133 requestPermission(); 134 } 135 } 136 137 // 許可を求める 138 private void requestPermission() { 139 if (ActivityCompat.shouldShowRequestPermissionRationale(this, 140 Manifest.permission.WRITE_EXTERNAL_STORAGE)) { 141 ActivityCompat.requestPermissions(MainActivity.this, 142 new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 143 REQUEST_PERMISSION); 144 145 } else { 146 Toast toast = Toast.makeText(this, 147 "許可されないとアプリが実行できません", 148 Toast.LENGTH_SHORT); 149 toast.show(); 150 151 ActivityCompat.requestPermissions(this, 152 new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE,}, 153 REQUEST_PERMISSION); 154 155 } 156 } 157 158 // 結果の受け取り 159 @Override 160 public void onRequestPermissionsResult(int requestCode, 161 @NonNull String[] permissions, 162 @NonNull int[] grantResults) { 163 164 Log.d("debug","onRequestPermissionsResult()"); 165 166 if (requestCode == REQUEST_PERMISSION) { 167 // 使用が許可された 168 if (grantResults[0] == PackageManager.PERMISSION_GRANTED) { 169 cameraIntent(); 170 171 } else { 172 // それでも拒否された時の対応 173 Toast toast = Toast.makeText(this, 174 "これ以上なにもできません", Toast.LENGTH_SHORT); 175 toast.show(); 176 } 177 } 178 } 179 180 181 @Override 182 protected void onStart() { 183 super.onStart(); 184 Log.d("debug","onStart()"); 185 } 186 187 @Override 188 protected void onRestart() { 189 super.onRestart(); 190 Log.d("debug","onRestart()"); 191 } 192 193 @Override 194 protected void onResume() { 195 super.onResume(); 196 Log.d("debug","onResume()"); 197 } 198 199 @Override 200 protected void onPause() { 201 super.onPause(); 202 Log.d("debug","onPause()"); 203 } 204 205 @Override 206 protected void onStop() { 207 super.onStop(); 208 Log.d("debug","onStop()"); 209 } 210 211 @Override 212 protected void onDestroy() { 213 super.onDestroy(); 214 Log.d("debug","onDestroy()"); 215 } 216 217 private void checkFile(File file) { 218 if (!file.exists() && file.mkdirs()) { 219 copyFiles(); 220 } 221 if (file.exists()) { 222 String datafilepath = filepath + "/tesseract/tessdata/jpn.traineddata"; 223 File datafile = new File(datafilepath); 224 225 if (!datafile.exists()) { 226 copyFiles(); 227 } 228 } 229 } 230 231 private void copyFiles() { 232 try { 233 String datapath = filepath + "/tesseract/tessdata/jpn.traineddata"; 234 InputStream instream = getAssets().open("tesseract/tessdata/jpn.traineddata"); 235 OutputStream outstream = new FileOutputStream(datapath); 236 237 byte[] buffer = new byte[1024]; 238 int read; 239 while ((read = instream.read(buffer)) != -1) { 240 outstream.write(buffer, 0, read); 241 } 242 243 outstream.flush(); 244 outstream.close(); 245 instream.close(); 246 247 File file = new File(datapath); 248 if (!file.exists()) { 249 throw new FileNotFoundException(); 250 } 251 } catch (Exception ex) { 252 ex.printStackTrace(); 253 } 254 } 255 256}

投稿2018/01/15 19:22

reward

総合スコア8

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問