2011-12-27 1 views
1

J'utilise le Tesseract OCR pour une application que j'écris. Je veux juste reconnaître le texte sur certaines zones à partir d'une image que je reçois de temps en temps. Les appels de base fonctionnent pour l'instantUtilisation avancée de 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 

Jusqu'à présent, ce code fonctionne très bien. Mais à un moment donné, l'OCR n'est pas aussi précis que je le souhaiterais. En fait, je ne veux pas former une nouvelle langue pour mon but, donc je voulais savoir s'il y avait une possibilité d'augmenter la précision sur certains appels API? Peut-être quelques suggestions ici! Cordialement

Tobias

Répondre

2

Peut être, vous devez fournir une certaine amélioration de l'image. Le lissage de l'image élimine les bruits à l'intérieur de l'image et réduit les faux résultats.

pixel hauteur alphabets sera mieux dans la gamme de 30 ou 40.

Bien que le travail de Tesseract sur les images en niveaux de gris, les images binaires sont trouvées pour donner de meilleurs résultats. Pour le seuillage, utilisez la méthode de seuillage adaptatif.

Il est également bon d'avoir suffisamment d'espace entre les mots.

Vous pouvez obtenir d'autres conseils de tesseract forum.

0

Pour moi juste mise à l'échelle l'image plus grande précision jusqu'à près de 100%. Tesseract indique également dans sa documentation quelque part, que pour de meilleurs résultats, vous avez besoin de 300 dpi ou plus.

J'ajouté:

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

(4,167 ~ dpi augmentation 72-300)

Notez que je api.SetSourceResolution aussi essayé (..) à la place, de dire Tesseract que mon image est de moins dpi, mais en quelque sorte cela ne donne pas de bons résultats que l'augmentation de l'image de la quantité équivalente.

0

Oui, c'est correct, l'OCR ne fonctionnait pas correctement, si vous voulez plus de précision que d'exécuter le code suivant.

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

} 

extrait ici le mot par mot d'image et donner mot comme une sortie et précise autour 90-95%.

+0

Si vous voulez plus de précision, vous pouvez passer l'image de seuil OTSU dans pixeRead(). Je passe l'image normale dans pixRead() en ce moment. transmettre l'image de seuil OTSU. J'ai développé un algorithme pour cela. . laissez-moi savoir si quelqu'un veut. –

Questions connexes