为open的waitKey()函数使用其他键

2024-03-29 13:06:25 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在开发一个程序(python,opencv),在这个程序中,我使用spacebar转到下一帧,并使用Esc退出程序。这是我仅有的两把钥匙。我试着找出更多的钥匙,试过各种密码,但都没用。尤其是箭头键。

我找到了关于waitkeythis,但它不起作用。

所以我的问题是,除了escspacebar之外,如何捕捉其他键来触发python opencv程序中的某些函数?


Tags: 函数程序密码thisopencv钥匙箭头键esc
3条回答

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 '?'))

您可以将其用作最小的命令行图像查看器。

一些结果,我得到了:

  • 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(箭头,HomeEndPageDnPageUp,甚至DelIns)。至少Backspace返回8(但是。。。为什么不Del?)。

因此,对于一个跨平台的用户界面,您可能被限制在WaSD,字母,数字,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()函数。

例如,如果要触发“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 :)

相关问题 更多 >