OGeek|极客世界-中国程序员成长平台

标题: ios和opencv : how to correctly call cvtColor without wasting memory? [打印本页]

作者: 菜鸟教程小白    时间: 2022-12-12 18:57
标题: ios和opencv : how to correctly call cvtColor without wasting memory?

我在我的 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-推荐答案


我通常可以毫无问题地转换原始图像。如果您希望保留原始图像,可以创建另一个目标垫图像。所以它是根据具体情况而定的。

宁愿评论也不愿回复,但我的回答会太长。

试试这个方法: 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/






欢迎光临 OGeek|极客世界-中国程序员成长平台 (http://sqlite.in/) Powered by Discuz! X3.4