Tesseract OCR:如何在不先保存文件的情况下直接从窗口句柄获取文本

时间:2014-01-21 20:35:12

标签: c++ ocr tesseract

这是我要做的事情:

使用msdn中的CaptureAnImage函数示例将图像从窗口句柄保存到我的计算机,然后使用带有此代码的tesseract:

STRING text_out;
tesseract::TessBaseAPI *api = new tesseract::TessBaseAPI();
// Initialize tesseract-ocr with English, without specifying tessdata path
if (api->Init(NULL, "eng")) {
    fprintf(stderr, "Could not initialize tesseract.\n");
    exit(1);
}
Pix *image = pixRead("captureqwsx.bmp");
api->SetImage(image);
api->SetRectangle(830, 95, 85, 25);
text_out = api->GetUTF8Text();
printf("OCR output:\n%s", text_out.string());

为了从指定的窗口句柄中检索文本。它有效。问题是:我觉得将图像保存到我的计算机不仅没用,而且可能对我的应用程序的性能没有好处......

我找到的解决方案是,使用SetImage的第二个定义:

  void SetImage(const unsigned char* imagedata, int width, int height,
                int bytes_per_pixel, int bytes_per_line);

以下是我希望你们能帮助我的方法......我不知道如何检索图像数据,每个像素的字节数和每行窗口的字节数......我觉得原来的CaptureAnImage函数应该是能够通过一点点修改轻松完成,但我不知道如何和我的搜索没有任何好处......

1 个答案:

答案 0 :(得分:2)

CaptureAnImage有这一行

DWORD dwBmpSize = ((bmpScreen.bmWidth * bi.biBitCount + 31) / 32) * 4 * bmpScreen.bmHeight;

包含您需要的所有参数。

bmWidthbmHeight是宽度和高度。每个像素的比特数是bi.biBitCount,它被设置为32,然后每个像素有32/8 = 4个字节。表达式乘以bmHeight是每条扫描线的字节数,但因为我们知道颜色深度是32位,所以它只是bmWidth * 4