2011-12-27 4 views
1

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

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? Возможно, некоторые предложения здесь! С наилучшими пожеланиями

Tobias

ответ

2

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

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

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

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

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

Вы можете получить дополнительные советы от tesseract forum.

0

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

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

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

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

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

0

Да, это правильно, 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

Если вы хотите получить больше точности, чем это, вы можете передать пороговое изображение OTSU в pixeRead(). Я передаю нормальное изображение в pixRead() прямо сейчас. передать пороговое изображение OTSU. Я разработал алгоритм для этого. , дайте мне знать, если кто-то захочет. –

 Смежные вопросы

  • Нет связанных вопросов^_^