2012-12-26 64 views
0

我正在使用tesseract 3.02和opencv讓tesseract實時識別來自相機的文本。如何使用tesseract和opencv從相機中提取文本

但效果非常糟糕。結果不可讀,無法流利地顯示圖像。我認爲這是我的代碼問題。

有人能告訴我如何修改它嗎?

非常感謝!

#include "stdafx.h" 
#include <string> 
#include <opencv2/opencv.hpp> 
#include <time.h> 


using namespace std; 
using namespace cv; 


int main() { 

    // [1] 
    tesseract::TessBaseAPI *myOCR = 
      new tesseract::TessBaseAPI(); 

    // [2] 
    printf("Tesseract-ocr version: %s\n", 
      myOCR->Version()); 
    printf("Leptonica version: %s\n", 
      getLeptonicaVersion()); 

    // [3] 
    if (myOCR->Init(NULL, "eng")) { 
     fprintf(stderr, "Could not initialize tesseract.\n"); 
     exit(1); 
    } 

    //聲明IplImage指針 
    IplImage* pFrame = NULL; 

    //獲取攝像頭 
    CvCapture* pCapture = cvCreateCameraCapture(-1); 

    //創建窗口 
    cvNamedWindow("video", 1); 

    //顯示視屏 
      time_t last_time = time(NULL); 
    while(1) 
    { 

     pFrame=cvQueryFrame(pCapture); 
     if(!pFrame) break; 
     cvShowImage("video",pFrame); 
     char c=cvWaitKey(33); 
     if(c==27)break; 

       time_t this_time = time(NULL); 
       if(this_time != last_time) 
       { 
        last_time = this_time; 
     myOCR->SetRectangle(0,0,pFrame->width,pFrame->height); 
     myOCR->SetImage((uchar*)pFrame->imageData,pFrame->width,pFrame- >height,pFrame->depth/8,pFrame->width*(pFrame->depth/8)); 
     myOCR->Recognize(NULL); 
     const char* out = myOCR->GetUTF8Text(); 
     printf("%s\n",out); 
       } 

    } 
    cvReleaseCapture(&pCapture); 
    cvDestroyWindow("video"); 
    cv::waitKey(-1); 
      return 0; 
} 

回答

6

Tesseract設計用於處理掃描書籍。它在只有黑色文本的白色頁面上運行,清晰可見,失真最小。圖像大多是黑色&白色。你的圖像是灰色的,所以Tesseract的表現會非常差。 這不是你的代碼的問題,而是Tesseract的問題。 如果您將相機指向一本書,您將能夠獲取文本(假設圖像是重點),但是如果您想閱讀一般文本(如街道標誌,某人T恤上的標誌比無法做到它對不起被抓住的許多imgages讓你失望。

但是,如果你想認識一個特定的文本,如信用卡號碼或路牌, ,你可以做到這一點。

  1. 開始您的
  2. 對圖像進行一些預處理,將其轉換爲BW,
  3. 在很多例子中,列車Tesseract的

然後它將能夠完成你的任務。

+0

謝謝您的信息。認識書中的文字對我來說也是可以的。但我不僅面臨準確性的問題。另一個問題是它無法順利顯示圖像。延誤非常嚴重。我想這可能是因爲我碰到每一幀。我想知道如何穩定它?我應該採取像截圖或什麼?我只是想讓它顯示我的相機指向的文字。所以我想我的代碼仍然有一些問題 – user1866046

+0

我明白你說什麼。你需要 – DanielHsH

+0

我明白你的意思。您需要運行圖像穩定算法(匹配連續圖像)。從tesseract中,您可以獲得方框(圖像上每個字母的位置)。然後你運行它在1 [秒]一次,存儲的方塊,並根據相機移動繪製他們 – DanielHsH

相關問題