2011-12-27 137 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

可能是,你應該提供一些增強圖像。

平滑圖像消除圖像中的噪音,它會減少錯誤的結果。字母的

像素高度將是在30或40

範圍更好儘管灰度圖像的tesseract工作,二進制圖像中發現,得到更好的結果。對於閾值處理,使用自適應閾值法。

在單詞之間留出足夠的空間也很好。

您可以從tesseract forum.

0

得到進一步的提示對我來說只是擴大圖像精度提高至幾乎100%。 Tesseract在他們的文檔中還指出,爲獲得最佳效果,您需要300 dpi或更多。

於是我說:

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

(從72到300 4.167〜dpi的增加),我也試過api.SetSourceResolution(..)來代替,告訴正方體,我的形象是小於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閾值圖像。我爲此開發了算法。 。讓我知道是否有人想要。 – 2016-06-24 07:44:43