减少在iOS上使用OpenCv的方法所消耗的内存

时间:2013-04-15 13:18:56

标签: ios objective-c optimization opencv image-processing

我正在使用OpenCV on iOSUIImage进行一些图像处理。

方法processImage消耗太多内存。当我用仪器中的分配来分析应用程序时。在Live Bytes65MB的{​​{1}}峰值大约一秒钟。这会导致应用程序崩溃。

曾经更高,70MB,更改~90MB减少了此项(从int ddepthCV_16S)。虽然我确实理解减少“目标图像的所需深度”可能会减少所消耗的内存,但我不明白它是选择最佳内容的内部工作方式。 格式。

CV_8U的减少似乎也增加了该方法的执行时间。

我希望大大减少ddepth峰值,并减少方法的执行时间。

如何实现这一目标的任何见解将不胜感激。

Live Bytes

编辑注意:我使用- (void)processImage:(UIImage *)imageToProcess { cv::Mat imageMatrix; double sigmaX = 1.0; int ddepth = CV_8U; // ddepth – The desired depth of the destination image cv::GaussianBlur( [self cvMatFromUIImage:imageToProcess], imageMatrix, cv::Size(3,3), sigmaX); cv::Laplacian(imageMatrix, imageMatrix, ddepth, 1); double minVal; double maxVal; cv::minMaxLoc(imageMatrix, &minVal, &maxVal); std::cout << "min val : " << minVal << std::endl; std::cout << "max val: " << maxVal << std::endl; }

中的cvMatFromUIImage

编辑更新:我接受了@sansuiso的回答,因为它将docs.opencv.org减少了Live Bytes。 但是,我仍在寻求进一步减少,任何建议将不胜感激。感谢。

2 个答案:

答案 0 :(得分:3)

函数cv::GaussianBlur可以就地处理图像。 您可以将[self cvMatFromUIImage:imageToProcess]的输出分配给变量imageMatrix,这样可以避免额外的图像创建并降低峰值,即继续:

cv::Mat imageMatrix = `[self cvMatFromUIImage:imageToProcess];
cv::GaussianBlur(imageMatrix, imageMatrix, cv::Size(3,3), sigmax);

您可能还想检查cvMatFromUIImage方法的内容,以确保所有内容都在内部正确发布。

答案 1 :(得分:2)

[self cvMatFromUIImage:]经常是内存分配问题中的内存泄漏。

为确保没有内存泄漏,请向我们显示cvMatFromUIImage列表。

内存分配

尝试将所有临时图像移动到班级成员。这消除了不必要的内存分配,您的代码将在每个帧上重用已分配的内存。当用户代码对大量内存进行常量内存分配并释放它时,没有内存管理器喜欢。 你应该试着避免它,因为它会导致内存消耗和崩溃,因为内存管理器可以在一段时间内保留一个空闲内存(在你释放cv :: Mat之后)。