【问题标题】:xcode ios opencv memory leak. App is crashingxcode ios opencv 内存泄漏。应用程序崩溃
【发布时间】:2014-07-04 16:55:54
【问题描述】:

我目前正在使用 openvc 在 iOS 上工作, 我正在尝试将 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

我该怎么办? 如果有人可以帮助我,那就太好了!? (;

大卫你好

【问题讨论】:

    标签: ios objective-c xcode opencv memory


    【解决方案1】:

    丢弃您为创建 UIImage 而编写的所有内容,并改用 MatToUIImage() 函数。只需将垫子传递给函数,您就拥有了您的图像。

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

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

    将 OpenCV 3 导入 Xcode 8 项目:

    1. 使用 Cocoapods 安装“OpenCV2”(它说的是“2”,但它仍然是版本 3)。不要安装“开发”版本。

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

    【讨论】:

      猜你喜欢
      • 2018-04-04
      • 2011-07-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-01
      • 2017-06-09
      相关资源
      最近更新 更多