使用 Tesseract 进行 OCR 会导致 GetUTF8Text 方法出现内存泄漏

Posted

技术标签:

【中文标题】使用 Tesseract 进行 OCR 会导致 GetUTF8Text 方法出现内存泄漏【英文标题】:Using Tesseract for OCR gives memory leak on GetUTF8Text method 【发布时间】:2012-06-04 02:38:32 【问题描述】:

我正在使用 tesseract OCR 读取名片。 我有内存泄漏,我无法解决它,我不知道如何解决。

在我的代码中...

tesseract->Recognize(NULL); 
char* utf8Text = tesseract->GetUTF8Text();

GetUTF8Text() 方法会导致内存泄漏。 这是内存泄漏工具的日志:

tesseract::TessBaseAPI::GetUTF8Text()
operator new[](unsigned long) libstdc++.6.dylib
operator new(unsigned long) libstdc++.6.dylib
malloc libsystem_c.dylib

在一些内存泄漏后,应用程序崩溃。 GetUTF8Text 在 baseapi.h 文件中。我认为 tessearact 是由 c++ 编写的。我不知道c++。 任何人都可以帮忙吗?或者有人有干净的tesseract吗?

【问题讨论】:

【参考方案1】:

根据我在baseapi.h 中找到的文档。

/**
 * The recognized text is returned as a char* which is coded
 * as UTF8 and must be freed with the delete [] operator.
 */
char* GetUTF8Text();

因此,完成后您需要delete [] utf8text

tesseract->Recognize(NULL); 
char* utf8Text = tesseract->GetUTF8Text();
... //use utf8Text or copy if necessary
delete [] utf8text;

【讨论】:

我真的很感谢你们俩。我已经阅读了baseapi中的评论。但我认为它是“删除 tesseract”。 我明白,尤其是当你说你不懂 C++ 时。每当您使用 new [] 分配一个数组时(这就是 tesseract 正在做的事情),那么您必须使用 delete [] 删除它 我知道 C++,这就是我转向 vb.net 的原因。只是它还是那样吗?另外,无论如何,您如何快速获得内存泄漏。 一旦不再引用它,它就会成为泄漏。 你好,在这一行中,我的访问 tesseract->Recognize(NULL); char* utf8Text = tesseract->GetUTF8Text();请告诉我如何解决这个问题..【参考方案2】:

来自 Tesseract 文档:

识别的文本以编码为 UTF8 的 char* 形式返回,并且 必须使用 delete [] 运算符释放。

换一种说法:释放内存是你的责任,所以它是你的泄漏而不是 Tesseracts。

【讨论】:

是的,我读过。在 startOCR 中:tesseract->Recognize(NULL); char* utf8Text = tesseract->GetUTF8Text(); [self performSelectorOnMainThread:@selector(ocrProcessingFinished:) withObject:[NSString stringWithUTF8String:utf8Text] waitUntilDone:NO];在 ocrProcessingFinished 事件中:tesseract->Clear();正方体->结束();删除正方体;仍然存在内存泄漏。

以上是关于使用 Tesseract 进行 OCR 会导致 GetUTF8Text 方法出现内存泄漏的主要内容,如果未能解决你的问题,请参考以下文章

Python:在使用 python tesseract API 接口时遇到 OCR 问题

有没有办法用小字体改进 tesseract OCR?

Windows安装用于OCR的Tesseract及使用命令行参数进行OCR

使用Python,OpenCV进行Tesseract-OCR绑定及识别

如何使用 tesseract 对文档中的多个列进行 OCR

使用 Tesseract OCR 进行汉字识别