xcode ios opencv内存泄漏。应用程序正在崩溃

时间:2014-07-04 16:55:54

标签: ios objective-c xcode opencv memory

我目前正在iOS上使用openvc, 我正在尝试将cv :: Mat转换为UIImage。 但是应用程序在几秒钟后就崩溃了! (由于内存错误而终止)

这是我目前正在使用的代码:

using namespace cv;

#import "ViewController.h"

@interface ViewController ()

@end


@implementation ViewController
{
    CvVideoCamera* videoCamera;
    CADisplayLink*run_loop;
    UIImage*image2;
}





- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.

    videoCamera = [[CvVideoCamera alloc] initWithParentView:_liveview];
    videoCamera.defaultAVCaptureDevicePosition = AVCaptureDevicePositionBack;
    videoCamera.defaultAVCaptureSessionPreset = AVCaptureSessionPresetiFrame1280x720;
    videoCamera.defaultAVCaptureVideoOrientation = AVCaptureVideoOrientationLandscapeLeft;
    videoCamera.defaultFPS = 30;
    videoCamera.delegate = self;
    [videoCamera start];

    run_loop = [CADisplayLink displayLinkWithTarget:self selector:@selector(update)];
    [run_loop setFrameInterval:2];
    [run_loop addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSRunLoopCommonModes];

}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

- (void)update{



    _smallliveview.image = image2;



}


- (UIImage *)UIImageFromMat:(cv::Mat)image
{
    cvtColor(image, image, CV_BGR2RGB);
    NSData *data = [NSData dataWithBytes:image.data length:image.elemSize()*image.total()];

    CGColorSpaceRef colorSpace;

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

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

    // Creating CGImage from cv::Mat
    CGImageRef imageRef = CGImageCreate(image.cols,                                 //width
                                        image.rows,                                 //height
                                        8,                                          //bits per component
                                        8 * image.elemSize(),                       //bits per pixel
                                        image.step.p[0],                            //bytesPerRow
                                        colorSpace,                                 //colorspace
                                        kCGImageAlphaNone|kCGBitmapByteOrderDefault,// bitmap info
                                        provider,                                   //CGDataProviderRef
                                        NULL,                                       //decode
                                        false,                                      //should interpolate
                                        kCGRenderingIntentDefault                   //intent
                                        );


    // Getting UIImage from CGImage
    UIImage *finalImage = [UIImage imageWithCGImage:imageRef];
    //[self.imgView setImage:finalImage];
    CGImageRelease(imageRef);
    CGDataProviderRelease(provider);
    CGColorSpaceRelease(colorSpace);




    return finalImage;

}

#pragma mark - Protocol CvVideoCameraDelegate

#ifdef __cplusplus
- (void)processImage:(Mat&)image;
{

    image2 = [self UIImageFromMat:image];

}
#endif

@end

我该怎么办? 如果有人可以帮助我,那将是非常好的!? (;

问候大卫

1 个答案:

答案 0 :(得分:0)

丢弃你写的所有内容以创建UIImage并使用MatToUIImage()函数代替。只需将垫子传递给该功能,即可获得图像。

虽然你没有问,但你不应该在这里使用运行循环或显示链接。时间并启动OpenCV调用的processImage方法的相关方法。

另外,请确保您使用的是最新版本。这与你的问题无关,但这是一种很好的做法。

将OpenCV 3导入Xcode 8项目:

  1. 安装' OpenCV2'与Cocoapods(它说' 2',但它仍然是版本3)。不要安装“开发者”。建立。

  2. 在工作区中打开您的项目为您创建的Cocoapods - 而不是您创建的项目文件 - 并附加使用OpenCV与.mm(与.m)相关的每个实现文件。如果您不这样做,您会收到奇怪的错误消息。