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

how to convert C++ tesseract-ocr code to Python?

我想将 tesseract-ocr 文档中的 C++ 版本 Result iterator example 转换为 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() 需要一个指针作为第一个参数。 They mistakenly put a 0 in their example but it should be nullptr0nullptr 都具有相同的值,但在 64 位系统上它们的大小不同(通常;我假设在一些奇怪的非 x86 系统上这可能也不是真的)。​​

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

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

我的建议:

  1. Use ctypes.c_void_p(None) instead of 0
  2. 如果您打算在生产中使用它,specify to ctypes all the function prototypes
  3. 请注意您查看的示例:这些示例使用 Tesseract base API (C++ API) whereas if you want to use libtesseract with Python + ctypes, you have to use Tesseract C API。这两个 API 非常相似,但可能不完全相同。

如果你需要进一步的帮助,你可以看看在你的项目中 PyOCR. If you decide to use PyOCR 是如何完成的,只是要注意 PyOCR 的许可证是 GPLv3+,这意味着一些限制。