几次节拍后芹菜击败任务停止失败(opencv)

时间:2014-03-24 13:58:56

标签: python opencv raspberry-pi celery webcam

我有一个芹菜任务,每隔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透露,芹菜过程因为内存不足而被杀死。有任何解决这个问题的方法吗?如果有的话,如何在被破坏的任务中创建对象?

1 个答案:

答案 0 :(得分:0)

这与Celery无关,与cv。

有关

如果每次释放CV2.videocapture对象时,它都没有被删除,因此内存仍然被保留。在内存非常少的pi上,这很快占用了所有内存而被杀死了。我用linux中的top命令调查了内存使用情况。

它发生在较大的计算机上,但是pi的症状更严重。