我正在使用OpenCV on iOS对UIImage
进行一些图像处理。
方法processImage
消耗太多内存。当我用仪器中的分配来分析应用程序时。在Live Bytes
到65MB
的{{1}}峰值大约一秒钟。这会导致应用程序崩溃。
曾经更高,70MB
,更改~90MB
减少了此项(从int ddepth
到CV_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;
}
编辑更新:我接受了@sansuiso的回答,因为它将docs.opencv.org
减少了Live Bytes
。
但是,我仍在寻求进一步减少,任何建议将不胜感激。感谢。
答案 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之后)。