ここにこの質問を投稿する前に、私はすべての資料とそれに似た投稿を読みましたが、何が起きているのか、そしてどのように修正するのか、質問は誰もが@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
になりますメモリを複製していると思い
としてくださいこの問題に関する有用なスレッド私はそれらをすべて読むことがうれしいです。助けてくれてありがとう