opencv - 如何修复图像捕获中的 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()
解决方案
该代码导致内存泄漏,因为 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为这个问题创建了一个跟踪器
推荐阅读
- php - 尽管使用了 try/catch 块,为什么 PHP 会抛出致命错误并破坏 HTTP 500?
- postgresql - 使用 Springboot/JPA 的外键实体关系
- java - 将 openssl 摘要签名语句转换为 Java 代码
- c# - 在 CodeObjectCreateExpression 中分配对象的属性值
- mysql - 如何以无序的方式比较 SQL 查询中的字段(可能是数组)?
- php - Laravel - 格式错误的 UTF-8 字符,可能编码不正确
- registry - 如何使用注册表项隐藏自定义驱动器?
- c# - 在 WPF 应用程序中运行的多个 Exes
- sql - 如果查询返回空行我需要将其作为零值,如何在 Sql 中检查它?
- javascript - 如何按字母顺序按属性值对返回的累加器进行排序?- Javascript