4

tesseract OCR を使用して Android Studio でアプリを作成しています。電話のカメラで撮影した画像のテキストを認識するコードを作成しました。問題: tesseract 関数 getUTF8Text() はまったく結果を返しません (画像にテキストが含まれているにもかかわらず、null)。プログラムはエラーを出しません。

考えられる問題について疑問に思いました: 1. tesseract をプロジェクトに適切に統合しなかったのでしょうか? (コードで tesseract クラスを使用する場合、コンパイラは問題を表示しません) 2. コードに問題があるのでしょうか? (訓練されたデータパスが悪い??)。

メインクラス: コード:

private TessOCR Tess; 

//after taking picture I call:
PictureCallback pictureCallback = new PictureCallback() {
    @Override
    public void onPictureTaken(byte[] data, Camera camera) {
        Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0, data.length);
        String result = Tess.getOCRResult(bitmap);

        if (result != null) Log.i(TAG, result);
        else Log.i(TAG, "NO RESULT");
    }
};

tesseract トレーニング済みデータ ファイルの検索または追加、およびテキスト認識用の TessOCR クラス (コンストラクターはトレーニング済みデータ ファイルの検索専用です):

public class TessOCR {
public static final String PACKAGE_NAME = "com.example.dainius.ocr";
public static final String DATA_PATH = Environment
        .getExternalStorageDirectory().toString() + "/AndroidOCR/";
public static final String lang = "eng";

private static final String TAG = "OCR";
private TessBaseAPI mTess;

public TessOCR(AssetManager assetManager) {

    mTess = new TessBaseAPI();

    String[] paths = new String[] { DATA_PATH, DATA_PATH + "tessdata/" };

    for (String path : paths) {
        File dir = new File(path);
        if (!dir.exists()) {
            if (!dir.mkdirs()) {
                Log.v(TAG, "ERROR: Creation of directory " + path + " on sdcard failed");
                return;
            } else {
                Log.v(TAG, "Created directory " + path + " on sdcard");
            }
        }

    }

    if (!(new File(DATA_PATH + "tessdata/" + lang + ".traineddata")).exists()) {
        try {
            InputStream in = assetManager.open("tessdata/" + lang + ".traineddata");
            OutputStream out = new FileOutputStream(DATA_PATH
                    + "tessdata/" + lang + ".traineddata");

            byte[] buf = new byte[1024];
            int len;
            while ((len = in.read(buf)) > 0) {
                out.write(buf, 0, len);
            }
            in.close();
            out.close();

            Log.v(TAG, "Copied " + lang + " traineddata");
        } catch (IOException e) {
            Log.e(TAG, "Was unable to copy " + lang + " traineddata " + e.toString());
        }
    }

    mTess.setDebug(true);
    mTess.init(DATA_PATH, lang);
}

public String getOCRResult(Bitmap bitmap) {

    mTess.setImage(bitmap);
    String result = mTess.getUTF8Text();

    return result;
}

public void onDestroy() {
    if (mTess != null)
        mTess.end();
}
  • この問題の原因が tesseract の不適切な統合である場合は、統合方法に関する適切なチュートリアルを投稿してください。インターネット上のすべてのチュートリアルは互いに異なっており、適切に統合する方法を理解するのは難しいためです。
4

2 に答える 2

2

私は Tesseract (tess4j) を使用してきました。非常に鮮明なテキストと完全にモノクロ/グレースケールの画像を使用してみましたか? Tesseract に画像を読み取らせようとしているとき、Tesseract が読みやすいように画像を操作することに時間を費やす方がはるかに便利であることがわかりました。

それでも出力を生成できず、エラーが表示されない場合は、ここにアクセスして、チュートリアルで Tesseract のセットアップを再開し、すべてのヒントに従います。難しいことではありません。.dll は自動的に抽出およびロードされます。tessdataフォルダーが正しい場所(ルートディレクトリ)にあり、すべての.jarがあることを確認してください(必要なのは4つだけで、すべてではありませんが、tess4j.sourceforge.comのチュートリアルを確認してください)。 -時間ライブラリ。

彼らのウェブサイトからの抜粋: 「OCR 用の画像は、解像度が少なくとも 200 DPI である必要があります。通常は 300 DPI、1 bpp (ピクセルあたりのビット数) のモノクロームまたは 8 bpp のグレースケールの非圧縮 TIFF または PNG 形式です。」正直なところ、読みやすい高解像度のドキュメントをスキャンするための PDF ツール以外に、Tesseract にはあまり運がありませんでした。

私も最初はうまくいきませんでした。

于 2016-01-03T22:22:17.847 に答える
0

私の問題の原因は、外部ストレージへの書き込みを許可しなかったことです。アセット フォルダーからファイルを抽出するために誰かがこの方法を適用しようとする場合 (この github プロジェクトからこの方法を取得)、マニフェスト ( AndroidManifest.xmlファイル)に外部ストレージ コード行を書き込む権限を追加してください。

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
于 2016-01-06T20:27:28.643 に答える