как преобразовать код C ++ tesseract-ocr в Python? - PullRequest
0 голосов
/ 11 февраля 2020

Я хочу преобразовать версию C ++ Пример итератора результата в tesseract-ocr do 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 ++, поэтому я не могу больше go, кто-нибудь может помочь с преобразованием? API:

Я думаю, у меня также есть некоторые трудности при последующем преобразовании, например, я не знаю, как обозначим tesseract::RIL_WORD в Python, так что было бы любезно предоставить мне полную версию конверсии, спасибо!

Я знаю, что есть проект с именем tesserocr , который может спасти меня от конверсии, но проблема с проектом заключается в том, что они не предоставляют обновленные колеса windows Python, которые это главная причина для меня, чтобы сделать преобразование.

Ответы [ 2 ]

0 голосов
/ 12 февраля 2020

Существует пример использования API teseract в python:

https://github.com/zdenop/SimpleTesseractPythonWrapper/blob/master/SimpleTesseractPythonWrapper.ipynb

Это в блокноте Jupyter, поэтому вы можете оценить каждый шаг .

0 голосов
/ 11 февраля 2020

Я думаю, проблема в том, что api->Recognize() ожидает указатель в качестве первого аргумента. Они ошибочно указали 0 в своем примере, но это должно быть nullptr. 0 и nullptr имеют одинаковое значение, но в 64-битных системах они не имеют одинакового размера (обычно; я предполагаю, что в некоторых странных системах, отличных от x86, это тоже может быть не так).

Их пример по-прежнему работает с компилятором C ++, потому что компилятор знает, что функция ожидает указатель (64 бита) и исправляет его молча.

В вашем примере кажется, что вы не указали точный прототип TessBaseAPIRecognize() к типам. Поэтому ctypes не может знать, что эта функция ожидает указатель (64 бита). Вместо этого предполагается, что эта функция ожидает целое число (32 бита) -> происходит сбой.

Мои предложения:

  1. Используйте ctypes.c_void_p(None) вместо 0
  2. Если вы собираетесь использовать это в производстве, укажите для всех типов прототипов функций
  3. Будьте осторожны с примерами, на которые вы смотрите: Эти примеры используют Tesseract базовый API (C ++ API), тогда как если вы хотите использовать libtesseract с Python + ctypes, вы должны использовать Tesseract C API . Эти 2 API очень похожи, но могут не совпадать.

Если вам нужна дополнительная помощь, вы можете посмотреть, как все это делается в PyOCR . Если вы решите использовать PyOCR в своем проекте, просто помните, что лицензия PyOCR - GPLv3 +, что подразумевает некоторые ограничения.

...