Семантика 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
.
отвечая на ваши вопросы:
" после вызова Clear () можно ли использовать xapi и yapi взаимозаменимо?"...да, вы можете, но результаты могут отличаться из-за различных настроек, которые вы применили к
xapi
viaSetVariable()
, а неyapi
."другими словами, могу ли я предположить, что xapi и yapi идентичны на данный момент с точки зрения поведения?"-- в зависимости от того, какие настройки вы изменили с
SetVariable()
, результаты могут быть или не быть одинаковыми." могу ли я сказать, что Clear () на самом деле является функцией сброса?" -- только результаты распознавания и данные изображения отбрасываются, все остальное остается нетронутым. В зависимости от вашего определения
reset
, вы можете назвать это сброс или нет, это свободная страна в конце концов=)
вы можете проверить разницу между очистить() и полный демонтаж с помощью End (). Это около линии 1400 из baseapi.cpp.