使用opencv的waitKey()函数的其他键

md1*_*nox 46 python opencv

我正在编写一个程序(python,opencv),我在其中使用它spacebar来转到下一帧,然后Esc退出程序.这是我工作的唯一两把钥匙.我试图找出更多的密钥,尝试了各种代码,但没有工作.特别是箭头键.

我发现这个waitkey,但它不工作.

所以我的问题是,我如何捕获其他键escspacebar在我的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)

  • 在OSX上,Upkey = 63232,Downkey = 63233,Leftkey = 63234,Rightkey = 63235 (6认同)

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返回值.

  • 平台依赖似乎是有符号/无符号整数问题.它应该使用按位运算轻松解决,例如`res = cv2.waitkey()&0xEFFFFF`. (4认同)

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位.

  • 哇,原来是关于修饰符...很好,我几乎从不关闭 NumLock。旁注:有时从 0 开始计算位更方便 - 即 Shift 位于第 16 位(并且掩码是“(1 &lt;&lt; 16)”。另外 - 只需按下 Shift 也会返回一个值 - LShift 是“0xffe1”和 RShift `0xffe2`。修饰符也适用于那里。 (2认同)

Jay*_*llo 6

对我来说,下面的代码不起作用,当它运行时,图像将快速跳到下一个而不需要按下:

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)

输出如下:

在此输入图像描述


ToJ*_*oJo 6

有趣的是,没有人提到另一个堆栈溢出线程的答案cv2.waitKeyEx()中所描述的。OpenCV的文档如下:cv2.waitKeyEx()

与 waitKey 类似,但返回完整的密钥代码。

笔记

关键代码是特定于实现的,并且取决于所使用的后端:QT/GTK/Win32/等

因此,跨平台实现可能需要一些注意。然而,对我来说,这是迄今为止让箭头键等在 Windows 上工作的最简单、最直接的解决方案。

  • 这是一个非常有帮助的贡献!检查 OpenCV 提交历史记录,从 2016 年开始,在 [this commit](https://github.com/opencv/opencv/commit/4e7b5214387e74b8df1c847d64b68e4bb3876d91) 中引入了 waitKeyEx() ,这是在我留下最初的评论之后。有趣的是,相同的提交修补了原始的“waitKey()”函数,以便它始终被屏蔽为“code &amp; 0xff”,这与我自己的答案中的“res % 2**16”具有相同的效果。这并不奇怪,但非常有帮助,因为它阐明了完整的键码取决于后端,这为我们指明了去哪里获取更多信息! (2认同)