我正在使用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恤上的徽标),那么就没有办法做到这一点。对不起,让你失望了。
然而,如果你想识别一个特定的文本,比如信用卡号码或街道标志,你能做到的。
- 从抓取文本的许多图像开始。
- 做一点对图像进行预处理,转换为BW,
- 在许多例子上训练Tesseract。
然后它就能完成你的任务。