繁体   English   中英

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

[英]Tesseract OCR: How can I get text directly from a window handle without first saving a file

这是我可以做的:

使用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函数应该能够只需一点点修改就可以轻松地做到这一点,但是我不知道怎么做,我的搜索也没有得到任何好处...

CaptureAnImage有这一行

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

其中包含您需要的所有参数。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM