Есть ли лучший способ перехватить ключ, Cttl-c и убить в поточной программе Python OpenCV? - PullRequest
0 голосов
/ 15 декабря 2018

У меня есть программы на 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.")

1 Ответ

0 голосов
/ 17 декабря 2018

Похоже, это работает хорошо.Для команды kill она работает без опции -9.

...