繁体   English   中英

如何将 C++ tesseract-ocr 代码转换为 Python?

[英]how to convert C++ tesseract-ocr code to Python?

我想将 tesseract-ocr doc 中的 C++ 版本结果迭代器示例转换为 Python。

  Pix *image = pixRead("/usr/src/tesseract/testing/phototest.tif");
  tesseract::TessBaseAPI *api = new tesseract::TessBaseAPI();
  api->Init(NULL, "eng");
  api->SetImage(image);
  api->Recognize(0);
  tesseract::ResultIterator* ri = api->GetIterator();
  tesseract::PageIteratorLevel level = tesseract::RIL_WORD;
  if (ri != 0) {
    do {
      const char* word = ri->GetUTF8Text(level);
      float conf = ri->Confidence(level);
      int x1, y1, x2, y2;
      ri->BoundingBox(level, &x1, &y1, &x2, &y2);
      printf("word: '%s';  \tconf: %.2f; BoundingBox: %d,%d,%d,%d;\n",
               word, conf, x1, y1, x2, y2);
      delete[] word;
    } while (ri->Next(level));
  }

到目前为止我能做的是:

import ctypes
liblept = ctypes.cdll.LoadLibrary('liblept-5.dll')
pix = liblept.pixRead('11.png'.encode()) 
print(pix)

tesseractLib = ctypes.cdll.LoadLibrary(r'C:\Program Files\tesseract-OCR\libtesseract-4.dll')

tesseractHandle = tesseractLib.TessBaseAPICreate()

tesseractLib.TessBaseAPIInit3(tesseractHandle, '.', 'eng')

tesseractLib.TessBaseAPISetImage2(tesseractHandle, pix)
#tesseractLib.TessBaseAPIRecognize(tesseractHandle, tesseractLib.TessMonitorCreate())

我无法将 C++ api->Recognize(0)为 Python(我尝试的是在代码的最后一行(注释),但它是错误的),我对 C++ 没有经验,所以我不能再继续了,任何人都可以帮助转换? API:

我想我在后续的转换上也有一些困难,例如,我不知道如何在 Python 中表示tesseract::RIL_WORD ,所以最好提供完整版的转换,谢谢!

我知道有一个名为tesserocr的项目可以让我免于转换,但该项目的问题是他们不提供最新的 Windows Python 轮子,这是我进行转换的主要原因。

我认为问题在于api->Recognize()需要一个指针作为第一个参数。 他们错误地将0放在他们的示例中,但它应该是nullptr 0nullptr都具有相同的值,但在 64 位系统上它们的大小不同(通常;我假设在一些奇怪的非 x86 系统上这可能也不是真的)。

他们的示例仍然适用于 C++ 编译器,因为编译器知道该函数需要一个指针(64 位)并静默修复它。

在您的示例中,您似乎还没有为 ctypes 指定TessBaseAPIRecognize()的确切原型 所以 ctypes 不能知道这个函数需要一个指针(64 位)。 相反,它假设这个函数需要一个整数(32 位)--> 它崩溃了。

我的建议:

  1. 使用ctypes.c_void_p(None)而不是 0
  2. 如果您打算在生产中使用它, 请将所有函数原型指定为 ctypes
  3. 请注意您查看的示例:这些示例使用Tesseract 基础 API (C++ API),而如果您想将 libtesseract 与 Python + ctypes 一起使用,则必须使用Tesseract C API 这 2 个 API 非常相似,但可能不完全相同。

如果您需要进一步的帮助,您可以查看PyOCR中的工作方式 如果您决定在您的项目中使用PyOCR ,请注意 PyOCR 的许可证是 GPLv3+,这意味着一些限制。

暂无
暂无

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

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