Читать нажатие клавиш в нескольких потоках и выполнять функцию - PullRequest
1 голос
/ 19 января 2020

У меня есть скрипт, который просматривает 4 USB-камеры на отдельных вкладках и делает снимок при нажатии клавиши пробела. Однако при нажатии клавиши пробела в конкретном окне предварительного просмотра c он делает снимок этого и только этого предварительного просмотра. Точно так же нажатие es c закрывает окно, на котором я сосредоточен, но я должен сделать это для каждого окна предварительного просмотра камеры, чтобы выйти из сценария. Есть ли способ, чтобы события выхода и захвата событий происходили одним и тем же нажатием клавиши? Или это невозможно с многопоточностью?

import cv2
import threading

class camThread(threading.Thread):
    def __init__(self, previewName, camID):
        threading.Thread.__init__(self)
        self.previewName = previewName
        self.camID = camID

    def run(self):
        print("Starting " + self.previewName)
        camPreview(self.previewName, self.camID)

def camPreview(previewName, camID):
    cv2.namedWindow(previewName)
    cam = cv2.VideoCapture(camID)
    if cam.isOpened():
        rval, frame = cam.read()
    else:
        rval = False

    while rval:
        cv2.imshow(previewName, frame)
        rval, frame = cam.read()
        key = cv2.waitKey(20)
        if key == 27:  # exit on ESC
            break
        key = cv2.waitKey(20)
        if key == 32:
            img_name = "opencv_frame_{}.png".format(camID)
            cv2.imwrite(img_name, frame)
            print("{} written!".format(img_name))
    cv2.destroyWindow(previewName)

# Create threads as follows

thread1 = camThread("Camera 1", 0)
thread2 = camThread("Camera 2", 1)
thread3 = camThread("Camera 3", 2)
thread4 = camThread("Camera 4", 3)
thread1.start()
thread2.start()
thread3.start()
thread4.start()
print()
print("Active threads", threading.activeCount())
...