IOS OCR tesseract 为 nil 并使用 ACR 后不释放内存

Posted

技术标签:

【中文标题】IOS OCR tesseract 为 nil 并使用 ACR 后不释放内存【英文标题】:IOS OCR tesseract not release the memory after being nil and using ACR 【发布时间】:2014-12-29 13:27:43 【问题描述】:

我花了超过 24 小时调试和解决 tesseract 中的问题,我为多个图像循环下面的函数的问题,每次我跟踪内存,我发现每次调用时内存都会增加下线

Tesseract* tesseract = [[Tesseract alloc] initWithLanguage:@"eng+ita"];

它不受下面一行的影响

tesseract = nil;

下面是调用的完整函数

    -(void)recognizeImageWithTesseract:(UIImage *)img
    

     UIImage *testb = [img blackAndWhite];

       Tesseract* tesseract = [[Tesseract alloc] initWithLanguage:@"eng+ita"];

       tesseract.delegate = self;
         [tesseract setVariableValue:@"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz+-/*._=':!)(" forKey:@"tessedit_char_whitelist"]; //limit search
        [tesseract setImage:testb];
        [tesseract recognize];
         recognizedText = [tesseract recognizedText];
        tesseract = nil; //deallocate and free all memory

更新 1:

经过深度排查,我发现setimage的tesseract代码是原因,代码如下,我需要知道我必须更新哪些代码才能解决这个问题

- (void)setImage:(UIImage *)image 

    if (image == nil || image.size.width <= 0 || image.size.height <= 0) 
        NSLog(@"WARNING: Image has not size!");
        return;
    

    self.imageSize = image.size; //self.imageSize used in the characterBoxes method
    int width = self.imageSize.width;
    int height = self.imageSize.height;

    CGImage *cgImage = image.CGImage;
    CFDataRef data = CGDataProviderCopyData(CGImageGetDataProvider(cgImage));
    _pixels = CFDataGetBytePtr(data);

    size_t bitsPerComponent = CGImageGetBitsPerComponent(cgImage);
    size_t bitsPerPixel = CGImageGetBitsPerPixel(cgImage);
    size_t bytesPerRow = CGImageGetBytesPerRow(cgImage);

    tesseract::ImageThresholder *imageThresholder = new tesseract::ImageThresholder();

    assert(bytesPerRow < MAX_INT32);
    
        imageThresholder->SetImage(_pixels,width,height,(int)(bitsPerPixel/bitsPerComponent),(int)bytesPerRow);
        _tesseract->SetImage(imageThresholder->GetPixRect());
    

    imageThresholder->Clear();
    CFRelease(data);
    delete imageThresholder;
    imageThresholder = nil;

请支持我解决这个问题

非常感谢

【问题讨论】:

您使用的是 ARC 还是 MRC? 那么不需要将tesseract设置为nil。使用仪器,看看问题出在哪里。你可能有一个参考周期。 我现在测试了同样的问题 【参考方案1】:

您在一个紧密的循环中执行此操作,并且在每个应用程序运行循环后都会释放内存。你需要做的是

// your loop here 
for (int i = 0; i < n; i++) 
    @autoreleasepool 
        // perform memory intensive task here;
    

因此,每次完成繁重的任务后,内存自动释放池都会耗尽。

阅读此处了解更多详情:

Objective-C: Why is autorelease (@autoreleasepool) still needed with ARC?

【讨论】:

经过测试,我发现内存增加的步数变低了(每个循环大约5M),但是对于长循环,它会导致应用程序崩溃,请支持认为这个答案是最好的答案跨度> 然后其他部分出错了,这应该是一个单独的问题。您的循环内存释放问题解决方案就是@autoreleasepool。

以上是关于IOS OCR tesseract 为 nil 并使用 ACR 后不释放内存的主要内容,如果未能解决你的问题,请参考以下文章

Tesseract OCR 无法识别除法符号“÷”

iPhone iso的Tesseract限制?适用于 ios 的任何其他 OCR 引擎

为啥 Tesseract OCR 库(iOS)根本无法识别文本?

OCR Tesseract 只设置数字

iOS .Tesseract OCR 为啥识别如此纯粹。发动机原理

tesseract 的 OCR 结果高度不一致