У меня есть программы на Python 3.7 и OpenCV 3, работающие на Windows 10 и Raspberry Pi.Программа имеет три темы.Первый поток - это основной цикл, второй поток - камера, а третий - запись видео и изображений.Я искал много ссылок и соединил, что я думаю, способ поймать правильные сигналы «стоп» клавиатуры.Я проверил на win10 и RPI, используя пакеты потоков, и это, кажется, работает.Мне интересно, есть ли более уместный способ обработки ввода с клавиатуры?Мне пришлось поместить обработчик клавиатуры в main , так как я не смог поймать его в цикле wile.Следующий пример не показывает многопоточность, но в моей более крупной программе это также сработало.
import signal
import cv2
class main():
def __init__(self):
self.stop_by_signal = False
return
def signal_term_handler(self,signal, frame):
self.stop_by_signal = True
return
def run(self):
signal.signal(signal.SIGTERM, self.signal_term_handler)
self.cap = cv2.VideoCapture(0)
print("starting")
while True:
# read cameras and display
ret, frame = self.cap.read()
if not ret: break
cv2.imshow('frame',frame)
# look for kill, ctl-c or cv2.waitkey to stop
if self.stop_by_signal == True:
print("main: stopping loop via kill")
break
key = cv2.waitKey(1) & 0xFF
if key == ord('q') or key == 27:
print("main: cv2 esc or q entered to stop")
break
elif key != 255:
print('key: %s' % [chr(key)])
self.cap.release()
cv2.destroyAllWindows()
if __name__ == '__main__':
try:
main = main()
main.run()
except KeyboardInterrupt:
main.cap.release()
print("__main:__ ctl-c entered to stop.")