0

我正在使用 tesseract 3.02 和 opencv 让 tesseract 实时识别我相机中的文本。

但效果相当糟糕。结果不可读,无法流畅地显示图像。我认为这是我的代码的问题。

有人可以给我有关如何修改它的建议吗?

非常感谢!

#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;
}
4

1 回答 1

6

Tesseract 旨在处理扫描的书籍。它在只有黑色文本的白页上运行,清晰可见,失真最小。图像大多是黑白的。您的图像是灰度级,因此 Tesseract 的性能会非常差。这不是您的代码的问题,而是 Tesseract 的问题。如果您将相机对准一本书,您将能够获得文本(假设图像已聚焦),但如果您想阅读一般文本(如街道标志、某人 T 恤上的徽标,则没有办法做到这一点. 很抱歉让你失望了。

但是,如果您想识别特定文本,例如信用卡号或路标,您可以做到。

  1. 首先抓取您的文本的许多图像。
  2. 对图像进行一些预处理,将其转换为 BW,
  3. 在许多示例上训练 Tesseract。

然后它将能够完成您的任务。

于 2012-12-27T09:57:42.050 回答