2016-11-20 13 views
0

ここにこの質問を投稿する前に、私はすべての資料とそれに似た投稿を読みましたが、何が起きているのか、そしてどのように修正するのか、質問は誰もが@autoreleasepoolでこの問題を解決していました。この場合、私は目標を達成できませんでした。だから、cvMatをUIImageに変換すると、サイズに応じてメモリが増えます。cvMatをUIImageに変換する際のメモリの問題

以下

iは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(); 

問題が表示され、メモリは400メガバイトまで、それが上昇し、サイクルごとになります。

+ (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を試みたが、問題はまだ漏れが全く存在しないleaksプロファイラに、exsits、およびメモリの中で最も高価なタスクはconvertMatToUIImageでいます。

私はそれについて一日中読んでいますが、実際にはまだ役に立たない解決策を見つけることはできません。

は現在、私はclass XXXを継承swift 3.0上で動作し、それが何かをトリミングし、同様にUIImageに戻るよりも、しobjCクラスを使用しています。 deinitで私は、これはクラスプロパティのnilを継承割り当てていますが、あなたが示唆できれば問題はまだexsists.Also私は.. dataWithBytes iがNSDataを作成した後に開始時に16MBを持っているかのように、それは32MBになりますメモリを複製していると思い

としてくださいこの問題に関する有用なスレッド私はそれらをすべて読むことがうれしいです。助けてくれてありがとう

答えて

0

この問題を3日以上経て、私は関数を書き直さなければならず、それは100%働いていました。私は5種類のデバイスでテストしました。

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のデータを読むことだけです。このスレッドが誰かを助けることを願っています。

関連する問題