【问题标题】:Tesseract OCR: How can I get text directly from a window handle without first saving a fileTesseract OCR:如何在不先保存文件的情况下直接从窗口句柄获取文本
【发布时间】:2014-01-21 20:35:12
【问题描述】:

这是我能做的:

使用 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 函数应该只需稍作修改即可轻松做到这一点,但我不知道怎么做,而且我的搜索没有返回任何好的结果......

【问题讨论】:

    标签: c++ ocr tesseract


    【解决方案1】:

    CaptureAnImage 有这一行

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

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

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

    【讨论】:

    • 谢谢!就是这样 ;) 顺便说一下……你知道为什么 lpbitmap 中的像素被颠倒了吗……?
    • @Noob-programmer:Windows 位图通常以这种方式存储。看看 Tesseract 是否接受每个扫描线的负高度或负字节来垂直翻转它......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多