我正在使用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()
答案 0 :(得分:0)
我在Linux机器上运行了相同的代码(以前已经在Macbook pro上运行过该代码),并且运行良好。我仍然不知道为什么它崩溃了,但是它似乎是Mac或Macbook特有的问题。