8

在 iOS上使用 OpenCV 在UIImage.

该方法processImage消耗太多内存。当我使用 Instruments 中的分配来分析应用程序时。Live Bytes峰值大约65MB持续一70MB秒钟。这会导致应用程序崩溃。

它曾经更高,即~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;

}

编辑说明:我正在使用来自的cvMatFromUIImagedocs.opencv.org

编辑更新:我接受了@sansuiso 的回答,因为它减少了Live Bytesby ~3MB。但是,我仍在寻找进一步的减少,任何建议将不胜感激。谢谢。

4

2 回答 2

3

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

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

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

于 2013-04-15T14:18:57.897 回答
2

它要么是内存泄漏,[self cvMatFromUIImage:]要么经常是内存分配问题

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

内存分配

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

于 2013-04-19T08:08:02.287 回答