説明
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()で文字認識した文字列を返しています。
完成したスクリーンショットです。
日本語部分は認識出来ていますね。
以上です。
I have learn some good stuff here. Certainly price bookmarking for revisiting. abdcedgeddeg