我有一个芹菜任务,它每60秒运行一次,抓取一个网络摄像头,从中获取一张静止照片,然后将其写入文件,以便服务器稍后可以在网页上提供它。通过python中的cv2库使用opencv。
它看起来像这样:
@app.task # a task to get and save a webcam image
def getWebCamImage()
logger.debug("capturing image attempt")
c = cv2.VideoCapture(0) #returns a videocapture object
flag, frame = c.read() #grabs and decodes the next frame
cv2.imwrite('file/loc/img.jpg, frame) #writes the frame to a file
logger.debug('saved image...hopefully')
c.release() #releases the videocapture object
return 0
最初几分钟一切都很顺利,但随后它就会吐出正常的错误,比如无法获得网络摄像头属性,然后就停止了。而且再也不会发生了!
...DEBUG/BEAT] celerytest.getwebcamimage[process]:capturing image attempt
VIDOC_QUERYMENU:Invalid argument
VIDOC_QUERYMENU:Invalid argument
VIDOC_QUERYMENU:Invalid argument
这正是它工作时的样子,只是它继续工作。知道什么能阻止它吗?我在raspperry pi上运行它,其中240Mb专用于arm核心,16 mb专用于图形。
我所做的事情来尝试修复它:
$sudo sysctl vm.overvommit_memory=1
所以它不会抛出内存。配置错误$sudo rmmod ucvideo$sudo modprobe ucvideo nodrop=1 timeout=5000 quirks=0x80所以司机对摄像头更有耐心。我已经尝试了几个摄像头,所以这可能不是问题。
请帮助任何建议或测试你能想到的。这是一个棘手的问题,因为它在上,是/cellery叉。我要试着用guvcview运行一个脚本,但我觉得py/opencv选项更干净,因为它更容易安装,无论哪种方式,我想知道为什么这不起作用!
新闻:DMESG显示一个芹菜进程因为内存不足而被杀死。有办法解决这个问题吗?在任务中创建的对象是如何销毁的?
这被证明与芹菜无关,而与cv有关。
如果每次CV2。释放了视频捕获对象,没有删除,所以内存仍然保留。在圆周率派上,内存很少,这很快就占用了所有的内存并被杀死了。我用linux中的top命令调查了内存使用情况。
这种情况发生在较大的计算机上,但在pi上症状更严重。