Xcode iOS OpenCV内存泄漏。应用程序崩溃。

3

我目前在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
将你编写的创建UIImage的代码全部删除,改用MatToUIImage()函数。只需将mat传递给该函数即可获得图像。
虽然你没有问,但是不应该在这里使用运行循环或显示链接。时间和启动相关方法应该在OpenCV调用的processImage方法中调用。
此外,请确保您正在使用最新版本。这与您的问题无关,但这是一个好习惯。
要将OpenCV 3导入Xcode 8项目:
1.使用Cocoapods安装“OpenCV2”(它说“2”,但仍然是版本3)。不要安装“devel”版本。 2.在Cocoapods为您创建的工作区中打开项目(而不是您创建的项目文件),并将每个使用OpenCV的实现文件附加到.mm(而不是.m)文件。如果不这样做,您将收到奇怪的错误消息。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接