Семантика TessBaseAPI :: Clear () - PullRequest
0 голосов
/ 27 июня 2018

Предположим, я создал два объекта TessBaseAPI & mdash; xapi и yapi & mdash; инициализируется путем вызова следующей перегрузки функции Init () :

int Init(const char * datapath,
         const char * language,
         OcrEngineMode  oem,
         char **    configs,
         int    configs_size,
         const GenericVector< STRING > *    vars_vec,
         const GenericVector< STRING > *    vars_values,
         bool   set_only_non_debug_params 
);

передача точно идентичных аргументов.

Поскольку объекты инициализируются с одинаковыми аргументами, в этот момент xapi и yapi предполагаются идентичными с поведенческой 1 перспективы. Правильно ли мое предположение? Я надеюсь на это, так как не вижу причин, по которым объекты не идентичны.


Теперь я собираюсь использовать xapi для извлечения информации из изображения, но перед этим я несколько раз вызываю SetVariable () , чтобы задать еще несколько конфигураций.

bool SetVariable(const char * name, const char * value);

и затем я использовал xapi для извлечения текста из изображения. Как только я закончил с извлечением, я сделал это:

 xapi.Clear(); //what exactly happens here?

После вызова Сброс () , можно ли использовать xapi и yapi взаимозаменяемо? Другими словами, могу ли я предположить, что xapi и yapi идентичны на данный момент с точки зрения поведения 1 ? Могу ли я сказать, что Clear() на самом деле сброс функциональность?

1. Под «поведенческим» я понимал производительность с точки зрения точности, а не скорости / задержки.

Ответы [ 2 ]

0 голосов
/ 07 июля 2018

Поскольку объекты инициализируются с одинаковыми аргументами, в этой точке предполагается, что xapi и yapi идентичны с поведенческой точки зрения. Правильно ли мое предположение?

С самого начала я ничего не могу найти, чтобы оспорить это предположение.

Исследование исходного кода.

Следующие параметры очищаются или сбрасываются (если хотите):

При вызове Сброс () вызывается следующее:

01402 void TessBaseAPI::Clear() {
01403   if (thresholder_ != NULL)
01404     thresholder_->Clear();
01405   ClearResults();
01406 }

Вызов thresholder_->Clear(); уничтожает пиксель (если не ноль)

00044 // Destroy the Pix if there is one, freeing memory.
00045 void ImageThresholder::Clear() {
00046   if (pix_ != NULL) {
00047     pixDestroy(&pix_);
00048     pix_ = NULL;
00049   }
00050   image_data_ = NULL;
00051 }

Для Очистить результаты , как показано ниже.

01641 void TessBaseAPI::ClearResults() {
01642   if (tesseract_ != NULL) {
01643     tesseract_->Clear();
01644   }
01645   if (page_res_ != NULL) {
01646     delete page_res_;
01647     page_res_ = NULL;
01648   }
01649   recognition_done_ = false;
01650   if (block_list_ == NULL)
01651     block_list_ = new BLOCK_LIST;
01652   else
01653     block_list_->clear();
01654   if (paragraph_models_ != NULL) {
01655     paragraph_models_->delete_data_pointers();
01656     delete paragraph_models_;
01657     paragraph_models_ = NULL;
01658   }
01659 }

Результаты страницы, черный список устанавливаются на ноль, а соответствующие флаги сбрасываются.

tesseract _-> Clear () выпускает следующее:

00413 void Tesseract::Clear() {
00414   pixDestroy(&pix_binary_);
00415   pixDestroy(&cube_binary_);
00416   pixDestroy(&pix_grey_);
00417   pixDestroy(&scaled_color_);
00418   deskew_ = FCOORD(1.0f, 0.0f);
00419   reskew_ = FCOORD(1.0f, 0.0f);
00420   splitter_.Clear();
00421   scaled_factor_ = -1;
00422   ResetFeaturesHaveBeenExtracted();
00423   for (int i = 0; i < sub_langs_.size(); ++i)
00424     sub_langs_[i]->Clear();
00425 }

Обращает на себя внимание, SetVariable не влияет на значения инициализации:

