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

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

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

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Android Studio

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

Q&A

解決済

4回答

2091閲覧

Androidでtess-twoを使う際にinitで言語データを読み込めない

meru

総合スコア12

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Android Studio

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

0グッド

0クリップ

投稿2021/06/11 08:13

編集2021/06/14 01:37

以下のサイトを参考にAndroidでtess-twoを使って画像から文字を認識しようとしています。
https://qiita.com/tarumzu/items/9eaa9c13041a4f8ed63c
https://www.kunimiyasoft.com/program_tess_two/

言語データを読み込む段階の、initのタイミングで以下のエラーが出てしまいます。

Caused by: java.lang.IllegalArgumentException: Data path must contain subfolder tessdata!

build.gradleとinitの部分は以下のように記載しています。

build.gradle

dependencies {   ・   ・   ・ implementation("com.rmtheis:tess-two:9.0.0") implementation("androidx.exifinterface:exifinterface:1.0.0") }

MainActivity.java

Android

1 2 3 TessBaseAPI tessBaseAPI = new TessBaseAPI(); 4 5 tessBaseAPI.init(getFilesDir().toString(), "jpn");

言語ファイルは「jpn.traineddata」をダウンロードして、Android Studio左ツリーのAndroidで見た場合の「app」-「assets」-「tessdata」、Projectで見た場合の「app」-「src」-「main」-「assets」-「tessdata」の下に配置しています。
tessdataディレクトリは、assetsディレクトリを右クリックから「New」-「Directory」で作成しました。

言語ファイルを入れる箇所が違う、initのパスの指定の仕方が違うなど気づく点がありましたら教えていただけますと幸いです。

何卒よろしくお願いいたします。

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

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

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

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

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

guest

回答4

0

自己解決

以下のように事前にassets内のファイルをデバイスのfilesフォルダ配下(/data/user/0/パッケージ/files/tessdata)にコピーすることが解決することができました。

Android

1 File dir = new File(getFilesDir().toString() + "/tessdata/"); 2 3 if (!dir.exists()) { 4 dir.mkdirs(); 5 } 6 7 try { 8 InputStream inputStream = getAssets().open("jpn.traineddata"); 9 FileOutputStream fileOutputStream = new FileOutputStream(new File(dir + "/" + "jpn.traineddata"), false); 10 11 byte[] buffer = new byte[1024]; 12 int length = 0; 13 while ((length = inputStream.read(buffer)) >= 0) { 14 fileOutputStream.write(buffer, 0, length); 15 } 16 17 fileOutputStream.close(); 18 inputStream.close(); 19 } catch (IOException e) { 20 }

ありがとうございました。

投稿2021/06/21 03:06

meru

総合スコア12

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

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

sansyou69

2021/06/21 04:08

無事に解決できて、何よりです。お力になれず、申し訳ありません。
guest

0

assetsフォルダの関係でトラブルが起きる場合は、作り方が原因で発生する場合が多いようなので、いけると考えたのですが・・ダメでしたか。

確認ですが、一番はじめにご掲示されたURLに記されている、

val baseApi = TessBaseAPI()

もしくは、二番目にご掲示のURLの

private TessBaseAPI tessBaseAPI

は、省略されたものが上がっているので私からは見えないだけで、実際のコードには記されている、と考えてもよろしいのでしょうか?

(※今回お作りになられているケースだと、baseApi→tessBaseAPIになるかも?)

あと、多分二番目のURLに準じてお作りになられてるのかな、と思いますが、とりあえずassetsフォルダではなく、直にtessdataを置くかたちで作り、その場合はこのページ通り上手くいくか、試してみたらどうでしょうか。

(※私だったらそうする、と思うので書いていますが、もし気が進まないようであれば無視してけっこうです)

投稿2021/06/20 06:43

編集2021/06/20 07:23
sansyou69

総合スコア31

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

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

meru

2021/06/21 01:03

ご回答ありがとうございます。 はい、最初は上部に「private TessBaseAPI tessBaseAPI」と記載していましたが、質問するにあたって「TessBaseAPI tessBaseAPI = new TessBaseAPI();」と一行にまとめて記載しています。 どちらの記載でも同様のエラーが出ています。 tessdataフォルダの置き場所について、assetsフォルダ以外のすべての場所に配置して実験してみましたが、それでも同様の結果となってしまいました。
guest

0

tessdataディレクトリは、assetsディレクトリを右クリックから「New」-「Directory」で作成しました。

たぶん、これだと思うのですが・・・。
「Directory」ではなく、以下の画像のassets専用のディレクトリ作成方法があるので、お試しいただけるでしょうか。

イメージ説明

投稿2021/06/18 16:18

sansyou69

総合スコア31

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

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

meru

2021/06/20 00:55

ご回答ありがとうございます。 assetsフォルダは「Assets Folder」として作成しており、tessdataフォルダについても「Assets Folder」として作成してみましたが、同様のエラーが出てしまうようです。
guest

0

私も答えられるほど高いレベルの知識はないのですが、他にアンサーも付いてないようですので、何かのヒントになればと思います。
(もう既に見ていた上での質問なら、すいません)

以下URLをクリックしてください。

【和訳】Tesseract「java.lang.IllegalArgumentException。データパスにはサブフォルダーtessdataが含まれている必要があります」

リンク内容

これを見た限りだと、不要なパス(=tessdata)をどこかに書き込んでいるのかな、と。

「データパスに「tessdata」を追加しないでください。init()メソッドがそれを追加します。」
このあたりが、キモのような気がします。

投稿2021/06/18 07:45

編集2021/06/18 07:58
sansyou69

総合スコア31

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

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

meru

2021/06/18 08:01

ご回答ありがとうございます。 こちらのページ確認いたしました。 元々initの際のパスにはtessdataを入れないように書いていて、パス直書きなども試してみたのですが、同じエラーが出てしまうようです。 getFilesDir().toString()を出力した結果は「/data/user/0/パッケージ/files/」となっているのですが、この指す場所が思っている配置場所(assets配下)とは違うということなのでしょうか。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問