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

8

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

processImage方法消耗的内存太多了。当我使用Instruments中的分配来分析应用程序时,Live Bytes在大约一秒钟的时间内峰值达到65MB70MB,这导致应用程序崩溃。

以前更高,即 ~90MB ,将int ddepth更改为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;

}

编辑备注:我正在使用来自docs.opencv.orgcvMatFromUIImage

编辑更新:我接受了@sansuiso的答案,它将Live Bytes减少了约3MB。 然而,我仍在寻找进一步的减少,任何建议都将不胜感激。谢谢。


你能否包含你的 cvMatFromUIImage: 方法的定义? - Ben Lings
@BenLings 这里是来自docs.opencv.org的链接:http://docs.opencv.org/doc/tutorials/ios/image_manipulation/image_manipulation.html#opencviosimagemanipulation - Ríomhaire
2个回答

3

cv::GaussianBlur函数可以原地处理图像。 您可以将[self cvMatFromUIImage:imageToProcess]的输出赋值给变量imageMatrix,这样可以避免创建额外的图像并减少峰值,即执行以下操作:

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

您可能还需要检查 cvMatFromUIImage 方法的内容,以确保内部所有内容都被正确释放。


谢谢 @sansuiso,很抱歉我不太明白你说的“您可以分配[self cvMatFromUIImage:imageToProcess]的输出”的意思。 - Ríomhaire
cv :: Mat imageMatrix = [self cvMatFromUIImage:imageToProcess]; 然后 cv :: GaussianBlur(imageMatrix,imageMatrix,cv :: Size(3,3),sigmaX); - Ríomhaire
是的,没错。我正在更新答案。 - sansuiso

2

这要么是在[self cvMatFromUIImage:]函数中存在内存泄漏,要么就是经常出现内存分配问题。

为了确保没有内存泄漏,请向我们展示cvMatFromUIImage清单。

内存分配

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


这里是来自docs.opencv.org的内容:http://docs.opencv.org/doc/tutorials/ios/image_manipulation/image_manipulation.html#opencviosimagemanipulation - Ríomhaire

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接