TessBaseAPI :: Clear()的语义

时间:2018-06-27 18:51:12

标签: c++ ocr tesseract

假设我已经创建了两个对象TessBaseAPIxapiyapi —通过调用以下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 的角度出发,此时xapiyapi被假定为相同。我的假设正确吗?我希望如此,因为我没有发现对象不相同的任何原因。


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

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

,然后我使用xapi从图像中提取一些文本。提取完毕后,就可以这样做:

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

在致电Clear()之后,我可以互换使用xapiyapi吗?换句话说,从行为 1 的角度来看,我现在可以假设xapiyapi是相同的吗?我可以说Clear()实际上是一种重置功能吗?

1。 “行为”是指性能的准确性,而不是速度/延迟。

2 个答案:

答案 0 :(得分:4)

根据void tesseract::TessBaseAPI::Clear() documentation,对此函数的调用将释放图像数据和识别结果。它没有说明配置数据。此外,如果作者认为配置数据加载很耗时,它将保持完整:without actually freeing any recognition data that would be time-consuming to reload

回答其他问题:

  1. “在调用Clear()之后,我可以互换使用xapi和yapi吗?” -是的,您可能会这样做,但是结果可能会有所不同,因为您通过xapi应用于SetVariable()而不是yapi应用于SetVariable()的设置。

  2. “换句话说,从行为1的角度来看,我现在可以假设xapi和yapi是相同的吗?” -根据您用reset更改的设置,结果可能相同也可能不同。

  3. “我可以说Clear()实际上是一种重置功能吗?” -仅丢弃识别结果和图像数据,其他所有内容保持不变。根据您对public @interface A { } public @interface B extends A { //Gets stuff Class data(); } public @interface C extends A { //Gets different stuff related to same goal int dataA(); String dataB(); } public @interface D { Class<? extends A>[] order(); } @B(Bar.class) @C(dataA = 5, dataB = "Bla") @D(order = {B.class, C.class}) public class SomeImportantClass { } 的定义,您可以将其称为重置还是不重置,毕竟它是一个自由的国家=)

您可以使用Clear()检查End()与完整拆解之间的差异。它位于baseapi.cpp的1400行附近。

答案 1 :(得分:1)

  

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

从一开始,我找不到任何可以质疑这一假设的东西。

调查源代码。

清除或重置以下参数(如果需要):

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

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 }

对于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不会影响初始化值:

  

仅适用于非初始变量(初始变量应传递给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()实际上是一种重置功能吗?

并不是将其恢复到初始状态。它将原始对象的某些值更改为null。它将保持const char * datapath, const char * language, OcrEngineMode oem,之类的参数的艰苦工作。这似乎是释放内存而又不破坏对象的一种方法。 Inline with“实际上并没有释放任何费时的识别数据来重新加载。”

在调用Clear()之后,请先调用SetImageTesseractRect,然后再使用识别或Get *函数。

Clear不会丢弃SetVariable,只会在销毁对象后通过调用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

  

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