Семантика TessBaseAPI:: очистить()

предположим, я создал два объекта TessBaseAPI - xapi и yapi - инициализируется вызовом следующей перегрузки 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 ответов


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

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

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

при вызове очистить() следующий называются:

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

вызов thresholder_->Clear(); уничтожает Пикс (Если не null)

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 }

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

tesseract_->очистить() выпускает следующие:

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 взаимозаменяемо?

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

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

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

после вызова Clear () вызовите либо устанавливает раскрывающееся меню или TesseractRect перед использованием функции распознавания или Get*.

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

смотреть на!--68-->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);

эти три параметра всегда нужны, что смысл.

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


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

отвечая на ваши вопросы:

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

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

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

вы можете проверить разницу между очистить() и полный демонтаж с помощью End (). Это около линии 1400 из baseapi.cpp.