我使用從源代碼編譯而成的OpenCV 2.2 for iOS。我用這個blog post作爲指導。iOS + OpenCV - Mat內存泄漏
我已經玩弄了一些東西來工作,如使圖像灰度,模糊他們,甚至運行FAST。然而,我的問題是,我的代碼泄漏內存,這很快就會導致應用程序在設備上運行時被終止。
從博客帖子上面我用下面的代碼把一個UIImage到的IplImage
+ (IplImage *)IplImageFromUIImage:(UIImage *)image
{
// NOTE you SHOULD cvReleaseImage() for the return value when end of the code.
CGImageRef imageRef = image.CGImage;
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
IplImage *iplimage = cvCreateImage(cvSize(image.size.width, image.size.height), IPL_DEPTH_8U, 4);
CGContextRef contextRef = CGBitmapContextCreate(iplimage->imageData, iplimage->width, iplimage->height,
iplimage->depth, iplimage->widthStep,
colorSpace, kCGImageAlphaPremultipliedLast|kCGBitmapByteOrderDefault);
CGContextDrawImage(contextRef, CGRectMake(0, 0, image.size.width, image.size.height), imageRef);
CGContextRelease(contextRef);
CGColorSpaceRelease(colorSpace);
IplImage *ret = cvCreateImage(cvGetSize(iplimage), IPL_DEPTH_8U, 3);
cvCvtColor(iplimage, ret, CV_RGBA2RGB);
cvReleaseImage(&iplimage);
return ret;
}
這工作得很好,似乎不但是泄漏任何記憶,因爲我使用的OpenCV 2.2我想使用C++接口,所以我創建了下面的函數。
+ (Mat)MatFromUIImage:(UIImage *)image
{
IplImage *iplImage = [self IplImageFromUIImage:image];
Mat result(iplImage, true);
cvReleaseImage(&iplImage);
return result;
}
一旦我開始使用這種方法,我的應用程序開始泄漏,從而被殺死。
關於我在做什麼的錯誤?
因爲您正在使用'+',所以不應該是'[Classname IplImageFromUIImage:image]'而不是'self'? – slf 2011-05-14 04:41:38
@slf:這個調用是在類方法中的,所以'self'指向類對象,而不是實例。 – 2011-05-14 05:28:48