2011-12-27 20 views
1

私が書いているアプリケーションにはTesseract OCRを使用しています。私はちょうど私が時々取得する写真からいくつかの領域のテキストを認識したい。基本呼び出しは現時点では動作します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呼び出しより精度を上げる可能性があるかどうかを知りたがっています。 ここにいくつかの提案があります!

答えて

2

がかもしれませ よろしく

トビアスは、あなたがイメージのためのいくつかの機能拡張を提供する必要があります。

イメージを平滑化するとイメージ内のノイズが除去され、誤った結果が減少します。グレースケール画像上たTesseract作業は、バイナリ画像は良好な結果を与えることが見出されているがアルファベットの

ピクセル高さは、30または40

の範囲で良くなります。閾値化のために、適応閾値処理の方法を使用する。

単語間に十分なスペースがあることも良いことです。

あなたは私だけでほぼ100%までの画像精度向上をスケールアップするためにtesseract forum.

0

からさらにヒントを得ることができます。 Tesseractはドキュメントのどこかに、最高の結果を得るには300 dpi以上が必要だと述べています。

は、だから私は、コメントを追加しました:私も試したapi.SetSourceResolution(..)の代わりに、私のイメージであることをたTesseractを伝えるために

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

(72〜300から4.167〜dpiの増加)より少ない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

これ以上の精度が必要な場合は、pixeRead()でOTSUしきい値イメージを渡すことができます。 pixRead()で通常の画像を渡しています。 OTSU閾値画像を通過させる。私はそのためのアルゴリズムを開発しました。 。もし誰かが欲しいなら私に知らせてください。 –

関連する問題