iphone - iOS + OpenCV - 垫内存泄漏

我正在使用从 iOS 源代码编译和构建的 OpenCV 2.2。我用过这个blog post作为向导。

我玩弄了一些东西来工作,比如使图像灰度化、模糊它们甚至运行 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++ 接口(interface)所以我创建了下面的函数。
+ (Mat)MatFromUIImage:(UIImage *)image
{
    IplImage *iplImage = [self IplImageFromUIImage:image];
    Mat result(iplImage, true);
    cvReleaseImage(&iplImage);
    return result;
}

一旦我开始使用这种方法,我的应用程序就会开始泄漏并因此被杀死。

关于我做错了什么的任何想法?

最佳答案

你在这里打电话

Mat::Mat(const IplImage* img, bool copyData=false)

将 copyData 设置为 true ,你能确定Mat::release()被调用?如果您的 refcount 永远不会返回 0,那么您的析构函数永远不会触发,从而在 ram 中留下大量图像数据的副本。

https://stackoverflow.com/questions/5999816/

相关文章:

opencv - 在opencv中读写图像

opencv - cvMatchTemplate()函数给出断言失败错误? OpenCV的

c# - 无法访问 C# emgucv 中的 Image.Data 属性

image - 从输入图像获取RGB像素并在opencv中重建输出图像

opencv - opencv中是否有用于处理Blob的好的库?

docker - 在 Windows 2019 服务器上运行 linux 容器时出错

opencv - createVideoWriter()openCV中fps的最佳值

docker - 为什么 Neo4J docker 身份验证不起作用

visual-studio-2010 - cvCreateButton VS2010

opencv - 检测视频帧中的现实世界对象