Android

【Android】 画像からの文字認識を実装

説明

Androidで画像から文字の認識をする実装をします。
使うライブラリ:tess-two
Git:
https://github.com/rmtheis/tess-two

実装説明

・NDKのインストールが終わっていない場合は、
インストールを行います。

・下記URLから文字データをダウンロードします。
https://github.com/tesseract-ocr/tessdata/tree/3.04.00
日本語の場合は、jpn.traineddataをダウンロードします。
英語の場合は、eng.traineddataをダウンロードします。

assetsフォルダを作成し、その中にtessdataフォルダを作成します。
tessdataフォルダにダウンロードしたデータを入れます。

・文字認識する画像を用意し、drawableフォルダに入れます。
私は下記画像を使用します。

・ライブラリを追加します。

compile 'com.rmtheis:tess-two:7.0.0'

以下はサンプルコードで説明します。

サンプル

activity_main.xml

文字を認識する画像とボタンを配置しておきます。

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@android:color/white">

    <ImageView
        android:id="@+id/image_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_above="@+id/button"
        android:scaleType="fitCenter"
        android:src="@drawable/image2" />

    <Button
        android:id="@+id/button"
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:layout_alignParentBottom="true"
        android:background="@color/colorAccent"
        android:text="画像認識"
        android:textAppearance="?android:attr/textAppearanceLarge"
        android:textColor="@android:color/white" />


</RelativeLayout>

MainActivity.java

public class MainActivity extends AppCompatActivity {

    static final String DEFAULT_LANGUAGE = "jpn";
  
    String filepath;
    Bitmap bitmap;
    TessBaseAPI tessBaseAPI;

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

        bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.image2);

        filepath = getFilesDir() + "/tesseract/";

        tessBaseAPI = new TessBaseAPI();

        checkFile(new File(filepath + "tessdata/"));

        tessBaseAPI.init(filepath, DEFAULT_LANGUAGE);

        Button button = (Button) findViewById(R.id.button);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                tessBaseAPI.setImage(bitmap);
                String result = tessBaseAPI.getUTF8Text();
                Intent intent = new Intent(MainActivity.this, NextActivity.class);
                intent.putExtra("result", result);
                startActivity(intent);
            }
        });

    }

    private void checkFile(File file) {
        if (!file.exists() && file.mkdirs()){
            copyFiles();
        }
        if(file.exists()) {
            String datafilepath = filepath+ "/tessdata/jpn.traineddata";
            File datafile = new File(datafilepath);

            if (!datafile.exists()) {
                copyFiles();
            }
        }
    }

    private void copyFiles() {
        try {
            String datapath = filepath + "/tessdata/jpn.traineddata";
            InputStream instream = getAssets().open("tessdata/jpn.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();
        }
    }
}

・文字認識をするために
tessBaseAPI.init(filepath, DEFAULT_LANGUAGE)で、文字データのファイルパスと言語を設定します。
英語の場合は、engに設定します。
※filePathにデータが無い場合は、エラーがでます。
そのため、checkFileでファイルの有無を確認し、無い場合はfilepathにデータをコピーしています。

ボタン押下後、
tessBaseAPI.setImage(bitmap)で文字認識する画像を設定しています。
tessBaseAPI.getUTF8Text()で文字認識した文字列を返しています。

完成したスクリーンショットです。

日本語部分は認識出来ていますね。
以上です。

1 Comment

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です