我如何使用tesseract和opencv从相机中提取文本



我正在使用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: %sn",
           myOCR->Version());
    printf("Leptonica version: %sn",
           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("%sn",out);
                }
    }
    cvReleaseCapture(&pCapture);
    cvDestroyWindow("video");
    cv::waitKey(-1);
            return 0;
}

Tesseract设计用于处理扫描图书。它在只有黑色文字的白色页面上运行,清晰可见,失真最小。图片大多是黑色的&白色你的图像是灰色水平,所以Tesseract将执行非常非常差。这不是你代码的问题而是宇宙魔方的问题。如果你将相机对准一本书,你将能够获得文本(假设图像被聚焦),但如果你想读取一般文本(如街道标志,某人t恤上的徽标),那么就没有办法做到这一点。对不起,让你失望了。

然而,如果你想识别一个特定的文本,比如信用卡号码或街道标志,你能做到的。

  1. 从抓取文本的许多图像开始。
  2. 做一点对图像进行预处理,转换为BW,
  3. 在许多例子上训练Tesseract。

然后它就能完成你的任务。

相关内容

  • 没有找到相关文章

最新更新