这是我要做的事情:
使用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函数应该是能够通过一点点修改轻松完成,但我不知道如何和我的搜索没有任何好处......
答案 0 :(得分:2)
CaptureAnImage
有这一行
DWORD dwBmpSize = ((bmpScreen.bmWidth * bi.biBitCount + 31) / 32) * 4 * bmpScreen.bmHeight;
包含您需要的所有参数。
bmWidth
和bmHeight
是宽度和高度。每个像素的比特数是bi.biBitCount
,它被设置为32,然后每个像素有32/8 = 4个字节。表达式乘以bmHeight
是每条扫描线的字节数,但因为我们知道颜色深度是32位,所以它只是bmWidth * 4
。