我正在使用从 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;
}
+ (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)
true
,你能确定Mat::release()
被调用?如果您的 refcount 永远不会返回 0,那么您的析构函数永远不会触发,从而在 ram 中留下大量图像数据的副本。
https://stackoverflow.com/questions/5999816/
相关文章:
opencv - cvMatchTemplate()函数给出断言失败错误? OpenCV的
c# - 无法访问 C# emgucv 中的 Image
image - 从输入图像获取RGB像素并在opencv中重建输出图像
opencv - opencv中是否有用于处理Blob的好的库?
docker - 在 Windows 2019 服务器上运行 linux 容器时出错
opencv - createVideoWriter()openCV中fps的最佳值
docker - 为什么 Neo4J docker 身份验证不起作用