【问题标题】:Tesseract gives no recognition results (Android studio; Java)Tesseract 没有给出识别结果(Android studio;Java)
【发布时间】:2016-01-03 21:25:49
【问题描述】:

我正在使用 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");
    }
};

TessOCR 类用于 tesseract 训练数据文件查找或添加和文本识别(构造函数仅用于查找训练数据文件):

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集成不好造成的,请发一个正确的集成教程,因为网上每个教程都不一样,很难理解如何正确集成。

【问题讨论】:

    标签: java android-studio ocr tesseract text-recognition


    【解决方案1】:

    我使用过 Tesseract (tess4j)。您是否尝试过使用文本非常清晰且完全单色/灰度的图像?我发现,当我试图让 Tesseract 读取我的图像时,花时间操纵图像以使 Tesseract 更容易使用会更有用。

    如果您仍然无法让它产生输出并且它没有显示任何错误,我会去here 并按照教程重新启动 Tesseract 设置并按照他们的所有提示进行操作。应该不会太难,.dll 会自动提取和加载。只需确保您的 tessdata 文件夹位于正确的位置(根目录)并且您拥有所有的 .jar(我认为您只需要 4 个,不是全部,但请查看 tess4j.sourceforge.com 上的教程)作为编译-time 图书馆。

    取自他们的网站:“用于 OCR 的图像应具有至少 200 DPI 的分辨率,通常为 300 DPI、1 bpp(每像素位)单色或 8 bpp 灰度未压缩 TIFF 或 PNG 格式。”老实说,除了他们的 PDF 工具可以扫描易于阅读的高分辨率文档之外,我对 Tesseract 的运气并不好。

    我第一次也没有让它工作,因为它的价值。

    【讨论】:

    • 感谢您的回答,普雷斯顿。我如何将 tesseract 集成到我的项目中存在一些问题,因此我通过另一个教程重新集成了它。尽管如此,我的问题还没有解决,所以我在回答我的问题时解释了我是如何做到的。我对 android studio 很陌生(虽然对编程不是很新),将它与 tesseract 一起使用让我感到头疼,所以谢谢你的回答,它真的扩展了我对这个工具的看法。
    【解决方案2】:

    我的问题的原因是我没有写入外部存储的权限。如果有人会尝试应用此方法从 assets 文件夹中提取文件(从 this github project 获得此方法),请确保您将写入外部存储代码行的权限添加到您的清单(AndroidManifest.xml 文件):

    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-11-23
      • 2011-06-01
      • 2018-01-18
      • 1970-01-01
      • 1970-01-01
      • 2020-02-12
      • 1970-01-01
      • 2015-08-12
      相关资源
      最近更新 更多