我在ios应用程序中使用此功能:
cv::cvtColor(image, image, cv::COLOR_BGR2RGB);
但是当我在我的- (void)processImage:(cv::Mat&)image
委托方法中调用它时,
图像在内存中丢失。所以几秒钟后我的应用程序因内存问题而崩溃
因内存压力而终止
我不是只将转换后的图像复制到上一张图像上吗? 我该怎么做才能防止这种行为?
- (void)processImage:(cv::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:Foundation 00:22.408.091•5,93 MB libsystem_kernel.dylib vm_allocate
答案 0 :(得分:1)
我通常会毫无问题地转换原始图像。如果要保留原始图像,可以创建另一个目标垫图像。所以这是基于个案的基础。
宁可评论而不回复,但我的答案太长了。
试试这个方法:
1)很高的机会是由于你没有声明频道。例如CV_8U3
等。
2)如果第一步不起作用,则另一个可能性很高:尝试使用CV_BGR2RGB
代替cv::COLOR_BGR2RGB
(版本兼容性问题)
3)你试过删除指针吗? &
如果这三种方法仍然不起作用,请对您在此答案中收到的确切错误消息进行评论。我会尽力帮助你。欢呼声。
编辑(回答你的意见):
当我谈论频道时,我的意思是CV_8U3, CV_8U
等等。你不必再尝试它了,因为错误是由IOS的攻击性内核线程设置的,它会将所有进程设置为全部内存不足。这意味着当后台进程正在运行时,它们更有可能被“杀死”以为当前/运行/前台进程分配内存。
有关该内核的更多信息:http://newosxbook.com/articles/MemoryPressure.html
对于IOS,我不是一个专业人士,但我认为你可以尝试的事情:
1)使用全局变量,例如,使Mat Image全局而不是本地
2)对某些人来说略有不好的编程约定:跳过该函数并将代码从函数转储到试图调用该函数的main /或程序中。这可以确保IOS不需要切换进程,从而杀死其中任何一个。
3)在内核中定义应用程序配置文件(UIBackgroundMode),从而稍微驯服Jetsam,这是一个积极的内核杀手。
4)当不再需要图像时,从RAM中释放图像(删除对它们的引用)