OpenCV waitKey () и waitKeyEx () не могут обнаружить клавиши со стрелками - PullRequest
1 голос
/ 10 апреля 2020

Я пытался использовать функции waitKey () или waitKeyEx (), чтобы обнаружить мои клавиши со стрелками, но он не возвращает «-1». Я знаю, что они возвращают разные значения, и я изменил их соответственно.

Я создал программу с множеством привязок клавиш, начиная от «Alt», «Shift», «Spacebar», «Enter», «Escape», обычных букв и цифр и, наконец, левой и стрелка вправо. В основном, когда я запускаю программу с самого начала, она все прекрасно работает, но если я приостановлю ее (при нажатии клавиши некоторое время l oop ничего не делает) и выполню некоторые другие действия в другом окне (например, в браузере), когда я возобновляю работу программы, все клавиши работают должным образом, за исключением клавиш со стрелками влево и вправо.

Кто-нибудь знает, в чем может быть проблема? Только клавиши со стрелками возвращают «-1» ...

РЕДАКТИРОВАТЬ (добавленный пример)

(работает в Ubuntu 18.04.4 LTS)

import numpy as np
import cv2

# generate random video
video = np.zeros((40,512,512))
for idx, aux in enumerate(video):
    img_ = np.random.randint(255, size=(512,512))
    img = np.asmatrix(img_)
    video[idx,::] = img

# continuous time flag
continuous = True
# loop flag
to_do = True
idx = 0
while to_do:
    img = np.copy(video[idx, ::].astype('uint8'))

    # draw some text
    cv2.putText(img,
                'Something',
                (50, 50),
                cv2.FONT_HERSHEY_DUPLEX,
                0.5,
                (255, 0, 0),
                1)

    cv2.imshow("Window", img)
    # checks if it's by frame or not
    if continuous:
        idx += 1
    else:
        idx = idx

    # check for key press
    k = cv2.waitKeyEx(50)
    print(k)
    # 'SHIFT' -> by frame/continuos
    if k == 65506:
        if continuous:
            continuous = False
        else:
            continuous = True
    # right arrow key -> next frame
    elif k == 65363:
        idx += 1
    # left arrow key -> previous frame
    elif k == 65361:
        idx -= 1
    # 'Alt' -> Pause
    elif k == 65513:
        paused = True
        while paused:
            ka = cv2.waitKeyEx(100)
            if ka == 65513:
                paused = False
        k = None
    # '\' -> exit now
    elif k == 92:
        to_do = False

    if idx == len(video):
        idx = 0
    if idx < 0:
        idx = len(video)-1

cv2.destroyAllWindows()

...