我在我的 ios 应用程序中使用此功能:
cv::cvtColor(image, image, cv::COLOR_BGR2RGB);
但是当我在我的 - (void)processImagecv::Mat&)image 委托(delegate)方法中调用它时,
图像在内存中消失。因此,几秒钟后,我的应用程序因内存问题而崩溃。
因内存压力而终止
我不只是将转换后的图像复制到以前的图像上吗?
我能做些什么来防止这种行为?
- (void)processImagecv::Mat&)image
{
cv::cvtColor(image, image, cv::COLOR_BGR2RGB);
}
数据在检查器中的样子的一些输出(这些 vm_allocate 行出现了很多):
0 0x20961000 VM:CoreAnimation 00:22.762.010 • 7,91 MB QuartzCore CA::Render::aligned_malloc(unsigned long, void**)
1 0x20178000 VM:CoreAnimation 00:22.415.490 • 7,91 MB QuartzCore CA::Render::aligned_malloc(unsigned long, void**)
2 0x2114a000 CGSImageData 00:22.762.165 • 5,95 MB CoreGraphics CGSImageDataHandleCreate
3 0x1f3a0000 VM:基础 00:22.752.743 • 5,93 MB libsystem_kernel.dylib vm_allocate
4 0x1fb89000 VM:基础 00:22.408.091 • 5,93 MB libsystem_kernel.dylib vm_allocate
Best Answer-推荐答案 strong>
我通常可以毫无问题地转换原始图像。如果您希望保留原始图像,可以创建另一个目标垫图像。所以它是根据具体情况而定的。
宁愿评论也不愿回复,但我的回答会太长。
试试这个方法:
1)很有可能是由于您没有声明 channel 。比如CV_8U3 等。
2)如果第一步不起作用,另一个可能性很大:尝试使用 CV_BGR2RGB 而不是 cv::COLOR_BGR2RGB (版本兼容性问题)
3) 你试过删除指针吗? &
如果这三种方法仍然不起作用,请评论您在此答案中收到的确切错误消息。我会尽力帮助你。干杯。
编辑(回答您的意见):
当我谈论 channel 时,我的意思是 CV_8U3, CV_8U 等。不过你不必再尝试了,因为错误是由于 IOS 的激进内核线程设置了所有杀死所有内存不足的进程。这意味着当后台进程正在运行时,它们更有可能被“杀死”以为当前/正在运行/前台进程分配内存。
有关该内核的更多信息:http://newosxbook.com/articles/MemoryPressure.html
我不是 IOS 方面的专家,但我认为你可以尝试:
1)使用全局变量,例如将 Mat Image 设为全局而非局部
2) 对某些人来说有点糟糕的编程约定:跳过函数并将代码从函数转储到试图调用该函数的主/或程序。这确保了 IOS 不需要切换进程,从而杀死它们中的任何一个。
3) 在内核中定义应用程序配置文件(UIBackgroundMode),从而稍微驯服一下激进的内核 killer Jetsam。
4) 当不再需要图像时,从 RAM 中释放图像(删除对它们的引用)
关于ios和opencv : how to correctly call cvtColor without wasting memory?,我们在Stack Overflow上找到一个类似的问题:
https://stackoverflow.com/questions/21864966/
|