首页 > 解决方案 > 如何修复图像捕获中的 Julia OpenCV Cxx 内存泄漏?

问题描述

根据这些说明,我在英特尔 Ubuntu 系统上本地构建了 OpenCV 。捕获 1000 张图像的几乎相同的 python、c++ 和 julia 演示程序大部分都按预期执行。python 和 c++ 版本运行良好,但“top”显示 julia 版本在运行时以每秒数十 MB 的速度使用系统内存。如果留得足够长,系统会耗尽内存并锁定。

为什么 julia 代码似乎会导致内存泄漏,我该如何解决?

using OpenCV
using Printf
cv = OpenCV


function main( )
    vidDevice="/dev/video0"
    cap = cv.VideoCapture(vidDevice)
    count = 1000
    while (cv.isOpened(cap) && count > 0)
        @printf("Capturing %4d\r", count)
        ret,img = cv.read(cap)
        count = count - 1
        
    end
    cv.release(cap)
    cv.destroyAllWindows()

end

main()

标签: opencvmemory-leaksjulia

解决方案


该代码导致内存泄漏,因为 Julia GC 不“知道” Mat Objects 的实际大小,并认为它只是指针的大小。您可以通过在循环内插入来强制 GC 运行,从而使此代码类似于 Python 工作,GC.gc()但这并不能解决核心问题,即即使系统内存不足,GC 也不会自动运行。

您的代码的此修改版本应该可以正常工作 -

using OpenCV
using Printf
cv = OpenCV


function main( )
    vidDevice="/dev/video0"
    cap = cv.VideoCapture(vidDevice)
    count = 1000
    while (cv.isOpened(cap) && count > 0)
        @printf("Capturing %4d\r", count)
        GC.gc()
        ret,img = cv.read(cap)
        count = count - 1
        
    end
    cv.release(cap)
    cv.destroyAllWindows()

end

main()

我在https://github.com/opencv/opencv_contrib/issues/2766为这个问题创建了一个跟踪器


推荐阅读