我制作了一个神经网络(不幸的是,它变得越来越复杂,变得非常耗费CPU),可以实时分析屏幕截图。
我希望在按下字母“a”时暂停它,并在再次按下字母“a”时取消暂停。暂停它的最有效方法是什么(不完全打破循环)?
它使用Python OpenCV库,但我不使用cv2.imshow,因此我不能使用cv2.Waitkey。我在Windows 10上运行此功能。您能否为您的答案提供示例代码?这是一些代码:
import cv2
import mss
from PIL import Image
import numpy as np
#Creates an endless loop for high-speed image acquisition...
while (True):
with mss.mss() as sct:
# Get raw pixels from the screen
sct_img = sct.grab(sct.monitors[1])
# Create the Image
img = Image.frombytes('RGB', sct_img.size, sct_img.bgra, 'raw', 'BGRX')
#The rest of the neural network goes here...
#PAUSE statement...
答案 0 :(得分:2)
使用Python标准库中signal
package的sigwait
。 sigwait
无法在Windows上运行。
您可以使用threading
library以独立于平台的方式执行您想要的操作。这是一个简短的示例程序(如果您在Linux或Mac上运行,则需要py-getch
包):
import os
from threading import Thread, Event
if os.name=='nt':
from msvcrt import getch
elif os.name=='posix':
from getch import getch
else:
raise OSError
isRunning = True
def count(event):
i = 0
while isRunning:
event.wait(1)
if event.isSet() and isRunning:
event.clear()
print('Pausing count at %d' % i)
event.wait()
print('resuming count')
event.clear()
i += 1
def listener(event):
# in Python, need to mark globals if writing to them
global isRunning
while isRunning:
c = getch()
if c=='a':
event.set()
if c=='e':
event.set()
isRunning = False
def main():
pauseEvent = Event()
pauseEvent.clear()
listenerThread = Thread(target=listener, args=(pauseEvent,))
listenerThread.start()
count(pauseEvent)
if __name__=='__main__':
main()
上面的程序将运行两个线程。主线程将运行count
函数,每秒向计数加1。另一个线程运行listener
函数,它将等待用户输入。如果键入a
,listener
线程将告诉count
线程暂停并打印出当前计数。您可以再次输入a
以恢复计数,也可以输入e
退出。