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

Río*_*ire 8 optimization opencv image-processing objective-c ios

在iOS上使用OpenCV对a进行一些图像处理UIImage.

该方法processImage消耗了太多内存.当我用仪器中的分配来分析应用程序时.将Live Bytes在峰65MB70MB大约一秒钟.这会导致应用程序崩溃.

它曾经更高,即~90MB改变int ddepth减少(从)CV_16SCV_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;

}
Run Code Online (Sandbox Code Playgroud)

编辑注:我使用cvMatFromUIImagedocs.opencv.org

编辑更新:我接受@sansuiso的答案,因为它降低了Live Bytes通过~3MB.但是,我仍在寻求进一步减少,任何建议将不胜感激.谢谢.

san*_*iso 3

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

cv::Mat imageMatrix = `[self cvMatFromUIImage:imageToProcess];
cv::GaussianBlur(imageMatrix, imageMatrix, cv::Size(3,3), sigmax);
Run Code Online (Sandbox Code Playgroud)

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