【问题标题】:Tesseract 3.02 - How to properly free up memory?Tesseract 3.02 - 如何正确释放内存?
【发布时间】:2013-08-30 04:05:20
【问题描述】:

我发现使用 tesseract api 运行的非常简单的应用程序存在内存泄漏。我知道 tesseract api 说我必须从 GetUTF8Text() 中删除 [] char 数组,但它在我的情况下崩溃了。这是代码块:

int main(int argc, char** argv){
Mat plate_segments = imread(argv[1], 0);
tesseract::TessBaseAPI *myOCR = new tesseract::TessBaseAPI();
myOCR->SetPageSegMode(tesseract::PSM_AUTO);
if (myOCR->Init("./", "newnz+oldnz")) {

        std::cerr << "Could not initialize tesseract." << std::endl;
        exit(1);
    }
myOCR->SetVariable("tessedit_char_blacklist","abcdefghijklmnopqrstuvwxyz`~!@#$%^&*()_+-={}[]|\':;/?.<,>");
myOCR->SetVariable("tessedit_char_whitelist","ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789");
myOCR->SetImage((uchar*) plate_segments.data,plate_segments.size().width, plate_segments.size().height, plate_segments.channels(), plate_segments.step1());
myOCR->Recognize(0);
char* license_result = myOCR->GetUTF8Text();
printf("OCR output:\n%s", license_result );
    delete [] license_result; // CAUSE CRASH
myOCR->Clear();
myOCR->End();
return 0;}

我需要“删除 myOCR”吗?我确实尝试过,但它也崩溃了。

【问题讨论】:

  • 这是错误的myOCR-&gt;~TessBaseAPI();,应该是delete myOCR;。由于您在删除时遇到崩溃,这表明您的程序正在导致堆损坏。不幸的是,我没有足够的程序来猜测发生了什么。但我会说在您调用此代码之前 出了点问题。初始化plate_segments时可能有问题?
  • 我确实尝试删除 myOCR->~TessBaseAPI() 并使用 delete myOCR 并且我的程序也崩溃了,这就是我如此困惑的原因。 myOCR->~TessBaseAPI() 仅在我没有想法时使用。
  • 至于plate_segments,它似乎工作正常,tesseract可以识别它,我遵循了一些关于使用opencv Mat格式的tesseract的教程,参数都相似。
  • 不幸的是,“正常工作”与没有错误不同。您的错误是认为仅仅因为它在您删除时崩溃,删除一定有问题,但事实并非如此。您的程序具有堆损坏的典型症状,该损坏已在程序的早期发生。我不知道在哪里,因为我看不到其余的代码。仅仅因为 plate_segments 似乎工作正常并不意味着它没有破坏堆。但只是我的猜测,如果您需要更多帮助,请发布更多代码。
  • 完整代码已更新,请查看

标签: c++ opencv ocr tesseract


【解决方案1】:

试试

delete myOCR;
myOCR=nullptr;

所以,你不需要打电话

myOCR->Clear();
myOCR->End();

因为 delete 为你做了! (调用 ~TessBaseAPI() )

【讨论】:

    猜你喜欢
    • 2020-06-23
    • 1970-01-01
    • 1970-01-01
    • 2016-08-09
    • 1970-01-01
    • 2023-03-11
    • 2020-11-28
    • 2011-06-26
    • 1970-01-01
    相关资源
    最近更新 更多