如何转换C++;tesseract ocr代码到Python?

如何转换C++;tesseract ocr代码到Python?,python,c++,tesseract,python-tesseract,Python,C++,Tesseract,Python Tesseract,我想把TestSerAtOCR文档中的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); tes

我想把TestSerAtOCR文档中的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 >识别(0)<代码>到Python(我尝试过的代码是最后一行(注释),但它是错误的),我没有经验C++,所以我不能继续下去,有人能帮助转换吗?API:

  • 来自tess4j:

  • 从源代码:

我想我在随后的转换中也会遇到一些困难,例如,我不知道如何在Python中表示
tesseract::RIL_WORD
,所以请为我提供转换的完整版本,谢谢


我知道有一个名为can save me的项目可以避免转换,但该项目的问题是他们没有提供最新的windows Python wheels,这是我进行转换的主要原因

我认为问题在于
api->Recognize()
需要一个指针作为第一个参数
0
nullptr
都具有相同的值,但在64位系统上,它们的大小不同(通常;我假设在一些奇怪的非x86系统上,这也可能不正确)

他们的例子仍然适用于C++编译器,因为编译器意识到函数需要一个指针(64位)并且默默地修复它。

在您的示例中,似乎尚未指定确切的ctypes。因此,ctypes无法知道此函数需要一个指针(64位)。相反,它假定此函数需要一个整数(32位)-->它会崩溃

我的建议是:

  • 如果你打算在生产中使用它
  • 请注意您所看到的示例:这些示例使用(C++API),而如果要将libteseract与Python+ctypes一起使用,则必须使用。这两个API非常相似,但可能不完全相同

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

    “C/C++”不是一种语言。以上是清楚的C++,所以根本没有提到C。另外,尽量不要把问题的标题放在标签上。后者更适合有效搜索。您对
    0
    nullptr
    之间差异的描述不准确<在此上下文中,code>0不是
    int
    literal`而是空指针文本,因此它与
    nullptr
    对象指针大小相同。编译器不会“静默修复”。谢谢您的帮助!我使用了tesseractLib.tesserbaseApiRecognite(tesseractHandle,None),然后就没有异常了,这让我觉得不指定函数原型并不重要。你介意帮我回答另一个类似的问题吗