opencv - 如何修复图像捕获中的 Julia OpenCV Cxx 内存泄漏?

标签 opencv memory-leaks julia

根据 these instructions,我在英特尔 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()

最佳答案

该代码导致内存泄漏,因为 Julia GC 并不“知道”Mat 对象的实际大小,并认为它只是一个指针的大小。您可以通过在循环中插入 GC.gc() 强制 GC 运行来使此代码以类似于 Python 的方式工作,但这并不能解决核心问题,即 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 为这个问题创建了一个跟踪器

关于opencv - 如何修复图像捕获中的 Julia OpenCV Cxx 内存泄漏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64978891/

相关文章:

c++ - 如何对 Mat 的单个坐标使用 warpPerspective

c - C 程序中的内存损坏/双重释放问题

javascript - DOM 节点未被垃圾回收

jupyter-notebook - 有没有办法抑制 Julia Jupyter 笔记本中函数内部的输出?

python - 您如何像 Mathematica 那样执行这种不正确的积分?

c++ - 键入对 `cv::fastFree(void*)' 的 undefined reference

c++ - 在 iPhone 应用程序中从 C++ 调用 Objective-C 函数

安卓 OpenCV : How to slow down camera capture frame rate (purposefully)

c++ - 删除未引用的动态内存

julia - 相当于 Julia 中 Python 的 'with'?