为什么Tesseract for Android在使用" equ.traineddata"时会返回乱码。检测数学符号或方程?

时间:2015-04-09 00:49:31

标签: android android-ndk ocr tesseract

我们希望开发应用程序从图像中提取文本,并提取和解决数学方程 使用Tesseract OCR Engine从图像中获取提取文本 但是当我们试图从图像中提取方程时,结果令人失望 我们一直在使用版本3.01我们预计这是问题的原因 因此,我们在存储库https://github.com/rmtheis/tess-two中构建了最新版本的Tesseract 我们使用官方培训的数据文件 eng.traineddata检测文本,这很好,equ.traineddata检测数学符号和数学方程, 但没有给出预期的结果。

非常感谢任何帮助。感谢。

protected String onPhotoTaken()
{
    // lang.traineddata file with the app (in assets folder)
    // You can get them at:
    // http://code.google.com/p/tesseract-ocr/downloads/list
    // This area needs work and optimization
    boIsTaken = true;

    BitmapFactory.Options options = new BitmapFactory.Options();
    options.inSampleSize = 4;

    Bitmap bitmap = BitmapFactory.decodeFile(strTakenPicPath, options);

    try {
        ExifInterface exif = new ExifInterface(strTakenPicPath);
        int exifOrientation = exif.getAttributeInt(
                ExifInterface.TAG_ORIENTATION,
                ExifInterface.ORIENTATION_NORMAL);

        Log.v(TAG, "Orient: " + exifOrientation);

        int rotate = 0;

        switch (exifOrientation) {
        case ExifInterface.ORIENTATION_ROTATE_90:
            rotate = 90;
            break;
        case ExifInterface.ORIENTATION_ROTATE_180:
            rotate = 180;
            break;
        case ExifInterface.ORIENTATION_ROTATE_270:
            rotate = 270;
            break;
        }

        Log.v(TAG, "Rotation: " + rotate);

        if (rotate != 0) {

            // Getting width & height of the given image.
            int w = bitmap.getWidth();
            int h = bitmap.getHeight();

            // Setting pre rotate
            Matrix mtx = new Matrix();
            mtx.preRotate(rotate);

            // Rotating Bitmap
            bitmap = Bitmap.createBitmap(bitmap, 0, 0, w, h, mtx, false);
        }

        // Convert to ARGB_8888, required by tess
        bitmap = bitmap.copy(Bitmap.Config.ARGB_8888, true);

    } catch (IOException e) {
        Log.e(TAG, "Couldn't correct orientation: " + e.toString());
    }

    // _image.setImageBitmap( bitmap );

    Log.v(TAG, "Before baseApi");

    TessBaseAPI baseApi = new TessBaseAPI();
    Log.v(TAG, "initialize baseApi");
    baseApi.setDebug(true);
    //getLang() returns equ in case of equations detection  
    baseApi.init(DATA_PATH, getLang());
    Log.v(TAG, "init baseApi done");
    baseApi.setImage(bitmap);

    String recognizedText = baseApi.getUTF8Text();

    baseApi.end();

    // You now have the text in recognizedText var, you can do anything with it.
    // We will display a stripped out trimmed alpha-numeric version of it (if lang is eng)
    // so that garbage doesn't make it to the display.

    Log.v(TAG, "Detected TEXT: " + recognizedText);

    if ( getLang().equalsIgnoreCase("eng") ) {
        recognizedText = recognizedText.replaceAll("[^a-zA-Z0-9]+", " ");
    }

    recognizedText = recognizedText.trim();
    return recognizedText;

    // Cycle done.
}//end onPhotoTaken

image that contains equation And Tesseract result

2 个答案:

答案 0 :(得分:1)

Tesseract经过培训,能够识别各种字体,并且在印刷书籍上表现尤为出色。但是,如果您使用其训练集之外的字体,结果可能是乱码。

由于二值化过程和to make sure that the characters have a correct font size,在背景中提供具有良好对比度甚至黑暗的图像也非常重要。简单地调整图像大小可以大大改善结果。
您可以在Tesseract wiki上查看the Improving Quality page以获取更多信息。

这是输入图像不良时的二值化过程:

enter image description here

在将图像传递给Tesseract之前,在您的应用程序中进行一些预处理以补偿手机摄像头的质量可能是一个好主意。

如果你仍然无法获得任何有用的东西,you will probably need to train Tesseract手动识别那些有问题的字体。 这个过程有点牵扯,但它可以创造奇迹。

结果并不总是完美的,如果用户拍摄了难以理解的文字的坏照片,除了自动尝试不同的训练集和预处理选项,直到你得到的东西没有,你就无法做到这一点。看起来像胡言乱语。

答案 1 :(得分:-1)

那是因为equ.traineddata它是一个******,我使用eng.traineddata进行数字识别。也许我们需要训练一个自己的.traineddata来检测数学方程:S

如果你发现任何.traineddata用于数学,比equ更好,请告诉我