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

C++ Tesseract OCR:如何在不保存文件的情况下直接从窗口句柄获取文本,c++,ocr,tesseract,C++,Ocr,Tesseract,以下是我能做的: 使用msdn中的函数示例将图像从窗口句柄保存到我的计算机,然后使用tesseract并执行以下代码: STRING text_out; tesseract::TessBaseAPI *api = new tesseract::TessBaseAPI(); // Initialize tesseract-ocr with English, without specifying tessdata path if (api->Init(NULL, "eng")) { f

以下是我能做的:

使用msdn中的函数示例将图像从窗口句柄保存到我的计算机,然后使用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;
其中包含您需要的所有参数


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

谢谢!就这样;)顺便说一句你知道为什么lpbitmap中的像素是颠倒的吗?@Noob程序员:Windows位图通常是这样存储的。查看Tesseract是否接受负高度或每个扫描线的负字节来垂直翻转它。。。