文字認識をしたい
androidStudioでファイルに保存してある画像から文字認識を行うアプリを作っています。
実際に起動するところまではできたのですが、
ファイル一覧から画像を選択するとアプリが落ちてしまいます。
数字だけでも読めるようにしたいです。
該当のソースコード
java
package com.example.image_view; import androidx.activity.result.ActivityResultLauncher; import androidx.activity.result.contract.ActivityResultContracts; import androidx.appcompat.app.AppCompatActivity; import android.app.Activity; import android.content.Intent; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.net.Uri; import android.os.Bundle; import android.os.ParcelFileDescriptor; import android.text.method.ScrollingMovementMethod; import android.view.View; import android.widget.ImageView; import android.widget.TextView; import com.googlecode.tesseract.android.TessBaseAPI; import java.io.File; import java.io.FileDescriptor; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; public class MainActivity extends AppCompatActivity { private ImageView imageView; private TextView textView; static final String DEFAULT_LANGUAGE = "eng"; static String traineddata = "/tessdata/"+DEFAULT_LANGUAGE+".traineddata"; TessBaseAPI tessBaseAPI; String filepath; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); imageView = findViewById(R.id.image_view); textView = findViewById(R.id.textView); textView.setMovementMethod(new ScrollingMovementMethod()); findViewById(R.id.button2).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT); intent.addCategory(Intent.CATEGORY_OPENABLE); intent.setType("image/*"); activityResultLauncher.launch(intent); } }); } private void checkFile(File file) { if (!file.exists() && file.mkdirs()){ copyFiles(); } if(file.exists()) { String datafilepath = filepath+ traineddata; File datafile = new File(datafilepath); if (!datafile.exists()) { copyFiles(); } } } private void copyFiles() { try { String datapath = filepath + traineddata; InputStream instream = getAssets().open(traineddata); OutputStream outstream = new FileOutputStream(datapath); byte[] buffer = new byte[1024]; int read; while ((read = instream.read(buffer)) != -1) { outstream.write(buffer, 0, read); } outstream.flush(); outstream.close(); instream.close(); File file = new File(datapath); if (!file.exists()) { throw new FileNotFoundException(); } } catch (Exception ex) { ex.printStackTrace(); } } private final ActivityResultLauncher<Intent> activityResultLauncher = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), result -> { if (result.getResultCode() == Activity.RESULT_OK) { Bitmap bmp = null; if (result.getData() != null) { Uri uri = null; uri = result.getData().getData(); try { bmp = getBitmapFromUri(uri); imageView.setImageBitmap(bmp); } catch (IOException e) { e.printStackTrace(); } } filepath = getFilesDir() + "/tesseract/"; tessBaseAPI = new TessBaseAPI(); checkFile(new File(filepath + "tessdata/")); tessBaseAPI.init(filepath, DEFAULT_LANGUAGE); tessBaseAPI.setImage(bmp); String res = tessBaseAPI.getUTF8Text(); textView.setText(res); } }); private Bitmap getBitmapFromUri(Uri uri) throws IOException { ParcelFileDescriptor parcelFileDescriptor = getContentResolver().openFileDescriptor(uri, "r"); FileDescriptor fileDescriptor = parcelFileDescriptor.getFileDescriptor(); Bitmap image = BitmapFactory.decodeFileDescriptor(fileDescriptor); parcelFileDescriptor.close(); return image; } }
試したこと
実装するものとは別のスマホだと文字認識をすることができたのですが、文字認識の設定言語を英語(eng)にすると選択するところで落ちるようになってしまいました。
補足情報(FW/ツールのバージョンなど)
文字認識はtess-two:9.1.0を使用しています。
実装したいタブレットはLAVIE社のPC-T1295DASを使用しています。OSはandroid11です
また、テスト用に使用したスマホはXperia5ⅢでOSはAndroid12です。
まだ回答がついていません
会員登録して回答してみよう