Я рисую лицо, используя 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()