Как остановить сбой программы во время работы фонового планировщика? - PullRequest
0 голосов
/ 16 мая 2019

Я рисую лицо, используя 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 голосов
/ 22 мая 2019

Я запустил тот же код на компьютере с Linux (ранее запускал его на MacBook Pro), и он работал просто отлично. Я до сих пор не знаю, почему происходит сбой, но, похоже, это проблема Mac или Macbook.

...