我正在编写一个程序(python,opencv),我在其中使用它spacebar来转到下一帧,然后Esc退出程序.这是我工作的唯一两把钥匙.我试图找出更多的密钥,尝试了各种代码,但没有工作.特别是箭头键.
我发现这个约waitkey,但它不工作.
所以我的问题是,我如何捕获其他键esc并spacebar在我的python-opencv程序中触发某些功能?
Abi*_*n K 76
你可以ord()在Python中使用函数.
例如,如果要触发"a"键按,请执行以下操作:
if cv2.waitKey(33) == ord('a'):
print "pressed a"
Run Code Online (Sandbox Code Playgroud)
请在此处查看示例代码:绘制直方图
更新:
要查找任何键的键值,请使用简单脚本打印键值,如下所示:
import cv2
img = cv2.imread('sof.jpg') # load a dummy image
while(1):
cv2.imshow('img',img)
k = cv2.waitKey(33)
if k==27: # Esc key to stop
break
elif k==-1: # normally -1 returned,so don't print it
continue
else:
print k # else print its value
Run Code Online (Sandbox Code Playgroud)
使用此代码,我得到以下值:
Upkey : 2490368
DownKey : 2621440
LeftKey : 2424832
RightKey: 2555904
Space : 32
Delete : 3014656
...... # Continue yourself :)
Run Code Online (Sandbox Code Playgroud)
Tom*_*dor 17
由waitKey似乎平台依赖返回的密钥代码.但是,它可能是非常有教育意义的,看看键返回什么(顺便说一句,在我的平台上,Esc不返回27 ...)
阿比德的答案清单中的整数对于人类的思想来说是无用的(除非你是神童......).但是,如果您以十六进制检查它们,或者查看最低有效字节,您可能会注意到模式......
我检查返回值的脚本waitKey如下:
#!/usr/bin/env python
import cv2
import sys
cv2.imshow(sys.argv[1], cv2.imread(sys.argv[1]))
res = cv2.waitKey(0)
print('You pressed %d (0x%x), LSB: %d (%s)' % (res, res, res % 256,
repr(chr(res%256)) if res%256 < 128 else '?'))
Run Code Online (Sandbox Code Playgroud)
您可以将其用作最小的命令行图像查看器.
一些结果,我得到了:
q信:
你按了1048689(0x100071),LSB:113('q')
转义键(传统上,ASCII 27):
你按了1048603(0x10001b),LSB:27('\ x1b')
空间:
你按了1048608(0x100020),LSB:32('')
这个列表可以继续,但是当你得到"奇怪的"结果时,你会看到要走的路.
顺便说一句,如果你想把它放在循环中,你可以waitKey(0)(永远等待),而不是忽略-1返回值.
And*_* C. 13
已经发布的答案表明,获得的一些不寻常值waitKey是由于平台差异造成的.下面,我建议(至少在某些平台上)显然奇怪的行为waitKey是由于键盘修饰符.这篇文章看起来类似于Tomasz的答案,因为我最初将其写为编辑,但被拒绝了.
waitKey根据启用的修饰符,更改返回的键代码.NumLock,CapsLock以及Shift,Ctrl和Alt键都waitKey通过启用两个最低有效字节之上的某些位来修改返回的键码.这些标志中最小的是Shift为0x10000.
Tomasz脚本的修改版本如下:
#!/usr/bin/env python
import cv2
import sys
cv2.imshow(sys.argv[1], cv2.imread(sys.argv[1]))
res = cv2.waitKey(0)
print 'You pressed %d (0x%x), 2LSB: %d (%s)' % (res, res, res % 2**16,
repr(chr(res%256)) if res%256 < 128 else '?')
Run Code Online (Sandbox Code Playgroud)
这给出了以下结果:
q与NumLock的信:
你按了1048689(0x100071),2LSB:113('q')
使用CapsLock但不使用NumLock转义密钥:
你按了131099(0x2001b),2LSB:27('\ x1b')
Shift和NumLock的空间:
你按了1114144(0x110020),2LSB:32('')
右箭头键控制,NumLock关闭:
你按了327507(0x4ff53),2LSB:65363('S')
waitKey无论NumLock和CapLock的状态如何,我希望这有助于解释不寻常的行为以及如何获得实际的按键.从这里开始做以下事情相对简单:
ctrlPressed = 0 != res & (1 << 18)
Run Code Online (Sandbox Code Playgroud)
...因为"控制键"标志位为19.移位位于第17位,CapsLock位于第18位,Alt位于第20位,NumLock位于第21位.
对我来说,下面的代码不起作用,当它运行时,图像将快速跳到下一个而不需要按下:
import cv2
img = cv2.imread('sof.jpg') # load a dummy image
while(1):
cv2.imshow('img',img)
k = cv2.waitKey(33)
if k==27: # Esc key to stop
break
elif k==-1: # normally -1 returned,so don't print it
continue
else:
print k # else print its value
Run Code Online (Sandbox Code Playgroud)
但这有效:
def test_wait_key():
lst_img_path = [
'/home/xy/yy_face_head/face_det_test/111.png',
'/home/xy/yy_face_head/face_det_test/222.png'
#.....more path ...
]
for f_path in lst_img_path:
img = cv2.imread(f_path)
cv2.imshow('tmp', img)
c = cv2.waitKey(0) % 256
if c == ord('a'):
print "pressed a"
else:
print 'you press %s' % chr(c)
Run Code Online (Sandbox Code Playgroud)
输出如下:
有趣的是,没有人提到另一个堆栈溢出线程的答案cv2.waitKeyEx()中所描述的。OpenCV的文档如下:cv2.waitKeyEx()
与 waitKey 类似,但返回完整的密钥代码。
笔记
关键代码是特定于实现的,并且取决于所使用的后端:QT/GTK/Win32/等
因此,跨平台实现可能需要一些注意。然而,对我来说,这是迄今为止让箭头键等在 Windows 上工作的最简单、最直接的解决方案。
| 归档时间: |
|
| 查看次数: |
169531 次 |
| 最近记录: |