android - распознанный текст из библиотеки tess-two неверен

Я пытаюсь использовать библиотеку tess-two для распознавания текста с изображений.

Вот мой код:

load.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                // recognize text
                Bitmap temp = loadJustTakenImage(); //loads taken image from sdcard
                Bitmap rotatedImage = rotateIfNeeded(temp); // rotate method i found in some tutorial
                String text1 = recognizeText(rotatedImage);
            }

        });

Метод распознавания текста:

(папка tessdata находится в Download с eng.traineddata и другими файлами)

private String recognizeText(Bitmap bitmap) {
        // TODO Auto-generated method stub
        TessBaseAPI baseApi = new TessBaseAPI();
        // DATA_PATH = Path to the storage
        // lang = for which the language data exists, usually "eng"
        baseApi.init(Environment.getExternalStorageDirectory().toString()
                + "/Download/", "eng");
        // Eg. baseApi.init("/mnt/sdcard/tesseract/tessdata/eng.traineddata",
        // "eng");
        baseApi.setImage(bitmap);
        String recognizedText = baseApi.getUTF8Text();
        baseApi.end();
        return recognizedText;
    }

метод поворота изображения:

private Bitmap rotateIfNeeded(Bitmap bitmap) {
        ExifInterface exif = null;
        try {
            exif = new ExifInterface(directoryPath+"/"+currentFileName+".jpg");
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        int exifOrientation = exif
                .getAttributeInt(ExifInterface.TAG_ORIENTATION,
                        ExifInterface.ORIENTATION_NORMAL);

        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;
        }

        if (rotate != 0) {
            int w = bitmap.getWidth();
            int h = bitmap.getHeight();

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

            // Rotating Bitmap & convert to ARGB_8888, required by tess
            bitmap = Bitmap.createBitmap(bitmap, 0, 0, w, h, mtx, false);
        }
        bitmap = bitmap.copy(Bitmap.Config.ARGB_8888, true);
        return bitmap;
    }

например, текст, который я получаю, представляет собой настоящий беспорядок

для этого изображения:

введите здесь описание изображения

Я получил этот текст:

,7‘

Иногда я просто получаю пустую строку.

Что я делаю не так?


person Ofek Agmon    schedule 01.05.2015    source источник
comment
пример изображения пожалуйста   -  person tobltobs    schedule 01.05.2015
comment
Вы убедились, что вращение дает правильное изображение? Вставьте изображение на экран и убедитесь.   -  person Vaiden    schedule 01.05.2015
comment
на самом деле, я не думаю, что вращение что-то делает.. Я пытаюсь распознать текст как из исходного изображения, так и из повернутого изображения, и обе строки представляют собой один и тот же странный текст.. либо странный текст, либо пустой.. есть ли s образец рабочего кода для ротации?   -  person Ofek Agmon    schedule 02.05.2015
comment
поэтому после повторного тестирования переменные exifOrientation и rotate всегда равны 0, даже когда я делаю снимок под 45 углами. так что вращение, я думаю, ничего не делает. но даже когда я делаю прямую фотографию (когда я думаю, что поворот не нужен), я все равно получаю странный текст. идеи?   -  person Ofek Agmon    schedule 02.05.2015
comment
@OfekAgmon: Привет, ты нашел какое-нибудь решение для того же? у меня такая же проблема   -  person Jai    schedule 10.09.2015
comment
@Джай, нет, извини... не могу понять   -  person Ofek Agmon    schedule 11.09.2015


Ответы (1)


В зависимости от типа изображения, на котором вы пытаетесь обнаружить символы, установка соответствующего режима сегментации страницы поможет обнаружить символы.

Например :

baseAPI.setPageSegMode(TessBaseAPI.PageSegMode.PSM_AUTO_ONLY);

Различные другие значения сегментации страницы присутствуют в TessBaseApi.java:

/** Page segmentation mode. */
public static final class PageSegMode {
    /** Orientation and script detection only. */
    public static final int PSM_OSD_ONLY = 0;

    /** Automatic page segmentation with orientation and script detection. (OSD) */
    public static final int PSM_AUTO_OSD = 1;

    /** Fully automatic page segmentation, but no OSD, or OCR. */
    public static final int PSM_AUTO_ONLY = 2;

    /** Fully automatic page segmentation, but no OSD. */
    public static final int PSM_AUTO = 3;

    /** Assume a single column of text of variable sizes. */
    public static final int PSM_SINGLE_COLUMN = 4;

    /** Assume a single uniform block of vertically aligned text. */
    public static final int PSM_SINGLE_BLOCK_VERT_TEXT = 5;

    /** Assume a single uniform block of text. (Default.) */
    public static final int PSM_SINGLE_BLOCK = 6;

    /** Treat the image as a single text line. */
    public static final int PSM_SINGLE_LINE = 7;

    /** Treat the image as a single word. */
    public static final int PSM_SINGLE_WORD = 8;

    /** Treat the image as a single word in a circle. */
    public static final int PSM_CIRCLE_WORD = 9;

    /** Treat the image as a single character. */
    public static final int PSM_SINGLE_CHAR = 10;

    /** Find as much text as possible in no particular order. */
    public static final int PSM_SPARSE_TEXT = 11;

    /** Sparse text with orientation and script detection. */
    public static final int PSM_SPARSE_TEXT_OSD = 12;

    /** Number of enum entries. */
    public static final int PSM_COUNT = 13;
}

Вы можете поэкспериментировать с различными значениями перечисления сегментации страниц и посмотреть, какое из них дает наилучший результат.

Для приведенного выше изображения кажется, что установка сегментации страницы на «PSM_SINGLE_LINE» должна дать результат, который вы ищете.

person Itachi_rg    schedule 05.10.2015