我有一个芹菜任务,每隔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 timeout = 5000 quirks = 0x80 所以驾驶员对凸轮更耐心。我试过几个凸轮,所以这可能不是问题。
请帮助您提出您想到的任何建议或测试。这是一个棘手的问题,因为它是:在pi上,并且是pi / cellery十字架。我将尝试使用guvcview运行脚本,但我觉得py / opencv选项更干净,因为它更容易安装,无论哪种方式我想知道为什么这不起作用!
新闻:
DMESG透露,芹菜过程因为内存不足而被杀死。有任何解决这个问题的方法吗?如果有的话,如何在被破坏的任务中创建对象?
答案 0 :(得分:0)
这与Celery无关,与cv。
有关如果每次释放CV2.videocapture对象时,它都没有被删除,因此内存仍然被保留。在内存非常少的pi上,这很快占用了所有内存而被杀死了。我用linux中的top命令调查了内存使用情况。
它发生在较大的计算机上,但是pi的症状更严重。