objective-c - Opencv内存堆积(未正确释放)

标签 objective-c opencv uiimage

我正在使用 3rd 方库进行图像处理,这种方法似乎是每次执行时都会使用大量内存(+30MB)的原因,并且无法正常释放。重复使用它最终会导致应用程序崩溃(内存过载)。使用的图像直接来 self 的 iP6 相机。

+ (UIImage *)UIImageFromCVMat:(cv::Mat)cvMat
{
    NSData *data = [NSData dataWithBytes:cvMat.data length:cvMat.elemSize() * cvMat.total()];

    CGColorSpaceRef colorSpace;

    if (cvMat.elemSize() == 1) {
        colorSpace = CGColorSpaceCreateDeviceGray();
    } else {
        colorSpace = CGColorSpaceCreateDeviceRGB();
    }

    CGDataProviderRef provider = CGDataProviderCreateWithCFData((__bridge CFDataRef)data);

    CGImageRef imageRef = CGImageCreate(cvMat.cols,                                     // Width
                                        cvMat.rows,                                     // Height
                                        8,                                              // Bits per component
                                        8 * cvMat.elemSize(),                           // Bits per pixel
                                        cvMat.step[0],                                  // Bytes per row
                                        colorSpace,                                     // Colorspace
                                        kCGImageAlphaNone | kCGBitmapByteOrderDefault,  // Bitmap info flags
                                        provider,                                       // CGDataProviderRef
                                        NULL,                                           // Decode
                                        false,                                          // Should interpolate
                                        kCGRenderingIntentDefault);                     // Intent

    // UIImage *image = [[UIImage alloc] initWithCGImage:imageRef];
    UIImage *image = [UIImage imageWithCGImage:imageRef];

    CGImageRelease(imageRef);
    CGDataProviderRelease(provider);
    CGColorSpaceRelease(colorSpace);

    return image;
}

我怀疑问题出在这里:(__bridge CFDataRef)data。我不能在它上面使用 CFRelease,因为它会使应用程序崩溃。项目正在使用 ARC 运行。

编辑:

openCV官网好像也有同样的代码: http://docs.opencv.org/2.4/doc/tutorials/ios/image_manipulation/image_manipulation.html

啊!

编辑 2 这是我如何使用它的代码(实际上下面的代码也是第 3 方库的一部分,但我添加了一些行)。

 cv::Mat undistorted = cv::Mat( cvSize(maxWidth,maxHeight), CV_8UC4); // here nothing
        cv::Mat original = [MMOpenCVHelper cvMatFromUIImage:_adjustedImage]; // here +30MB

        //NSLog(@"%f %f %f %f",ptBottomLeft.x,ptBottomRight.x,ptTopRight.x,ptTopLeft.x);
        cv::warpPerspective(original, undistorted,
                            cv::getPerspectiveTransform(src, dst), cvSize(maxWidth, maxHeight)); // here +16MB 



        _cropRect.hidden=YES;

        @autoreleasepool {
            _sourceImageView.image=[MMOpenCVHelper UIImageFromCVMat:undistorted]; // here +15MB (PROBLEM)
        }         

        original.release(); // here -30MB (THIS IS OK)
        undistorted.release(); // here -16MB (ok)

最佳答案

我猜这是一个很难的主题,因为没有多少人那么了解 OpenCV。我发现,对于类似问题的大多数答案都涉及将 @autoreleasepool 放在使用此方法的地方。但似乎也没有释放内存。

作为临时解决方案,我将提供给该方法的图像大小调整了一半。至少应用程序在最终崩溃之前会持续更长时间。它只是工作。

关于objective-c - Opencv内存堆积(未正确释放),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42293286/

相关文章:

python - OpenCV VideoCapture 无法在 Python 中读取视频,但可以在 VS11 中读取

ios - 在 Swift 中将图像发送到 ViewController 的多个实例

objective-c - 音频播放的准确(音乐级)计时

ios - 如何在所有 UIView 完成动画后调用完成 block 来为 UIView 数组设置动画?

ios - block 对象会导致保留周期吗?

ios - 从 UIViewController 更改 UIWindow backgroundColor?

ios - 在实时 iphone 摄像头中使用 OpenCV 检测物体的存在

OpenCV 乘以对象进/出计数

ios - UIImage imageNamed : always returns image at 1x

iphone - 检测 ios 应用程序是否在 iPhone、iPhone Retina 显示屏或 iPad 上运行的代码是什么?