我正在尝试将CVMat转换为UIImage,但是我遇到了内存泄漏,并且无法在我的生活中找出答案。问题在于。我使用的是openCV在其示例代码Located Here中使用的相同功能。
代码说明如下:
+(UIImage *)UIImageFromCVMat:(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);
bool alpha = cvMat.channels() == 4;
CGBitmapInfo bitMapInfo = (alpha ? kCGImageAlphaLast : kCGImageAlphaNone) | kCGBitmapByteOrderDefault;
// Creating CGImage from cv::Mat
CGImageRef imageRef = CGImageCreate(cvMat.cols, //width
cvMat.rows, //height
8, //bits per component
8 * cvMat.elemSize(), //bits per pixel
cvMat.step[0], //bytesPerRow
colorSpace, //colorspace
bitMapInfo, // bitmap info
provider, //CGDataProviderRef
NULL, //decode
false, //should interpolate
kCGRenderingIntentDefault //intent
);
// Getting UIImage from CGImage
UIImage *finalImage = [UIImage imageWithCGImage:imageRef];
CGImageRelease(imageRef);
CGDataProviderRelease(provider);
CGColorSpaceRelease(colorSpace);
return finalImage;
}
有人对问题的位置有任何建议吗? (我们已经缩小并确定这是泄漏的地方)。
修改
提供我发现的更多信息:如果从未使用过该函数的输出,则没有问题。只有当我们将此结果分配给不同类中的变量时,我们才会遇到问题。
答案 0 :(得分:4)
好的,经过多次搜索后,我们发现了解决方案(虽然我对此问题仍然没有非常深刻的理解,如果有人能够指出我为什么会出现这个问题的正确方向,那就是太好了)。
所有需要做的就是在@autoreleasepool{}
标记中包含使用此结果的代码行。
答案 1 :(得分:0)
假设您没有使用ARC,我的猜测是有问题的陈述是
CGDataProviderRef provider = CGDataProviderCreateWithCFData((__bridge CFDataRef)data);
__bridge
不转让所有权,因此CGDataProviderRelease(provider);
不会释放原始对象
您要么明确发布data
,要么使用__bridge_transfer
将所有权转移到provider
,然后随CGDataProviderRelease(provider);