我使用从源代码编译而成的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