假设我已经创建了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
);
传递完全相同的参数。
由于对象是使用相同的参数初始化的,因此从行为1的角度出发,此时
xapi
和yapi
假定相同。我的假设正确吗?我希望如此,因为我没有发现对象不相同的任何原因。现在,我将使用
xapi
从图像中提取信息,但是在此之前,我多次调用SetVariable()来设置更多配置。bool SetVariable(const char * name, const char * value);
然后我使用
xapi
从图像中提取了一些文本。提取完毕后,就可以执行以下操作: xapi.Clear(); //what exactly happens here?
调用Clear()之后,可以互换使用
xapi
和yapi
吗?换句话说,从行为1的角度来看,我现在可以假设xapi
和yapi
是相同的吗?我可以说Clear()
实际上是一种重置功能吗?1.“行为”是指性能的准确性,而不是速度/延迟。
最佳答案
从一开始,我没有发现可以质疑这个假设的。
研究源代码。
清除或重置以下参数(如果需要):
调用Clear()时,将调用以下内容:
01402 void TessBaseAPI::Clear() {
01403 if (thresholder_ != NULL)
01404 thresholder_->Clear();
01405 ClearResults();
01406 }
调用
thresholder_->Clear();
会破坏pix(如果不为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 }
对于Clear Results,如下所示。
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_->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不会影响初始化值:
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 }
否。如果您使用阈值器,当然不会。
并不是将其恢复到初始状态。它将原始对象的某些值更改为null。它将保留诸如
const char * datapath, const char * language, OcrEngineMode oem,
之类的参数的繁琐工作。这似乎是释放内存而不破坏对象的一种方法。 Inline with“实际上没有释放任何识别数据,而这些识别数据会很费时地重新加载。”调用Clear()之后,在使用Recognition或Get *函数之前,请调用SetImage或TesseractRect。
Clear不会处理SetVariables,它们只会在销毁对象后通过调用End()将其重置为默认值。
查看TessbaseApi() class,您可以看到正在初始化的内容以及将使用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);
始终需要这三个参数makes sense。
关于c++ - TessBaseAPI::Clear()的语义,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51069618/