2024-05-23 14:38:59 发布
网友
我正在开发一个程序(python,opencv),在这个程序中,我使用spacebar转到下一帧,并使用Esc退出程序。这是我仅有的两把钥匙。我试着找出更多的钥匙,试过各种密码,但都没用。尤其是箭头键。
spacebar
Esc
我找到了关于waitkey的this,但它不起作用。
waitkey
所以我的问题是,除了esc和spacebar之外,如何捕捉其他键来触发python opencv程序中的某些函数?
esc
由waitKey返回的键代码似乎依赖于平台。 然而,看看钥匙会有什么回报,这可能是很有教育意义的 (顺便说一下,在我的平台上,Esc不会返回27…)
waitKey
塞阿比德的答案列表中的整数对人类的大脑来说是毫无用处的 (除非你是个天才学者…)。但是,如果你用十六进制检查它们, 或者看看最低有效字节,您可能会注意到模式。。。
我检查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 '?'))
您可以将其用作最小的命令行图像查看器。
一些结果,我得到了:
q字母:
您按了1048689(0x100071),LSB:113('q')
转义键(传统上,ASCII 27):
您按了1048603(0x10001b),LSB:27('\x1b')
空间:
您按了1048608(0x100020),LSB:32('')
当你得到“奇怪”的结果时,不管你怎么看,这个列表都会继续。
顺便说一句,如果你想把它放在一个循环中,你只需要waitKey(0)(永远等待),而不是忽略-1返回值。
waitKey(0)
-1
编辑(EDIT):这些高比特数远远超出了人们的视线-请参阅安德鲁C的答案(提示:这与所有“锁”之类的键盘修饰符有关,例如NumLock)。
然而,我最近的经验表明,有一种平台依赖性——例如,Windows上Python 3.6上Anaconda的OpenCV 4.1.0不会产生这些位,对于某些(重要的)键是从waitKey()返回0(箭头,Home,End,PageDn,PageUp,甚至Del和Ins)。至少Backspace返回8(但是。。。为什么不Del?)。
waitKey()
0
8
因此,对于一个跨平台的用户界面,您可能被限制在W,a,S,D,字母,数字,Esc,空格和退格;)
已经发布的答案表明,waitKey获得的一些异常值是由于平台差异造成的。在下面,我建议(至少在某些平台上)明显奇怪的waitKey行为是由键盘修饰符引起的。这篇文章看起来和Tomasz的回答很相似,因为我最初是作为一个编辑来写的,但被拒绝了。
由waitKey返回的键代码根据启用的修饰符而变化。NumLock、CapsLock和Shift、Ctrl和Alt键都通过启用两个最低有效字节以上的某些位来修改由waitKey返回的键代码。这些标志中最小的一个在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 '?')
结果如下:
带数字锁的q字母:
您按了1048689(0x100071),2LSB:113('q')
带CapsLock但不带NumLock的逃生钥匙:
您按了131099(0x2001b),2LSB:27('\x1b')
带移位和数字锁的空格:
您按了1114144(0x110020),2LSB:32('')
带控制的右箭头键,NumLock关闭:
您按了327507(0x4ff53),2LSB:65363('S')
我希望这有助于解释waitKey的异常行为,以及如何在不考虑NumLock和CapLock状态的情况下按下实际的键。从这里开始,做以下事情相对简单:
ctrlPressed = 0 != res & (1 << 18)
…因为“控制键”标志是位19。移位在第17位,CapsLock的状态在第18位,Alt在第20位,NumLock在第21位。
您可以在Python中使用ord()函数。
ord()
例如,如果要触发“a”键按下,请执行以下操作:
if cv2.waitKey(33) == ord('a'): print "pressed a"
请参阅此处的示例代码:Drawing Histogram
更新:
要查找任何键的键值,请使用以下简单脚本打印键值:
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
通过这个代码,我得到了以下值:
Upkey : 2490368 DownKey : 2621440 LeftKey : 2424832 RightKey: 2555904 Space : 32 Delete : 3014656 ...... # Continue yourself :)
由
waitKey
返回的键代码似乎依赖于平台。 然而,看看钥匙会有什么回报,这可能是很有教育意义的 (顺便说一下,在我的平台上,Esc不会返回27…)塞阿比德的答案列表中的整数对人类的大脑来说是毫无用处的 (除非你是个天才学者…)。但是,如果你用十六进制检查它们, 或者看看最低有效字节,您可能会注意到模式。。。
我检查
waitKey
返回值的脚本如下:您可以将其用作最小的命令行图像查看器。
一些结果,我得到了:
q字母:
您按了1048689(0x100071),LSB:113('q')
转义键(传统上,ASCII 27):
您按了1048603(0x10001b),LSB:27('\x1b')
空间:
您按了1048608(0x100020),LSB:32('')
当你得到“奇怪”的结果时,不管你怎么看,这个列表都会继续。
顺便说一句,如果你想把它放在一个循环中,你只需要
waitKey(0)
(永远等待),而不是忽略-1
返回值。编辑(EDIT):这些高比特数远远超出了人们的视线-请参阅安德鲁C的答案(提示:这与所有“锁”之类的键盘修饰符有关,例如NumLock)。
然而,我最近的经验表明,有一种平台依赖性——例如,Windows上Python 3.6上Anaconda的OpenCV 4.1.0不会产生这些位,对于某些(重要的)键是从
waitKey()
返回0
(箭头,Home,End,PageDn,PageUp,甚至Del和Ins)。至少Backspace返回8
(但是。。。为什么不Del?)。因此,对于一个跨平台的用户界面,您可能被限制在W,a,S,D,字母,数字,Esc,空格和退格;)
已经发布的答案表明,
waitKey
获得的一些异常值是由于平台差异造成的。在下面,我建议(至少在某些平台上)明显奇怪的waitKey
行为是由键盘修饰符引起的。这篇文章看起来和Tomasz的回答很相似,因为我最初是作为一个编辑来写的,但被拒绝了。由
waitKey
返回的键代码根据启用的修饰符而变化。NumLock、CapsLock和Shift、Ctrl和Alt键都通过启用两个最低有效字节以上的某些位来修改由waitKey
返回的键代码。这些标志中最小的一个在0x10000处移动。Tomasz发布的脚本的修改版本如下:
结果如下:
带数字锁的q字母:
您按了1048689(0x100071),2LSB:113('q')
带CapsLock但不带NumLock的逃生钥匙:
您按了131099(0x2001b),2LSB:27('\x1b')
带移位和数字锁的空格:
您按了1114144(0x110020),2LSB:32('')
带控制的右箭头键,NumLock关闭:
您按了327507(0x4ff53),2LSB:65363('S')
我希望这有助于解释
waitKey
的异常行为,以及如何在不考虑NumLock和CapLock状态的情况下按下实际的键。从这里开始,做以下事情相对简单:…因为“控制键”标志是位19。移位在第17位,CapsLock的状态在第18位,Alt在第20位,NumLock在第21位。
您可以在Python中使用
ord()
函数。例如,如果要触发“a”键按下,请执行以下操作:
请参阅此处的示例代码:Drawing Histogram
更新:
要查找任何键的键值,请使用以下简单脚本打印键值:
通过这个代码,我得到了以下值:
相关问题 更多 >
编程相关推荐