【发布时间】:2014-03-24 13:58:56
【问题描述】:
我有一个 celery 任务,它每 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
这正是它工作时的样子,只是它一直在运行。有什么想法可以阻止它吗?我在 rasperry pi 上运行它,240Mb 专用于 arm 核心,16 用于图形。
我为尝试修复它所做的事情:
$sudo sysctl vm.overvommit_memory=1
所以它不会抛出内存。分配错误 $sudo rmmod ucvideo $sudo modprobe ucvideo nodrop=1 超时=5000 怪癖=0x80 所以司机对凸轮更有耐心。我已经尝试了几个摄像头,所以这可能不是问题。
请帮助您提出任何建议或测试。这是一个棘手的问题,因为它是:在 pi 上,并且是 pi/cellery 十字架。我将尝试仅使用 guvcview 运行脚本,但我觉得 py/opencv 选项更干净,因为它更易于安装,无论哪种方式我都想知道为什么这不起作用!
新闻:
DMESG 显示 celery 进程因为内存不足而被杀死。有任何解决这个问题的方法吗?如果有的话,任务中创建的对象是如何被销毁的?
【问题讨论】:
标签: python opencv raspberry-pi celery webcam