代码之家  ›  专栏  ›  技术社区  ›  madmax

ios和opencv:如何在不浪费内存的情况下正确调用cvtColor?

  •  2
  • madmax  · 技术社区  · 11 年前

    我在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(无符号长,无效**)
    1 0x20178000 VM:CoreAnimation 00:22.415.490 7,91 MB QuartzCore CA::Render::aligned_malloc(无符号长,无效**)
    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

    1 回复  |  直到 11 年前
        1
  •  1
  •   rockinfresh    11 年前

    我通常转换成原始图像,没有问题。如果希望保留原始的目标垫图像,可以创建另一个目标垫图像。因此,这是基于个案的基础。

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

    尝试以下方法: 1) 很可能是因为你没有申报频道。例如 CV_8U3

    2) 如果第一步不起作用,另一种可能性很高:尝试使用 CV_BGR2RGB 而不是 cv::COLOR_BGR2RGB (版本兼容性问题)

    3) 你试过移除指针吗? &

    如果这三种方法仍然不起作用,请对您收到的关于此答案的确切错误消息进行评论。我会尽力帮你的。干杯

    编辑(回答您的意见):

    当我谈到频道时,我的意思是 CV_8U3, CV_8U 等等。不过,您不必再尝试了,因为错误是由于IOS的攻击性内核线程导致的,该线程将所有进程设置为在低内存上杀死所有进程。这意味着当后台进程正在运行时,它们更有可能被“杀死”以为当前/正在运行/前台进程分配内存。

    有关该内核的更多信息: http://newosxbook.com/articles/MemoryPressure.html

    我不是IOS的专家,但我认为你可以尝试一下:

    1) 使用全局变量,例如,将材质图像设置为全局而不是局部

    2) 对某些人来说,一个稍微糟糕的编程惯例是:跳过函数,只将代码从函数转储到试图调用函数的主/或程序。这确保了IOS不需要切换进程,从而杀死其中任何一个。

    3) 在内核中定义应用程序配置文件(UIBackgroundMode),从而稍微驯服Jetsam这个咄咄逼人的内核杀手。

    4) 当不再需要图像时,从RAM中释放图像(删除对它们的引用)