Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/283.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python OpenCV waitKey()和waitKeyEx()无法检测箭头键_Python_Opencv3.0_Opencv Python - Fatal编程技术网

Python OpenCV waitKey()和waitKeyEx()无法检测箭头键

Python OpenCV waitKey()和waitKeyEx()无法检测箭头键,python,opencv3.0,opencv-python,Python,Opencv3.0,Opencv Python,我尝试使用waitKey()或waitKeyEx()函数来检测我的箭头键,但它无法返回“-1”。 我知道它们返回不同的值,我相应地更改了它们 我已经建立了一个有很多键绑定的程序,从“Alt”、“Shift”、“Spacebar”、“Enter”、“Escape”、普通字母和数字,最后是左右箭头键。 基本上,当我从一开始就运行程序时,一切都很好,但是如果我暂停它(按键时开始一个while循环,什么也不做),并在另一个窗口(例如浏览器)中执行一些其他操作,当我恢复程序时,除左箭头键和右箭头键外,所有

我尝试使用waitKey()或waitKeyEx()函数来检测我的箭头键,但它无法返回“-1”。 我知道它们返回不同的值,我相应地更改了它们

我已经建立了一个有很多键绑定的程序,从“Alt”、“Shift”、“Spacebar”、“Enter”、“Escape”、普通字母和数字,最后是左右箭头键。 基本上,当我从一开始就运行程序时,一切都很好,但是如果我暂停它(按键时开始一个while循环,什么也不做),并在另一个窗口(例如浏览器)中执行一些其他操作,当我恢复程序时,除左箭头键和右箭头键外,所有键都按预期工作

有人知道可能是什么问题吗?只有箭头键返回“-1”

编辑(添加示例)

(在Ubuntu 18.04.4 LTS上运行)

将numpy导入为np
进口cv2
#生成随机视频
视频=np.零((40512512))
对于idx,辅助输入枚举(视频):
img_uux=np.random.randint(255,大小=(512512))
img=np.asmatrix(img_ux)
视频[idx,:]=img
#连续时间标志
连续=真
#循环标志
to_do=正确
idx=0
当你要做的时候:
img=np.copy(video[idx,:].astype('uint8'))
#画一些文字
cv2.putText(img,
“某物”,
(50, 50),
cv2.FONT\U好时双联,
0.5,
(255, 0, 0),
1)
cv2.imshow(“窗口”,img)
#检查是否按帧显示
如果连续:
idx+=1
其他:
idx=idx
#检查有无按键
k=cv2.waitKeyEx(50)
印刷品(k)
#“移位”->按帧/连续
如果k==65506:
如果连续:
连续=假
其他:
连续=真
#右箭头键->下一帧
elif k==65363:
idx+=1
#左箭头键->上一帧
elif k==65361:
idx-=1
#“Alt”->暂停
elif k==65513:
暂停=真
暂停时:
ka=cv2.waitKeyEx(100)
如果ka==65513:
暂停=错误
k=无
#“\”->立即退出
elif k==92:
to_do=False
如果idx==len(视频):
idx=0
如果idx<0:
idx=镜头(视频)-1
cv2.destroyAllWindows()

你能展示一个以便测试吗?@MarcoBonelli添加了一个工作示例,谢谢。作为提高可读性而不是十进制代码的一般建议,你可以使用
elif k==ord('p'):
ord()
是一个内置函数,它为一个字符串返回Unicode代码点。右箭头
ord(“→")@BjörnB这是完全错误的。
是一个unicode字符,与
waitKeyEx()
返回的代码无关。如果使用类C常量(例如
ARROW\u KEY\u RIGHT=65363
)是最好的选择。对不起,你是对的!你能展示一个这样就可以测试它吗?@MarcoBonelli添加了工作示例,谢谢。作为提高可读性而不是十进制代码的一般建议,你可以使用
elif k==ord('p'):
ord()
是一个内置函数,返回一个字符串的Unicode代码点。右箭头
ord(“→)这是完全错误的→
是一个unicode字符,与
waitKeyEx()
返回的代码无关。如果可读性是一个问题,那么使用类C常量(例如
ARROW\u KEY\u RIGHT=65363
)是最好的选择。很抱歉,你是对的!
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()