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