TessBaseAPI :: Clear()的语义

Naw*_*waz 6 c++ ocr tesseract

假设我通过调用以下Init()函数的重载创建了两个TessBaseAPI- xapiyapi- 初始化的对象:

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 
);
Run Code Online (Sandbox Code Playgroud)

传递完全相同的参数.

由于对象被具有相同参数进行初始化,在这一点上xapiyapi被假定为是从行为相同1度的视角.我的假设是否正确?我希望如此,因为我没有找到任何理由让对象不相同.


现在我将用于xapi从图像中提取信息,但在此之前我多次调用SetVariable(),以设置更多配置.

bool SetVariable(const char * name, const char * value);
Run Code Online (Sandbox Code Playgroud)

然后我习惯xapi从图像中提取一些文字.一旦我完成了提取,我就这样做了:

 xapi.Clear(); //what exactly happens here?
Run Code Online (Sandbox Code Playgroud)

在调用后清除() ,我可以使用xapiyapi互换?换句话说,从行为1的角度来看,我能否假设这一点xapi并且yapi在这一点上是相同的?我可以说实际上是重置功能吗?Clear()

1.通过"行为",我的意思是准确性,而不是速度/延迟.

小智 2

由于对象是使用相同的参数初始化的,因此从行为角度来看,此时 xapi 和 yapi 被假定为相同。我的假设正确吗?

从一开始我就找不到任何证据来反驳这个假设。

研究源代码。

以下参数将被清除或重置(如果您愿意):

调用Clear()时,将调用以下内容:

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

调用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 }
Run Code Online (Sandbox Code Playgroud)

对于清晰的结果,如下所示。

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 }
Run Code Online (Sandbox Code Playgroud)

页面结果、阻止列表被设置为空,并且相关标志被重置。

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 }
Run Code Online (Sandbox Code Playgroud)

值得注意的是, SetVariable不影响初始值:

仅适用于非初始化变量(初始化变量应传递给 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 }
Run Code Online (Sandbox Code Playgroud)

调用 Clear() 后,我可以互换使用 xapi 和 yapi 吗?

不。如果您使用阈值器,当然不会。

我可以说 Clear() 实际上是一个重置功能吗?

不是指将其恢复到初始状态。它会将原始对象的某些值更改为 null。它将保留诸如 之类的参数的繁重工作const char * datapath, const char * language, OcrEngineMode oem,。这似乎是一种在不删除对象的情况下释放内存的方法。内嵌“无需实际释放任何重新加载会非常耗时的识别数据。”。

调用 Clear() 后,在使用 Recognition 或 Get* 函数之前调用SetImageTesseractRect 。

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 }
Run Code Online (Sandbox Code Playgroud)

鉴于该类的基本构造函数是:

(datapath, language, OEM_DEFAULT, NULL, 0, NULL, NULL, false);
Run Code Online (Sandbox Code Playgroud)

这三个参数总是需要的,这是有道理的

如果数据路径、OcrEngineMode 或语言已更改 - 重新开始。
请注意, language_ 字段存储最后请求的初始化成功的语言,而 tesseract_->lang 存储实际使用的语言。仅当请求的语言为 NULL 时它们才不同,在这种情况下 tesseract_->lang 设置为 Tesseract 默认值(“eng”)。