如何在后台调度程序运行时阻止程序崩溃?

时间:2019-05-16 03:53:09

标签: python opencv apscheduler

我正在使用opencv绘制一张脸,然后在按下键时绘制另一张脸(“ s”表示惊讶的脸,“ d”表示悲伤的脸,“ a”表示生气,等等)。我想让我的脸模拟眨眼,所以我正在使用后台调度程序每五秒钟运行一次眨眼功能。闪烁功能是Blink类的一部分,该类知道当前的面孔,因此当它“闪烁”时,它将重新绘制正确的面孔。但是,每次切换面孔时,程序都会崩溃,并且我必须强制退出python。直到我切换脸部为止,闪烁均正常。

我尝试在重新绘制新外观之前暂停调度程序,然后在重新绘制之后恢复它,但这没有什么区别。它仍然崩溃,我不知道还有什么尝试。该程序可以很好地切换人脸。仅当我添加后台调度程序并闪烁时,它才会崩溃。

import numpy as np 
import cv2 as cv
from drawCopy import*
import random
from apscheduler.schedulers.background import BackgroundScheduler
import logging

class Blink:
    def __init__(self,currentFace,img,scheduler):
        self.currentFace = currentFace
        self.img = img
        self.scheduler = scheduler

    def blink(self):
        self.img[:] = backgroundColor
        blinkDict[self.currentFace](self.img)

    def addJob(self):
        self.blinkJob = self.scheduler.add_job(self.blink, 'interval', seconds=(random.uniform(3.0,5.0)),max_instances=2)

    def startSched(self):
        self.scheduler.start()

    def updateCurrentFace(self,newFace,newImg):
        self.currentFace = newFace
        self.img = newImg

blinkDict = {'n': blinkNeutral, 's': blinkSurprised, 'd': blinkSad, 'a': blinkAngry, 'h': blinkHappy}

logging.basicConfig()

img = np.zeros((600,1024,3), np.uint8)
img[:] = backgroundColor
cv.imshow('Face',img)

currentFace = cv.waitKey()
img = drawFace(img,chr(currentFace))
cv.imshow('Face',img)

scheduler = BackgroundScheduler()
blinkObj = Blink(chr(currentFace),img,scheduler)
blinkObj.addJob()
blinkObj.startSched()

#The code runs fine until here and then crashes when the next key is pressed

currentFace = cv.waitKey()
if currentFace == 27:
    cv.destroyAllWindows()
else:
    img[:] = backgroundColor
    img = drawFace(img,chr(currentFace))

    blinkObj.updateCurrentFace(chr(currentFace),img)

    cv.imshow('Face',img)
    cv.waitKey(0)

cv.destroyAllWindows()

1 个答案:

答案 0 :(得分:0)

我在Linux机器上运行了相同的代码(以前已经在Macbook pro上运行过该代码),并且运行良好。我仍然不知道为什么它崩溃了,但是它似乎是Mac或Macbook特有的问题。