2012-12-26 40 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

相关问题