Расширенное использование Tesseract OCR - PullRequest
1 голос
/ 27 декабря 2011

Я использую оптическое распознавание текста для приложения, которое пишу.Я просто хочу распознать текст в некоторых областях на картинке, которую я получаю время от времени.Базовые вызовы работают в данный момент

tesseract::TessBaseAPI api;
api.SetPageSegMode(tesseract::PSM_AUTO);        // Segmentation on auto
api.Init("/usr/local/share/","eng");            // path = parent directory of tessdata
pFile = fopen( "home/myname/test.bmp","r" );    // Open picture
PIX* image;                                     // Image format from leptonica
image = pixReadStreamBmp(pFile);              
fclose(pFile);
api.SetImage(image);                            // Run the OCR
char* textOutput = new char[512];
textOutput =api.GetUTF8Text();                  // Get the text

Пока этот код работает нормально.Но в какой-то момент OCR не так точен, как хотелось бы.На самом деле я не хочу обучать новый язык для своих целей, поэтому я хотел узнать, есть ли возможность повысить точность по сравнению с некоторыми вызовами API?Может быть, некоторые предложения здесь!С наилучшими пожеланиями

Тобиас

Ответы [ 3 ]

2 голосов
/ 27 января 2012

Может быть, вы должны предоставить некоторые улучшения для изображения.

Сглаживание изображения удаляет шумы внутри изображения, и это уменьшит ложные результаты.

Высота пикселов в алфавите будет лучше в диапазоне30 или 40.

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

Также хорошо иметь достаточно места между словами.

Дополнительные советы вы можете получить на форуме tesseract.

0 голосов
/ 23 июня 2016

Да, это правильно, OCR не работал должным образом, если вы хотите большей точности, чем выполните следующий код.

/*
 * word_OCR.cpp
 *
 *  Created on: Jun 23, 2016
 *      Author: pratik
 */

#include <opencv2/opencv.hpp>
#include <tesseract/baseapi.h>
#include <leptonica/allheaders.h>
#include <iostream>

using namespace std;
using namespace cv;

int main(int argc ,char **argv)
{
    Pix *image = pixRead(argv[1]);

    if (image == 0) {
        cout << "Cannot load input file!\n";
    }

    tesseract::TessBaseAPI tess;

    if (tess.Init("/usr/share/tesseract/tessdata", "eng")) {
            fprintf(stderr, "Could not initialize tesseract.\n");
            exit(1);
        }

    tess.SetImage(image);
    tess.Recognize(0);

    tesseract::ResultIterator *ri = tess.GetIterator();
    tesseract::PageIteratorLevel level = tesseract::RIL_WORD;

    if(ri!=0)
    {
        do {
            const char *word = ri->GetUTF8Text(level);
            cout << word << endl;

            delete []word;

        } while (ri->Next(level));

        delete []ri;
    }

}

Здесь извлекайте слово за словом из изображения и дайте слово в качестве вывода ис точностью около 90-95% .

0 голосов
/ 11 марта 2014

Для меня просто увеличение масштаба изображения улучшило точность почти до 100%.Тессеракт также где-то заявляет в своей документации, что для достижения наилучших результатов вам нужно 300 точек на дюйм или более.

Поэтому я добавил:

ocrimage = pixScale(image,4.167,4.167);
api.SetImage(ocrimage);

(увеличение на 4,167 ~ точек на дюйм с 72 до 300)

Обратите внимание, что я также попытался вместо этого использовать api.SetSourceResolution (..), чтобы сказать Тессеракту, что мое изображение имеет менее dpi, но почему-то это не дает таких же хороших результатов, как масштабирование изображения на эквивалентную величину.

...