2016-11-20 13 views
0

,我看了所有的材料和它类似的职位,但我不能让主“理念”正在发生什么,以及如何解决它,以同样的10的问题,每个人都与@autoreleasepool在这种情况下,我无法才达到我的目标解决这个问题。所以,当转换cvMat到UIImage我有增加内存取决于大小。内存问题在这里张贴了这个问题之前,将与CvMat到的UIImage

下面是步骤,我正在转换垫的UIImage之前做:

cv::Mat undistorted = cv::Mat(cvSize(maxWidth,maxHeight), CV_8UC1); 
cv::Mat original = [MatStructure convertUIImageToMat:adjustedImage]; 

cv::warpPerspective(original, undistorted, cv::getPerspectiveTransform(src, dst), cvSize(maxWidth, maxHeight)); 
original.release(); 

adjustedImage = [MatStructure convertMatToUIImage:undistorted]; 
undistorted.release(); 

问题是可见的,而我将我的垫的UIImage,内存上升到400 MB,并在每次上升周期。

+ (UIImage *) convertMatToUIImage: (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); 
     CGBitmapInfo bmInfo = kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big; 

     CGImageRef imageRef = CGImageCreate(cvMat.cols,        // width 
              cvMat.rows,        // height 
              8,          // bits per component 
              8 * cvMat.elemSize(),     // bits per pixel 
              cvMat.step.p[0],       // bytesPerRow 
              colorSpace,        // colorspace 
              bmInfo,         // bitmap info 
              provider,        // CGDataProviderRef 
              NULL,         // decode 
              false,         // should interpolate 
              kCGRenderingIntentDefault    // intent 
              ); 

     UIImage *image = [[UIImage alloc] initWithCGImage:imageRef]; 
     CGImageRelease(imageRef); 
     CGDataProviderRelease(provider); 
     CGColorSpaceRelease(colorSpace); 
     cvMat.release(); // this line is optional. 

     return image; 
    } 

我见过很多类似的代码,但是每个例子都是这样的。 我相信在(__bridge CFDataRef)ARC这个问题持有不能清理该数据,如果我会尽量CFRelease((__bridge CFDataRef)data)比会发生碰撞,因为程序会搜索分配内存和将已释放,因此将运行崩溃。

我使用openCV3并想尽方法MatToUIImage但问题依然exsits,在leaks探查无泄漏可言,并在内存中最昂贵的任务是convertMatToUIImage

我读了一整天关于它,但实际上无法找到任何有用的解决方案呢。

目前我在swift 3.0它继承class XXX工作,它使用objC类裁剪的东西,不是回到UIImage为好。在deinit我正在分配这个继承类属性为零,但问题仍然exsists.Also我认为dataWithBytes就像如果我有16MB在开始创建NSData之后会32MB重复记忆..

并请,如果你能提出关于这个问题的有用的线程,我会很高兴阅读它们。感谢您的帮助

回答

0

在这个问题上工作超过三天后,我不得不重写的功能和它的工作100%,我有五个不同的设备进行测试。

CFReleaseFree()和@autoreleasepool没有帮助我的一切,我实现了这一点:

data = UIImageJPEGRepresentation([[UIImage alloc] initWithCGImage:imageRef], 0.2f); // because images are 30MB and up 
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
NSString *documentsDirectory = [paths objectAtIndex:0]; 
NSString *appFile = [documentsDirectory stringByAppendingPathComponent:@"MyFile.jpeg"]; 

[data writeToFile:appFile atomically:NO]; 

data = nil; 

这个解决方案,一切运行良好。所以,我抢 UIImage并转换为 NSData,之后,我们应该将它保存到本地目录和留下的唯一一件事就是从 directory读取数据。希望这一线程有助于某一天。