Работает только для переменных не-init (переменные init должны передаваться в Init ()).

00143 bool TessBaseAPI::SetVariable(const char* name, const char* value) {
00144   if (tesseract_ == NULL) tesseract_ = new Tesseract;
00145   return ParamUtils::SetParam(name, value, SET_PARAM_CONSTRAINT_NON_INIT_ONLY,
00146                               tesseract_->params());
00147 }

После вызова Clear () можно ли использовать xapi и yapi взаимозаменяемо?

Нет. Конечно, нет, если вы использовали порог.

Можно ли сказать, что Clear () на самом деле является функцией сброса?

Не в смысле восстановления его в исходное состояние. Это изменит некоторые значения исходного объекта на ноль. Это сохранит основную работу таких параметров, как const char * datapath, const char * language, OcrEngineMode oem,. Кажется, это способ освободить память, не стирая объект. Встроить"без фактической освобождения каких-либо данных распознавания, которые потребовали бы много времени для перезагрузки.".

После вызова Clear () вызовите либо SetImage , либо TesseractRect перед использованием функций Recognition или Get *.

Clear не будет избавляться от SetVariables, они будут сброшены к значениям по умолчанию только после уничтожения объекта путем вызова End ().

Глядя на класс TessbaseApi () , вы можете увидеть, что вы инициализируете, и какое из этих значений будет сброшено с помощью Clear ().

00091 TessBaseAPI::TessBaseAPI()
00092   : tesseract_(NULL),
00093     osd_tesseract_(NULL),
00094     equ_detect_(NULL),
00095     // Thresholder is initialized to NULL here, but will be set before use by:
00096     // A constructor of a derived API,  SetThresholder(), or
00097     // created implicitly when used in InternalSetImage.
00098     thresholder_(NULL),
00099     paragraph_models_(NULL),
00100     block_list_(NULL),
00101     page_res_(NULL),
00102     input_file_(NULL),
00103     output_file_(NULL),
00104     datapath_(NULL),
00105     language_(NULL),
00106     last_oem_requested_(OEM_DEFAULT),
00107     recognition_done_(false),
00108     truth_cb_(NULL),
00109     rect_left_(0), rect_top_(0), rect_width_(0), rect_height_(0),
00110     image_width_(0), image_height_(0) {
00111 }

Учитывая, что базовый конструктор для класса:

(datapath, language, OEM_DEFAULT, NULL, 0, NULL, NULL, false);

Эти три параметра всегда необходимы, что имеет смысл .

Если путь к данным, OcrEngineMode или язык изменились - начните снова.
Обратите внимание, что поле language_ хранит последний запрошенный язык, который был успешно инициализирован, а tesseract _-> lang хранит фактически используемый язык. Они отличаются только в том случае, если запрашиваемый язык был NULL, и в этом случае для tesseract _-> lang установлено значение по умолчанию ("eng") для Tesseract.

0 голосов
/ 02 июля 2018

Согласно документации void tesseract :: TessBaseAPI :: Clear () , вызов этой функции освободит данные изображения и результаты распознавания. Это ничего не говорит о данных конфигурации. Более того, если авторы считают, что данные конфигурации требуют много времени для загрузки, они останутся без изменений: without actually freeing any recognition data that would be time-consuming to reload.

Отвечая на другие ваши вопросы:

  1. "После вызова Clear () я могу использовать xapi и yapi взаимозаменяемо?" - да, возможно, но результаты могут отличаться из-за разных настроек, которые вы применили к xapi через SetVariable(), но не к yapi.

  2. «Другими словами, могу ли я предположить, что xapi и yapi идентичны на данный момент с точки зрения поведения1?» - в зависимости от того, какие настройки вы изменили с помощью SetVariable(), результаты могут быть или не совпадать.

  3. "Могу ли я сказать, что Clear () на самом деле является функцией сброса?" - отбрасываются только результаты распознавания и данные изображения, все остальное остается нетронутым. В зависимости от вашего определения reset, вы можете назвать это сбросом или нет, в конце концов, это свободная страна =)

Вы можете проверить разницу между Очистить () и полным разбором, используя End () . Это около 1400 baseapi.cpp .

...