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

의 범위가 더 좋을 것이다. 임계 값을 설정하려면 적응 형 임계 값 방법을 사용하십시오.

단어 사이에 충분한 공간이 있으면 좋습니다. 나 그냥 거의 100 %까지 이미지 개선 정확성을 확장하기위한

당신은 tesseract forum.

0

에서 더 팁을 얻을 수 있습니다. Tesseract는 최상의 결과를 얻으려면 300dpi 이상이 필요하다는 것을 문서에 명시합니다.

그래서 나는 추가 : 나는 또한 시도 api.SetSourceResolution (..) 대신에, 내 이미지는 그 정팔 포체 말할

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 통과 임계 값 이미지. 나는 그것을위한 알고리즘을 개발했다. . 아무도 원하면 알려줘. –