光学字符识别引擎Tesseract无法识别结果(Android Studio;Java)

4

我正在使用tesseract OCR在Android Studio上开发一个应用程序。我编写了一段代码,该代码应该能够识别手机相机拍摄的图像上的文本。问题是:tesseract函数 getUTF8Text() 没有返回任何结果(即使图片上有文本)。程序没有报错。

我考虑可能存在以下问题: 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 类用于查找或添加训练数据文件并进行文本识别(构造函数仅用于查找训练数据文件):

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集成不良引起的,请发布一份适当的教程来介绍如何进行集成,因为互联网上的每篇教程都不同,很难理解如何正确地操作。
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并没有太多运气。

值得一提的是,我第一次也没有使其工作。


谢谢你的回答,Preston。我在集成 Tesseract 到我的项目中遇到了一些问题,所以我参照另一个教程重新进行了集成。不过,我的问题还没有解决,所以我在我的问题答案中解释了我是如何做的。虽然我对编程不是很陌生,但我对 Android Studio 还比较新手,使用它和 Tesseract 让我感觉像头疼一样,所以非常感谢你的回答,它真正扩展了我对这个工具的视野。 - Dainius Šaltenis

0
我的问题的原因是我没有请求写入外部存储的权限。如果有人尝试使用这种方法从资产文件夹中提取文件(从this github project获取此方法),请确保将写入外部存储代码行的权限添加到您的清单文件(AndroidManifest.xml文件)中:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接